Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 1일1코테
- Java
- 코딩테스트
- 코드트리
- 운영체제
- 항해99
- 웹
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 자바
- 자바스크립트
- 티스토리챌린지
- 연결 리스트
- 코테공부
- 프로그래머스
- 프로그래밍 언어
- 인접 행렬
- 코딩테스트사이트추천
- 개발자루틴
- 데이터베이스
- 파이썬
- til
- 자료구조
- 오블완
- 알고리즘
- 갭체크
- 99클럽
- C
- 개발자취업
- 플로이드-워셜
- 코딩테스트준비
Archives
- Today
- Total
와드의 블로그
4659번: 비밀번호 발음하기 본문
문제
좋은 패스워드를 만들기 위해 다음 3가지 규칙을 만족하는지 판별하는 프로그램을 작성하는 문제입니다.
- 모음(a, e, i, o, u) 하나를 반드시 포함하여야 합니다.
- 모음이 3개 혹은 자음이 3개 연속으로 오면 안 됩니다.
- 같은 글자가 연속적으로 두 번 오면 안 되나, ee 와 oo는 허용합니다.
- 입력: 각 줄마다 패스워드로 사용할 문자열이 주어집니다. 마지막 줄에는 "end"가 주어집니다.
- 출력: 각 패스워드에 대해 평가 결과를 <패스워드> is acceptable. 또는 <패스워드> is not acceptable. 형태로 출력합니다.
풀이: 단일 루프를 통한 O(N) 최적화
하나의 반복문 안에서 인덱스(i)를 활용해 문자들을 확인합니다.
- 단일 루프 및 플래그 변수: 패스워드의 적합성을 나타내는 flag를 true로, 모음 포함 여부를 나타내는 hasVowel을 false로 두고 문자열의 첫 글자부터 순회합니다.
- 규칙 1 (모음 포함 여부): 순회 중 모음을 만날 때마다 hasVowel을 true로 변경합니다.
- 규칙 3 (연속 2개 같은 글자 방지): 인덱스 i가 1 이상일 때부터, 현재 문자(c)와 직전 문자(s.charAt(i - 1))를 비교합니다. 두 문자가 같으면서 'e'나 'o'가 아니라면, 즉시 부적합(flag = false) 판정을 내리고 반복을 종료합니다.
- 규칙 2 (연속 3개 모음/자음 방지): 인덱스 i가 2 이상일 때부터, 현재 문자와 직전 2개의 문자를 확인합니다. 세 문자의 모음 여부(isVowel)가 모두 true이거나 모두 false라면 연속 3개 모음/자음이므로 부적합 판정을 내립니다.
- 반복이 끝난 후 hasVowel이 false인 경우에도 부적합 판정을 내린 뒤, 삼항 연산자를 이용해 결과 문자열을 출력합니다.
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
while (true) {
String s = br.readLine();
if (s.equals("end"))
break;
boolean flag = true;
boolean hasVowel = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (isVowel(c)) {
hasVowel = true;
}
if (i > 0) {
if (c == s.charAt(i - 1) && c != 'e' && c != 'o') {
flag = false;
break;
}
}
if (i > 1) {
boolean isV1 = isVowel(s.charAt(i - 2));
boolean isV2 = isVowel(s.charAt(i - 1));
boolean isV3 = isVowel(c);
if (isV1 == isV2 && isV2 == isV3) {
flag = false;
break;
}
}
}
if (!hasVowel) {
flag = false;
}
String ans = flag ? "<%s> is acceptable.\n" : "<%s> is not acceptable.\n";
bw.write(String.format(ans, s));
}
bw.flush();
}
static boolean isVowel(char c) {
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
}
알고리즘 분류
문자열 처리 (String), 구현 (Implementation)
'PS > B.O.J' 카테고리의 다른 글
| 10709번: 기상캐스터 (0) | 2026.03.22 |
|---|---|
| 2870번: 수학숙제 (0) | 2026.03.22 |
| 2910번: 빈도 정렬 (0) | 2026.03.22 |
| 2828번: 사과 담기 게임 (1) | 2026.03.22 |
| 1992번: 쿼드트리 (0) | 2026.03.21 |