1. 문제
좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtpzyo 같은 비밀번호를 무작위로 부여해 주기도 하지만, 사용자들은 이를 외우는데 어려움을 느끼고 심지어는 포스트잇에 적어 컴퓨터에 붙여놓는다. 가장 이상적인 해결법은 '발음이 가능한' 패스워드를 만드는 것으로 적당히 외우기 쉬우면서도 안전하게 계정을 지킬 수 있다.
회사 FnordCom은 그런 패스워드 생성기를 만들려고 계획중이다. 당신은 그 회사 품질 관리 부서의 직원으로 생성기를 테스트해보고 생성되는 패스워드의 품질을 평가하여야 한다. 높은 품질을 가진 비밀번호의 조건은 다음과 같다.
1. 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
2.모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
3. 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
이 규칙은 완벽하지 않다;우리에게 친숙하거나 발음이 쉬운 단어 중에서도 품질이 낮게 평가되는 경우가 많이 있다.
2. 풀이
세 변수를 비밀번호 입력받을 때마다 초기화한다.
flag | 해당 비밀번호가 유효한지 저장하는 flag |
prev | 이전 char 저장. 처음에는 '.'로 시작한다. |
count | 자음, 모음 상관없이 같은 종류의 글자가 연속으로 몇 번 등장했는지 확인한다. |
1. 현재 글자가 모음이라면 flag에 true를 저장한다.
2. 현재 글자와 이전 글자의 종류가 다르다면 count=1로 한다. 같다면 +1한다.
3. 만약 count가 3이라면 flag=false로 두고 끝낸다.
4. 만약 이전글자와 현재글자가 같고 e,o가 아닌 경우에도 flag=false로 두고 끝낸다.
5. 반복이 마무리된 후 패스워드가 유효한지, 유효하지 않은지에 따라 sb에 다른 문자열을 더한다.
import java.io.*;
public class BOJ_4659_비밀번호발음하기 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String password;
char[] pass;
String acc = "> is acceptable.\n";
String not = "> is not acceptable.\n";
StringBuilder sb = new StringBuilder();
boolean flag;
char prev;
int count;
while (!(password = in.readLine()).equals("end")) {
pass = password.toCharArray();
prev = '.';
count = 0;
flag = false;
for (char p : pass) {
if (isVowel(p)) flag = true;
if (isVowel(p) != isVowel(prev)) count = 1;
else count++;
if (count > 2 || (prev == p && (p != 'e' && p != 'o'))) {
flag = false;
break;
}
prev = p;
}
if (flag) sb.append('<').append(password).append(acc);
else sb.append('<').append(password).append(not);
}
System.out.println(sb);
}
public static boolean isVowel(char ch) {
return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u';
}
}
3. 결과
둘 다 같은 로직인데 좀 더 간단하게 코드를 고쳤다.
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 12919 A와 B 2 - JAVA (0) | 2023.04.11 |
---|---|
[BOJ] 2616 소형기관차 - JAVA (0) | 2023.04.10 |
[BOJ] 10800 컬러볼 - JAVA (0) | 2023.04.08 |
[BOJ] 13900 순서쌍의 곱의 합 - JAVA (0) | 2023.04.07 |
[BOJ] 17425 약수의 합 - JAVA (0) | 2023.04.06 |
댓글