[백준(JAVA)] 4659번: 비밀번호 발음하기

세하·2025년 10월 15일

[백준] 문제풀이

목록 보기
66/94
post-thumbnail

문제

✔ 난이도 - Silver 5

설명

문제의 조건이 총 3개인데
1. 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
2. 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
3. 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
이 세개를 모두 만족해야 높은 품질의 비밀번호이다.

조건을 판별하는걸 따로 isAcceptable 함수로 빼고 2, 3번째 조건에 부합하지 않으면 바로 false를 리턴함.
첫번째 조건은 hasVowel 변수의 불리언값으로 조절해주고 2,3번째 조건이 모두 통과되었을 시 마지막으로 해당 불리언값을 리턴해준다.
false가 리턴되면 낮은 품질, true이면 높은 품질이며 그에 맞게 출력한다.

풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static String VOWELS = "aeiou";

    private static boolean isAcceptable(String input) {

        boolean hasVowel = false;
        int countV = 0;
        int countC = 0;

        for (int i = 0; i < input.length(); i++) {
            char currentChar = input.charAt(i);

            if (VOWELS.indexOf(currentChar) != -1) { // 모음이면
                hasVowel = true;
                countV++;
                countC = 0;
            } else { // 자음이면
                countC++;
                countV = 0;
            }

            if (countV == 3 || countC == 3) {
                return false;
            }

            if (i > 0 && currentChar == input.charAt(i - 1)) {
                if (currentChar != 'e' && currentChar != 'o') {
                    return false;
                }
            }
        }
        return hasVowel;
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        String input;
        while (!(input = br.readLine()).equals("end")) {

            sb.append("<").append(input).append("> is");
            if (!isAcceptable(input)) {
                sb.append(" not");
            }
            sb.append(" acceptable.\n");

        }
        System.out.println(sb);
    }
}

⏰ 시간복잡도

O(N)

  • N = 패스워드 길이

N이 20으로 매우 작아 패스워드 하나당 연산이 미미하므로, 테스트 케이스의 총 개수(T)가 극단적으로 많지 않은 이상 시간제한인 1초 내에 연산 가능.

TIL💡

  • while (!(input = br.readLine()).equals("end"))
    이렇게 while문 내에서 입력값을 입력받아 간단하게 처리 가능.

  • 연산이 길어지거나 조건이 복잡해지는 등 코드가 길어지면 따로 함수로 분리하는게 좋음

  • public static String VOWELS = "aeiou";
    이렇게 따로 상수로 선언해놓고 VOWELS.indexOf(currentChar) != -1 indexOf로 문자열 내에 해당 값이 존재하는지 판별하는 방식이 존재함.

0개의 댓글