간단하게 문자를 다루는 문제였다.
자바 List의 contains 메서드를 이용해서 해결하면 편하게 할 수 있을 것 같아서 써보려했지만, 여러가지 문제로 삽질만 했다..
List의 contains 메서드는 String 값에서만 동작한다.
그렇기에 String으로 받은 password를 char[]로 바꾸기는 쉽지만, char[] -> String[]
로 하기는 귀찮거나, 불가능하기에(사실 어떻게 바꾸는지 잘 모른다) 이 방법은 아닌것 같았다.
결국 문제에서 제공해주는 문제에 따라 차례로 검사했다.
다 풀고 여러 사람들의 풀이를 찾아봤는데, 로직은 같은 로직인데 리팩토링을 통해 코드의 수를 조금 줄인듯 했다.
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;
}
}