안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다.

이번 포스팅은 백준 문자열 문제 - 비밀번호 발음하기 자바 풀이를 진행하고자 합니다.

 

문제 출처: https://www.acmicpc.net/problem/4659

 

4659번: 비밀번호 발음하기

좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtp

www.acmicpc.net

 

1. 풀이 소스

 

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        String str = "";
        
        boolean isPossible; // 가능한 경우 판단 
        boolean flag; // 모음 중 하나는 반드시 포함 
        boolean isVowelSeq; // 모음이 연속인지 ?
        int seq; // 모음 연속 
        char pre; // 이전 문자열 
        
        while ((str = br.readLine()) != null && !str.equals("end")) {
            pre = str.charAt(0);
            seq = 0;
            flag = isVowelSeq = false;
            isPossible = true;
            
            if (str.length() >= 1) { // 문자열이 1개 이상인 경우 pre 설정, flag = true
                if (pre == 'a' || pre == 'e' || pre == 'i' || pre == 'o' || pre =='u') {
                    flag = true;
                    isVowelSeq = true; // 모음인 경우 true, 자음인 경우 false
                } 
                seq++; // seq 증가                    
            }
            
            for (int i = 1; i < str.length(); i++) {
                char c = str.charAt(i);
                
                if (!flag && (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c =='u')) flag = true; // 아직 모음 판단 안한 경우
                
                if (pre == c) { // 3번 같은 글자 연속 두번 불가
                    if (!(pre == 'e' || pre == 'o')) {
                        isPossible = false; // 불가능한 경우 종료
                        break;
                    }
                }
                
                // 2번 판단 
                if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c =='u') {
                    if (isVowelSeq) seq++; // 모음 seq 증가 
                    else { // 이전이 자음이었다면
                        isVowelSeq = true;
                        seq = 1;
                    }
                } else { // 자음이라면
                    if (isVowelSeq) { // 이전이 모음이었다면
                        isVowelSeq = false;
                        seq = 1;
                    } else seq++; // 이전에도 자음이었으므로 seq 증가
                }
                
                if (seq >= 3) { 
                    isPossible = false;
                    break;
                }

                pre = c;
            }
            
            if (flag && isPossible) {
                sb.append("<").append(str).append("> is acceptable.").append("\n");
            } else {
                sb.append("<").append(str).append("> is not acceptable.").append("\n");
            }
        }
        
        System.out.print(sb);
    }
}

 

2. 풀이 중점 사항

 

주어진 3가지 조건을 만족하는 코드를 작성하기 위해 flag, isVowelSeq 등의 boolean 변수를 선언하였습니다.

자음과 모음에 대한 seq를 따로 설정하지 않아도 boolean 변수로 모음은 true, 자음은 false로 설정하여 seq를 한 번에 관리할 수 있었습니다.

 

자세한 코드는 주석처리 하였습니다. 감사합니다!

+ Recent posts