[Algorithm/Java] 백준 4659번 - 비밀번호 발음하기
https://www.acmicpc.net/problem/4659
🔍 문제 풀이
문제 도식화
contains을 사용하지 않은 이유
contains 대신 직접 비교를 쓰는 이유
- contains는 찾으려는 문자를 발견할 때까지 문자열을 처음부터 순차적으로 검사하는 방식으로 동작
- contains는 문자열을 생성(String.valueOf(ch))하고, 그 문자열을 다시 vowels 문자열(“aeiou”)에서 찾는 추가적인 내부 과정을 거쳐 느림
- 반면
ch == 'a' || ch == 'e' || ...
처럼 직접 비교하는 방식은 불 필요한 작업이 없어 더 빠름
💻 전체 코드
- charAt(i) 사용: 문자의 위치나 연속성 등 순서와 관련된 규칙을 검사할 때 사용
- contains 사용: 특정 문자가 문자열에 포함되어 있는지 여부만 판단할 때 사용
import java.io.*;
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 str = br.readLine();
if (str.equals("end")) {
break;
}
sb.append("<").append(str).append(">");
if (solve(str)) {
sb.append(" is acceptable.\n");
} else {
sb.append(" is not acceptable.\n");
}
}
System.out.print(sb);
}
private static boolean isVowel(char ch) {
return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u';
}
static boolean solve(String str) {
boolean hasVowel = false;
int vowelCnt = 0;
int consonantCnt = 0;
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
// isVowel 함수를 사용해 모음인지 효율적으로 판별
if (isVowel(ch)) {
vowelCnt++;
consonantCnt = 0;
hasVowel = true;
} else {
vowelCnt = 0;
consonantCnt++;
}
// 모음 또는 자음 3개 연속 x
if (vowelCnt >= 3 || consonantCnt >= 3) {
return false;
}
// 같은 글자 두번 연속 x 단, ee와 oo는 허용
if (i > 0 && str.charAt(i - 1) == ch) {
if (ch != 'e' && ch != 'o') {
return false;
}
}
}
return hasVowel;
}
}
댓글남기기