백준 비밀번호 발음하기

KIMYEONGJUN·2025년 3월 11일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

입력은 여러개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 테스트할 패스워드가 주어진다.
마지막 테스트 케이스는 end이며, 패스워드는 한글자 이상 20글자 이하의 문자열이다. 또한 패스워드는 대문자를 포함하지 않는다.

각 테스트 케이스를 '예제 출력'의 형태에 기반하여 품질을 평가하여라.

내가 이 문제를 보고 생각해본 부분

입력 처리: BufferedReader를 사용하여 입력을 읽고, "end"가 입력될 때까지 반복한다.
비밀번호 검사:
containsVowel: 비밀번호에 모음이 포함되어 있는지 확인한다.
hasThreeConsecutive: 모음 또는 자음이 3개 연속으로 오는지 확인한다.
hasConsecutiveLetters: 같은 문자가 두 번 연속으로 오는지 확인하되, 'ee'와 'oo'는 허용한다.
결과 출력: 검사를 통해 비밀번호의 품질을 평가하고 결과를 StringBuilder에 저장하여 한 번에 출력한다.

코드로 구현

package baekjoon.baekjoon_27;

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

// 백준 4659번 문제
public class Main958 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        String password;
        while(!(password = br.readLine()).equals("end")) {
            if(isAcceptable(password)) {
                sb.append("<").append(password).append("> is acceptable.\n");
            } else {
                sb.append("<").append(password).append("> is not acceptable.\n");
            }
        }

        System.out.print(sb.toString());
        br.close();
    }

    private static boolean isAcceptable(String password) {
        if(!containsVowel(password)) {
            return false;
        }

        if(hasThreeConsecutive(password)) {
            return false;
        }

        if(hasConsecutiveLetters(password)) {
            return false;
        }

        return true;
    }

    private static boolean containsVowel(String password) {
        return password.contains("a") || password.contains("e") || password.contains("i") ||
                password.contains("o") || password.contains("u");
    }

    private static boolean hasThreeConsecutive(String password) {
        int vowelCount = 0;
        int consonantCount = 0;

        for(char c : password.toCharArray()) {
            if("aeiou".indexOf(c) >= 0) {
                vowelCount++;
                consonantCount = 0;
            } else {
                consonantCount++;
                vowelCount = 0;
            }

            if(vowelCount >= 3 || consonantCount >= 3) {
                return true;
            }
        }

        return false;
    }

    private static boolean hasConsecutiveLetters(String password) {
        for(int i = 0; i < password.length() - 1; i++) {
            char current = password.charAt(i);
            char next = password.charAt(i + 1);
            if(current == next && !(current == 'e' || current == 'o')) {
                return true;
            }
        }
        return false;
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글