2 분 소요



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



🔍 문제 풀이

문자열을 조건에 따라 검사하고, 상태를 추적하여 판단하는 문제

  • 조건 1. 모음 하나를 포함해야함 -> 모음을 포함했는지 체크하는 상태 변수 필요
  • 조건 2. 모음 혹은 자음이 3개 연속으로 오면 안됨
    • 3개 연속으로 왔는지 체크하기 위해 cnt 변수, 상태 변수 필요
  • 조건 3. 같은 글자가 연속적으로 오면 안되나, ee와 oo는 허용한다.
    • 같은 글자가 연속적으로 왔는지 체크하는 상태 변수 필요


배운 점

이번 문제를 통해 문제 조건을 코드로 명확하게 구현하려면,
먼저 어떤 상태 변수를 설정해야 하는지 판단하는 것이 핵심이라는 점을 배웠다.

조건이 많고 복잡할수록 조건을 분리하고 변수로 추적하는 습관이 중요하다


문제 조건을 ‘좋은 조건’과 ‘나쁜 조건’으로 나누기

유형 조건 예시
좋은 조건 “모음이 최소 1개 있어야 함” → hasVowel = true
나쁜 조건 “모음/자음 3개 연속은 안 됨” → isSafe = false
“같은 글자 연속은 안 됨 (ee, oo 예외)” → isSafe = false
boolean hasVowel = false; // 좋은 조건 추적용 변수
boolean isSafe = true;  // 전체 유효성 판별 변수

앞으로 문제 조건을 글로 정리한 뒤, 조건을 좋은 조건 / 나쁜 조건으로 나눠보자.



💻 전체 코드

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            String str = br.readLine();

            if (str.equals("end")) break;

            // 조건 1. 모음 하나를 포함해야함 -> 모음을 포함했는지 체크하는 상태 변수 필요
            // 조건 2. 모음 혹은 자음이 3개 연속으로 오면 안됨
            // -> 3개 연속으로 왔는지 체크하기 위해 cnt 변수, 상태 변수 필요
            // 조건 3. 같은 글자가 연속적으로 오면 안되나, ee와 oo는 허용한다.
            // -> 같은 글자가 연속적으로 왔는지 체크하는 상태 변수 필요

            boolean isVowel = false;
            boolean isSafe = true;
            int vowelCnt = 0;
            int consonantCnt = 0;

            for(int i=0; i<str.length(); i++){
                char ch = str.charAt(i);

                // 조건 1
                if(ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u'){
                    isVowel = true;
                }

                // 조건 2
                if(ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch =='u'){
                    vowelCnt ++;
                    consonantCnt = 0;
                }else{
                    consonantCnt ++;
                    vowelCnt = 0;
                }
                if(vowelCnt >= 3 || consonantCnt >= 3){
                    isSafe = false;
                }

                // 조건 3
                if(i>0 && str.charAt(i-1) == str.charAt(i)){
                    if(!(ch == 'e' || ch == 'o')){
                        isSafe = false;
                    }
                }
            }

            // 출력
            if(!isVowel) isSafe = false;

            if(isSafe){
                System.out.println("<" + str + ">" + " is acceptable.");
            }else{
                System.out.println("<" + str + ">" + " is not acceptable.");
            }

        }
    }
}


카테고리:

업데이트:

댓글남기기