와드의 블로그

4659번: 비밀번호 발음하기 본문

PS/B.O.J

4659번: 비밀번호 발음하기

Ward 2026. 3. 22. 15:01

문제

좋은 패스워드를 만들기 위해 다음 3가지 규칙을 만족하는지 판별하는 프로그램을 작성하는 문제입니다.

  1. 모음(a, e, i, o, u) 하나를 반드시 포함하여야 합니다.
  2. 모음이 3개 혹은 자음이 3개 연속으로 오면 안 됩니다.
  3. 같은 글자가 연속적으로 두 번 오면 안 되나, ee 와 oo는 허용합니다.
  • 입력: 각 줄마다 패스워드로 사용할 문자열이 주어집니다. 마지막 줄에는 "end"가 주어집니다.
  • 출력: 각 패스워드에 대해 평가 결과를 <패스워드> is acceptable. 또는 <패스워드> is not acceptable. 형태로 출력합니다.

풀이: 단일 루프를 통한 O(N) 최적화

하나의 반복문 안에서 인덱스(i)를 활용해 문자들을 확인합니다.

  1. 단일 루프 및 플래그 변수: 패스워드의 적합성을 나타내는 flag를 true로, 모음 포함 여부를 나타내는 hasVowel을 false로 두고 문자열의 첫 글자부터 순회합니다.
  2. 규칙 1 (모음 포함 여부): 순회 중 모음을 만날 때마다 hasVowel을 true로 변경합니다.
  3. 규칙 3 (연속 2개 같은 글자 방지): 인덱스 i가 1 이상일 때부터, 현재 문자(c)와 직전 문자(s.charAt(i - 1))를 비교합니다. 두 문자가 같으면서 'e'나 'o'가 아니라면, 즉시 부적합(flag = false) 판정을 내리고 반복을 종료합니다.
  4. 규칙 2 (연속 3개 모음/자음 방지): 인덱스 i가 2 이상일 때부터, 현재 문자와 직전 2개의 문자를 확인합니다. 세 문자의 모음 여부(isVowel)가 모두 true이거나 모두 false라면 연속 3개 모음/자음이므로 부적합 판정을 내립니다.
  5. 반복이 끝난 후 hasVowel이 false인 경우에도 부적합 판정을 내린 뒤, 삼항 연산자를 이용해 결과 문자열을 출력합니다.

코드

import java.io.*;
import java.util.*;

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

       while (true) {
          String s = br.readLine();
          if (s.equals("end"))
             break;

          boolean flag = true;
          boolean hasVowel = false;

          for (int i = 0; i < s.length(); i++) {
             char c = s.charAt(i);

             if (isVowel(c)) {
                hasVowel = true;
             }

             if (i > 0) {
                if (c == s.charAt(i - 1) && c != 'e' && c != 'o') {
                   flag = false;
                   break;
                }
             }

             if (i > 1) {
                boolean isV1 = isVowel(s.charAt(i - 2));
                boolean isV2 = isVowel(s.charAt(i - 1));
                boolean isV3 = isVowel(c);

                if (isV1 == isV2 && isV2 == isV3) {
                   flag = false;
                   break;
                }
             }
          }

          if (!hasVowel) {
             flag = false;
          }

          String ans = flag ? "<%s> is acceptable.\n" : "<%s> is not acceptable.\n";
          bw.write(String.format(ans, s));
       }

       bw.flush();
    }

    static boolean isVowel(char c) {
       return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
    }
}

알고리즘 분류

문자열 처리 (String), 구현 (Implementation)

'PS > B.O.J' 카테고리의 다른 글

10709번: 기상캐스터  (0) 2026.03.22
2870번: 수학숙제  (0) 2026.03.22
2910번: 빈도 정렬  (0) 2026.03.22
2828번: 사과 담기 게임  (1) 2026.03.22
1992번: 쿼드트리  (0) 2026.03.21