문제링크:
문제:
좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtpzyo 같은 비밀번호를 무작위로 부여해 주기도 하지만, 사용자들은 이를 외우는데 어려움을 느끼고 심지어는 포스트잇에 적어 컴퓨터에 붙여놓는다. 가장 이상적인 해결법은 '발음이 가능한' 패스워드를 만드는 것으로 적당히 외우기 쉬우면서도 안전하게 계정을 지킬 수 있다.
회사 FnordCom은 그런 패스워드 생성기를 만들려고 계획중이다. 당신은 그 회사 품질 관리 부서의 직원으로 생성기를 테스트해보고 생성되는 패스워드의 품질을 평가하여야 한다. 높은 품질을 가진 비밀번호의 조건은 다음과 같다.
- 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
- 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
- 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
이 규칙은 완벽하지 않다;우리에게 친숙하거나 발음이 쉬운 단어 중에서도 품질이 낮게 평가되는 경우가 많이 있다.
입력:
입력은 여러개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 테스트할 패스워드가 주어진다.
마지막 테스트 케이스는 end이며, 패스워드는 한글자 이상 20글자 이하의 문자열이다. 또한 패스워드는 대문자를 포함하지 않는다.
출력:
각 테스트 케이스를 '예제 출력'의 형태에 기반하여 품질을 평가하여라.

문제이해:
이 문제는 어떤 문자열이 비밀번호로서 적절한지를 판단하는 문제다. 적절한 비밀번호가 되기 위해서는 다음 세 가지 조건을 모두 만족해야 한다. 하나라도 어기면 탈락이다.
1. 모음이 반드시 하나 이상 포함되어야 한다
모음은 a, e, i, o, u 다섯 가지다. 하나도 없으면 탈락이다.
- 예시: "tv" → 모음 없음 → 탈락
- 예시: "apple" → a, e 있음 → 통과
2. 모음이 3개 연속 또는 자음이 3개 연속으로 오면 안 된다
연속이라는 말은 바로 옆 글자들을 말한다. 모음 3개가 연달아 나오거나 자음 3개가 연달아 나오면 탈락이다.
- 예시: "aeiou" → a, e, i가 연속 → 탈락
- 예시: "bcd" → 자음 3개 연속 → 탈락
- 예시: "team" → 모음 2개까지만 → 통과
3. 같은 글자가 연속으로 두 번 오면 안 된다. 단, ee와 oo는 예외로 허용된다
- 예시: "hello" → ll이 반복 → 탈락
- 예시: "book" → oo는 예외 → 통과
- 예시: "pass" → ss는 금지 → 탈락
- 예시: "tree" → ee는 허용 → 통과
구현 방식:
작성자는 비밀번호가 조건을 만족하는지를 판단하기 위해 세 가지 조건을 순서대로 하나씩 검사하는 방식으로 구현했다. 각 조건은 하나라도 위반되면 즉시 "not acceptable"을 출력하고 종료하도록 했다. 모든 조건을 통과하면 "acceptable"을 출력하는 구조다.
첫 번째로는 모음이 하나라도 포함되어 있는지를 검사했다. contains() 메서드를 이용해 문자열 내에 a, e, i, o, u 중 하나라도 있는지를 확인했다. 없으면 바로 탈락 처리한다.
두 번째로는 모음이 3개, 혹은 자음이 3개 연속으로 오는지 확인했다. 각 문자를 모음인지 아닌지로 구분해 배열에 표시하고, 연속되는 성질이 같은 문자가 3번 반복되면 탈락으로 간주했다.
세 번째로는 같은 글자가 두 번 연속으로 나오는 경우를 검사했다. 단, ee와 oo는 예외로 허용되도록 조건을 분리해 처리했다. 이 조건도 위반되면 즉시 탈락 처리했다.
전체적으로 조건을 하나씩 분리해서 검사하고, 탈락 조건이 발생하면 더 이상 검사를 진행하지 않는 단계적 판단 구조로 되어 있다.
이를 그대로 코드로 구현하면 다음과 같다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void passWard(String password) {
String vowels = "aeiou";
boolean[] check = new boolean[password.length()];
int count2=1; //2번조건 카운트
//a e i o u 중에 적어도 하나는 포함되는지 확인 (첫번째 조건)
if(password.contains("a") || password.contains("e") ||
password.contains("i") || password.contains("o") ||
password.contains("u")) {
//2번째 조건 모음이 3개 혹은 자음이 3개가 연속으로 안되는 것 확인
for (int i = 0; i < password.length(); i++) {
if (vowels.contains(String.valueOf(password.charAt(i)))) {
check[i] = true;
}
}
for (int i = 0; i < password.length() - 1; i++) {
if (check[i] == check[i + 1]) {
count2++;
if(count2==3) break;
} else {
count2 = 1;
}
}
if (count2 >= 3) {
System.out.println("<" + password + "> is not acceptable.");
return;
}
//3번째 조건 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
for (int i = 0; i < password.length() - 1; i++) {
if (password.charAt(i) == password.charAt(i + 1)
&& password.charAt(i) != 'e' && password.charAt(i) != 'o') {
System.out.println("<" + password + "> is not acceptable.");
return;
}
}
System.out.println("<" + password + "> is acceptable.");
}
else{
System.out.println("<" + password + "> is not acceptable.");
}
}
public static void main(String[] args) throws Exception {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
while(true){
String str=br.readLine();
if(str.equals("end")) break;
passWard(str);
}
}
}
마무리하며:
작성자는 문제를 처음 접했을 때 딱 떠오르는 알고리즘이 없었기 때문에, 각 조건을 따로 나눠 단계별로 처리하는 방식으로 구현했다. 조건마다 직접 검사하면서 탈락 여부를 판단하는 구조다 보니 코드가 다소 길어지고 중복되는 부분도 있었지만, 어쨌든 문제의 조건을 정확히 반영하는 데 집중했다. 간단한 규칙처럼 보여도 예외 처리가 섞여 있어 처음엔 헷갈릴 수 있는 문제였다. 이번 구현은 깔끔하진 않지만 조건을 정확히 따라갔다는 점에서 의미가 있다.
감사합니다.
'코딩 테스트' 카테고리의 다른 글
| [백준] 10709 기상 캐스터 (JAVA) (3) | 2025.07.09 |
|---|---|
| [백준] 2870 수학숙제 (JAVA) (0) | 2025.07.08 |
| [백준] 2910 빈도 정렬 (JAVA) (1) | 2025.07.04 |
| [백준] 2828 사과 담기 게임 (JAVA) (1) | 2025.07.04 |
| [백준] 1992 쿼드트리 (JAVA) (1) | 2025.07.03 |