728x90
출처 : https://www.acmicpc.net/problem/4659
4659번: 비밀번호 발음하기
좋은 패스워드를 만드는것은 어려운 일이다. 대부분의 사용자들은 buddy처럼 발음하기 좋고 기억하기 쉬운 패스워드를 원하나, 이런 패스워드들은 보안의 문제가 발생한다. 어떤 사이트들은 xvtp
www.acmicpc.net
생각보다 가져갈 것이 많다고 여겨지는 구현 문제이다.
- 모음(a,e,i,o,u) 하나를 반드시 포함하여야 한다.
- 모음이 3개 혹은 자음이 3개 연속으로 오면 안 된다.
- 같은 글자가 연속적으로 두번 오면 안되나, ee 와 oo는 허용한다.
요구조건을 만족하면서 최종적으로 결과를 출력하는데 부분적으로 허용하는 것도 있기 때문에 구현할 때 신중하게 처리해줘야 한다.
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Baek4659 {
//같은 문자 연속으로 2개 X But, e와 o 는 허용 단, 2개까지만
final static String ok = "> is acceptable.\n";
final static String not = "> is not acceptable.\n";
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
while (true) {
String input = br.readLine();
boolean pass = false;
char prev = '!';
int cnt = 0;
if (input.equals("end")) { //입력받은 문자열이 "end" 라면 반복문 종료 & 출력
System.out.println(sb.toString());
break;
}
char[] password = input.toCharArray();
for (char p : password) {
if(checkAlphabet(p)){
pass= true;
}
//모음또는 자음이 각각 중복되면 cnt 증가
if(checkAlphabet(p)!=checkAlphabet(prev)) cnt=1;
else cnt++;
//모음또는 자음이 연속으로 3개이상 이거나, 이전문자와 중복이 되는데 e와 o가 아닌 경우,
if (cnt >= 3 || (prev == p && (p != 'e' && p != 'o'))) {
pass = false;
break;
}
prev = p;
}
if (pass) {
sb.append("<").append(input).append(ok);
}else{
sb.append("<").append(input).append(not);
}
}
}
static boolean checkAlphabet(char c) { //true 이면 모음, false 이면 자음
return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}
}
느낀점 : 구현문제는 꾸준하게 풀어야 한다. 어려운 문제는 아니지만 이 문제에서 가져갈 것들이 많다고 생각한다. 어떻게 문제를 풀이 할 것인가? 기준은 무엇으로? 요구조건에서 예외가 있는데 이부분 처리는? 등등 쉬운문제지만 한번만에 맞추기는 쉽지 않은 문제였다.
'알고리즘' 카테고리의 다른 글
| [프로그래머스] PCCE 기출 9번(java) (1) | 2024.01.03 |
|---|---|
| 백준 1753번 최단경로 (0) | 2023.12.29 |
| 프로그래머스 양과 늑대 (자바) (2) | 2023.12.23 |
| 백준 1946 신입사원 java (0) | 2023.12.23 |
| 백준 18870 좌표 압축(java) (0) | 2023.12.18 |