✔ 난이도 - Silver 5
문제의 조건이 총 3개인데
1. 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
2. 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
3. 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
이 세개를 모두 만족해야 높은 품질의 비밀번호이다.
조건을 판별하는걸 따로 isAcceptable 함수로 빼고 2, 3번째 조건에 부합하지 않으면 바로 false를 리턴함.
첫번째 조건은 hasVowel 변수의 불리언값으로 조절해주고 2,3번째 조건이 모두 통과되었을 시 마지막으로 해당 불리언값을 리턴해준다.
false가 리턴되면 낮은 품질, true이면 높은 품질이며 그에 맞게 출력한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static String VOWELS = "aeiou";
private static boolean isAcceptable(String input) {
boolean hasVowel = false;
int countV = 0;
int countC = 0;
for (int i = 0; i < input.length(); i++) {
char currentChar = input.charAt(i);
if (VOWELS.indexOf(currentChar) != -1) { // 모음이면
hasVowel = true;
countV++;
countC = 0;
} else { // 자음이면
countC++;
countV = 0;
}
if (countV == 3 || countC == 3) {
return false;
}
if (i > 0 && currentChar == input.charAt(i - 1)) {
if (currentChar != 'e' && currentChar != 'o') {
return false;
}
}
}
return hasVowel;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String input;
while (!(input = br.readLine()).equals("end")) {
sb.append("<").append(input).append("> is");
if (!isAcceptable(input)) {
sb.append(" not");
}
sb.append(" acceptable.\n");
}
System.out.println(sb);
}
}

O(N)
N이 20으로 매우 작아 패스워드 하나당 연산이 미미하므로, 테스트 케이스의 총 개수(T)가 극단적으로 많지 않은 이상 시간제한인 1초 내에 연산 가능.
while (!(input = br.readLine()).equals("end"))
이렇게 while문 내에서 입력값을 입력받아 간단하게 처리 가능.
연산이 길어지거나 조건이 복잡해지는 등 코드가 길어지면 따로 함수로 분리하는게 좋음
public static String VOWELS = "aeiou";
이렇게 따로 상수로 선언해놓고 VOWELS.indexOf(currentChar) != -1 indexOf로 문자열 내에 해당 값이 존재하는지 판별하는 방식이 존재함.