[백준] 4695번 : 비밀번호 발음하기

김건우·2024년 3월 2일
0

문제 풀이

목록 보기
48/62
post-thumbnail

비밀번호 발음하기

문제 풀이

간단하게 문자를 다루는 문제였다.

자바 List의 contains 메서드를 이용해서 해결하면 편하게 할 수 있을 것 같아서 써보려했지만, 여러가지 문제로 삽질만 했다..

List의 contains 메서드는 String 값에서만 동작한다.

그렇기에 String으로 받은 password를 char[]로 바꾸기는 쉽지만, char[] -> String[]로 하기는 귀찮거나, 불가능하기에(사실 어떻게 바꾸는지 잘 모른다) 이 방법은 아닌것 같았다.

결국 문제에서 제공해주는 문제에 따라 차례로 검사했다.

  1. 모음 포함 확인
  2. 같은 글자 2번 - ee, oo 확인
  3. 글자 반복 3번 확인

다 풀고 여러 사람들의 풀이를 찾아봤는데, 로직은 같은 로직인데 리팩토링을 통해 코드의 수를 조금 줄인듯 했다.

코드

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

        StringBuilder sb = new StringBuilder();
        while(true) {
            String password = br.readLine();

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

            boolean check = checkPassword(password);

            if(check)
                sb.append("<").append(password).append(">").append(" is acceptable.").append("\n");
            else
                sb.append("<").append(password).append(">").append(" is not acceptable.").append("\n");
        }
        System.out.println(sb);
    }

    private static boolean checkPassword(String password) {
        char[] passwordArray = password.toCharArray();

        boolean vowelCheck = false;
        boolean valid = true;
        char prev = ' ';
        int count = 0;

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

            // 모음 체크
            if(!vowelCheck) {
                if(isVowel(c)) {
                    vowelCheck = true;
                }
            }

            // 연속 체크
            if(isVowel(c) == isVowel(prev))
                count++;
            else
                count = 1;

            // 2개 이상 같은 문자 연속
            if(count == 2) {
                if(c == prev) {
                    if(!(c == 'e' || c=='o')) {
                        valid = false;
                        break;
                    }
                }
            }

            // 3개 이상 연속
            if(count == 3) {
                valid = false;
                break;
            }

            prev = c;
        }

        if(!vowelCheck || !valid)
            return false;

        return true;
    }

    private static boolean isVowel(char s) {
        if(s == 'a' || s=='e' || s=='i' || s=='o' || s=='u'){
            return true;
        }
        return false;
    }
}
profile
공부 정리용

0개의 댓글