Machineboy空

4659 : 비밀번호 발음하기 - 플래그 본문

Computer/Coding Test

4659 : 비밀번호 발음하기 - 플래그

안녕도라 2024. 2. 15. 12:13

https://www.acmicpc.net/problem/4659

 

4659번: 비밀번호 발음하기

좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtp

www.acmicpc.net


문제요약

비밀번호가 조건에 맞는지 판단하기

 

난이도

Silver 5


풀이 포인트

  • 플래그 적절히 사용

REVIEW

 

우선 이런 문제는 체력으로 풀 수 있기에 맞췄다.

하지만 모범 답안과 달리 조건 마다 플래그를 달아 반복문을 탈출하는 형식으로 짰다.

그리고 자음, 모음이 3번 연속되는지를 판단하는 코드도 앞선 두개를 비교하는 식으로 3덩어리씩 비교했다.

 

이제 모범 답안에서 배울 것.

  • good인지 bad인지 플래그 하나로 처리하여 가장 하단에서 결과 출력.
  • 연속되는 것 카운트도 이전과 현재를 비교하는 식으로만 구현.
    • 모음이라면 모음 카운트 ++, 자음 연결은 끊어지니까 0
    • 자음이라면 자음 카운트++, 모음 연결은 끊어지니까 0;

사실 연속카운트 요렇게 구성했다가 연결 끊어짐을 0으로 갱신 안하고 --로 해서 틀렸던 것 같음.

 

조건식을 최대한 간결하게 그리고 반복을 최대한 적게 설계하는 것 고민하기.

 


CODE

#include <bits/stdc++.h>
using namespace std;
string s;
int lcnt, vcnt;
bool isVowel(int idx)
{
    return (idx == 'a' || idx == 'e' || idx == 'i' || idx == 'o' || idx == 'u');
}
int main()
{
    while (true)
    {
        cin >> s;
        if (s == "end")
            break;
        lcnt = vcnt = 0;
        bool flag = 0;
        bool is_include_v = 0;
        int prev = -1;
        for (int i = 0; i < s.size(); i++)
        {
            int idx = s[i];
            if (isVowel(idx))
                lcnt++, vcnt = 0, is_include_v = 1;
            else
                vcnt++, lcnt = 0;
            if (vcnt == 3 || lcnt == 3)
                flag = 1;
            if (i >= 1 && (prev == idx) && (idx != 'e' && idx != 'o'))
            {
                flag = 1;
            }
            prev = idx;
        }
        if (is_include_v == 0)
            flag = 1;
        if (flag)
            cout << "<" << s << ">"
                 << " is not acceptable.\n";
        else
            cout << "<" << s << ">"
                 << " is acceptable.\n";
    }
    return 0;
}