본문 바로가기

알고리즘

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

https://www.acmicpc.net/problem/4659

 

4659번: 비밀번호 발음하기

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

www.acmicpc.net

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

public class hy {

    //문자가 모음인지 자음인지 check, 모음이면 1, 자음이면 -1
    public static int check(char x){
        switch (x){
            case 'a': case 'e': case 'i': case 'o': case 'u': return 1;
            default: return -1;
        }
    }

    public static void test(String x){
        boolean isOk = true;
        //1. 모음 하나 반드시 포함
        if(x.contains("a")||x.contains("e")||x.contains("i")||x.contains("o")||x.contains("u"))
            isOk = true;
        else isOk = false;
        //2. 모음 또는 자음이 3개연속이면 안됨
        int point = 0;
        for(int i=0;i<x.length();i++){
            if(check(x.charAt(i))>0&&point>0) point++;
            else if(check(x.charAt(i))<0&&point<0) point--;
            else point = check(x.charAt((i)));
            if(Math.abs(point)==3) isOk = false;
        }

        //3. 같은 글자 연속 두번 안됨, ee와 oo는 허용
        for(int i=1;i<x.length();i++){
            if(x.charAt(i-1)==x.charAt(i)&&x.charAt(i-1)!='e'&&x.charAt(i-1)!='o')
                isOk = false;
        }
        if(isOk)
            System.out.println("<"+x+"> is acceptable.");
        else
            System.out.println("<"+x+"> is not acceptable.");

    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while(true){
            String input = br.readLine();
            if(input.equals("end")) break;
            else{
                test(input);
            }
        }
    }
}

이 부분 구현이 새로웠다. 절대값으로 연속하는지 아닌지를 판단하는 것...

//2. 모음 또는 자음이 3개연속이면 안됨
int point = 0;
for(int i=0;i<x.length();i++){
    if(check(x.charAt(i))>0&&point>0) point++;
    else if(check(x.charAt(i))<0&&point<0) point--;
    else point = check(x.charAt((i)));
    if(Math.abs(point)==3) isOk = false;
}

point는 처음에 0이다.

그 이후 문자열의 문자를 검사한다.

point가 0보다 크거나 작으면 일단 첫 글자가 아니라는 것이다 !

문자가 모음이면서 point가 양수이면 연속해서 모음이 나왔다는 것, point를 ++

문자가 자음이면서 point가 음수이면 연속해서 자음이 나왔다는 것, point를 --

그게 아니라면 point는 문자 타입을 따라간다. 모음이면 1, 자음이면 -1.

이 때 point의 절대값이 3이면 모음 또는 자음이 3개 연속이라는 것임을 알 수 있다.