[C++] 백준 4659번 풀이 (비밀번호 발음하기)

문제

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

입력 및 출력

풀이

변수, 함수 선언 및 초기화

  • 해당 문제는 3가지 조건을 모두 통과하면 “acceptable”, 통과하지 못한다면 “not acceptable” 문자열을 출력하도록 해야 한다.
  • 모음과 자음의 개수에 따라 주어진 조건을 적절하게 판별해 내는 것이 중요한 문제이다.
string s; // 입력받을 테스트 문자열
int lcnt, vcnt // 연속한 모음, 자음의 개수를 저장하는 변수

bool isVowel(int idx){
    return (idx == 'a' || idx == 'e' || idx == 'i' || idx == 'o' || idx == 'u');
} // 입력된 문자가 모음인지 확인하는 함수
  • 테스트 케이스는 기저조건을 만족할 때 까지 반복한다.
  • 기저조건을 정의한다. (입력받은 문자열이 “end” 인 경우 종료해야 한다.)
  • 기저조건 이후 필요한 각 변수를 초기화 한다.
lcnt = vcnt = 0; // 각 테스트 케이스마다 모음, 자음의 개수는 0으로 초기화
bool flag = 0; // 최종적으로 조건을 만족하는지 체크
bool is_include_v = 0; // 모음이 하나 이상 포함되어 있는지 체크
int prev = -1; // 이전 인덱스와 비교하기 위해 필요한 변수
  • 입력받은 테스트 케이스의 모든 문자를 탐색하면서 주어진 조건을 만족하는지 확인한다.

조건 체크하기

  • 테스트 케이스 문자열의 모든 문자를 순회한다.
  • 현재 문자가 모음인지 체크한다.
    • 모음인 경우, 모음의 개수(lcnt)를 1 증가, 자음의 개수(vcnt) = 0, 모음이 하나 이상 포함되어 있으므로 is_include_v = 1;
    • 자음인 경우, 자음의 개수(vcnt)를 1증가, 모음의 개수(lcnt) = 0
  • 모음이나 자음이 3개이상 연속하는지 체크한다.
    • 3개 이상 연속하는 경우 “unacceptable” 하므로 flag = 1;
  • 같은 글자가 연속으로 2번 오는지 체크(단, ee나 oo는 제외)
    • 2번 오는 경우, “unacceptable” 하므로 flag = 1;
// Tip. 이전 인덱스와 비교하는 방법

for(int i=0;i<s.size();i++){
    idx = i; // 현재 인덱스나 상태를 저장
    ... // 여기에 로직을 삽입
    prev = idx; // 이전 노드를 업데이트
}
  • 테스트 케이스 문자열에 모음이 하나도 존재하지 않는 경우, “unacceptable” 하므로 flag = 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;
            }
            // 모음이나 자음이 3개이상 연속하는지 체크
            if (lcnt == 3 || vcnt == 3)
            {
                flag = 1;
            }
            // 같은 글자가 연속으로 2번오는지 체크(단, ee나 oo는 예외)
            if (i >= 1 && (prev == idx) && (idx != 'e' && idx != 'o'))
            {
                flag = 1;
            }
            prev = idx;
        }
        // 모음이 하나도 없는 경우
        if (is_include_v == 0)
        {
            flag = 1;
        }
                ...

결과 출력

  • 해당 문제는 3가지 조건을 모두 통과하면(flag = 0) “acceptable”, 통과하지 못한다면(flag = 1) “not acceptable” 문자열을 출력하도록 한다.
if (flag)
{
    cout << "<" << s << "> is not acceptable." << '\n';
}
else
{
    cout << "<" << s << "> is acceptable." << '\n';
}

전체 코드

#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()
{
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    while (1)
    {
        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;
            }
            // 모음이나 자음이 3개이상 연속하는지 체크
            if (lcnt == 3 || vcnt == 3)
            {
                flag = 1;
            }
            // 같은 글자가 연속으로 2번오는지 체크(단, ee나 oo는 예외)
            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;
}

결과

'백준' 카테고리의 다른 글

[C++] 백준 10709번 풀이 (기상캐스터)  (0) 2024.08.16
[C++] 백준 2870번 풀이 (수학 숙제)  (0) 2024.08.16