728x90
🔗 문제 링크
문제 링크: https://www.acmicpc.net/problem/4659
📌 문제 개요
백준 4659번 비밀번호 발음하기는
주어진 문자열이 좋은 비밀번호인지 판별하는 문제
- 모음(a, e, i, o, u)이 최소 1개 이상 포함되어야 한다.
- 모음이 3개 연속으로 오면 안 된다.
- 자음이 3개 연속으로 오면 안 된다.
- 같은 글자가 연속으로 2번 오면 안 된다.
- 단, ee와 oo는 허용된다.
입력은 여러 줄로 주어지고, "end"가 입력되면 종료
📌 접근 방법
문자열을 앞에서부터 한 글자씩 보면서 조건을 검사하면 해결
- 모음이 한 번이라도 등장했는지
- 모음 또는 자음이 3번 연속되는지
- 같은 문자가 연속되는지
문자 하나를 볼 때마다 현재 문자가 모음인지 자음인지 구분하고,
- 모음이면 vowelCnt 증가, consonantCnt 초기화
- 자음이면 consonantCnt 증가, vowelCnt 초기화
이 방식으로 연속 개수를 관리
또한 현재 문자와 이전 문자가 같다면 연속 문자이므로 예외 여부를 확인
이때 e, o는 허용되므로 제외 처리
📌 핵심 아이디어
이 문제의 핵심은 문자열을 순회하면서 상태를 관리하는 것
1. 모음 포함 여부 확인
좋은 비밀번호는 반드시 모음을 하나 이상 포함
따라서 모음을 만날 때마다 hasVowel = true로 체크해두고,
문자열 검사가 끝난 뒤에도 false라면 좋은 비밀번호가 아닙니다.
2. 모음/자음 연속 개수 관리
모음 3개 연속, 자음 3개 연속을 막아야 하므로
모음과 자음의 연속 개수를 각각 따로 관리
- 현재 문자가 모음이면 vowelCnt++, consonantCnt = 0
- 현재 문자가 자음이면 consonantCnt++, vowelCnt = 0
이렇게 하면 현재 흐름이 모음인지 자음인지 바로 알 수 있고,
둘 중 하나가 3이 되는 순간 즉시 실패 처리
3. 같은 문자 연속 검사
이전 문자와 현재 문자가 같다면 원칙적으로 좋은 비밀번호가 아닙니다.
하지만 ee, oo는 허용되므로, 이 조건으로 예외까지 함께 처리
if (prev == ch && ch != 'e' && ch != 'o')
📌 전체 코드
package no_4659;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class No4659 {
public static boolean isVowel(char ch) {
return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u';
}
public static boolean isAcceptable(String str) {
boolean hasVowel = false;
int vowelCnt = 0;
int consonantCnt = 0;
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (isVowel(ch)) {
hasVowel = true;
vowelCnt++;
consonantCnt = 0;
} else {
consonantCnt++;
vowelCnt = 0;
}
if (vowelCnt >= 3 || consonantCnt >= 3) {
return false;
}
if (i > 0) {
char prev = str.charAt(i - 1);
if (prev == ch && ch != 'e' && ch != 'o') {
return false;
}
}
}
return hasVowel;
}
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;
}
if (isAcceptable(str)) {
sb.append("<").append(str).append("> is acceptable.").append("\n");
} else {
sb.append("<").append(str).append("> is not acceptable.").append("\n");
}
}
System.out.print(sb);
}
}
📄 정리
백준 4659번은 복잡한 알고리즘 문제라기보다
문자열을 순차적으로 검사하는 구현 문제
- 모음이 하나 이상 있는지 확인
- 모음/자음이 3번 연속되는지 확인
- 같은 문자가 연속되는지 확인 (ee, oo 예외)
728x90
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 백준 16435 스네이크버드 JAVA 풀이 (그리디, 정렬) (0) | 2026.04.03 |
|---|---|
| 백준 1652 누울 자리를 찾아라 JAVA 풀이 (구현, 문자열, 완전탐색, 시간복잡도) (0) | 2026.04.02 |
| 백준 9625 BABBA JAVA 풀이 (DP, 피보나치, O(N)) (0) | 2026.03.31 |
| 백준 10826 피보나치 수 4 JAVA 풀이 (DP, BigInteger, 시간복잡도) (0) | 2026.03.30 |
| 백준 24262 알고리즘 수업 - 알고리즘의 수행 시간 1 JAVA 풀이 (수학, 시간복잡도) (0) | 2026.03.29 |