문제 풀이/백준
[백준] 1759번. 암호 만들기(JAVA)
27200
2024. 11. 29. 19:48
문제
https://www.acmicpc.net/problem/1759
풀이(47분)
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));
// 입력 처리
StringTokenizer st = new StringTokenizer(br.readLine());
int L = Integer.parseInt(st.nextToken());
int C = Integer.parseInt(st.nextToken());
char[] list = new char[C];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < C; i++) {
list[i] = st.nextToken().charAt(0);
}
// 정렬
Arrays.sort(list);
// 암호 생성 시작
generatePassword(list, new char[L], 0, 0, L);
}
public static void generatePassword(char[] list, char[] code, int start, int depth, int targetLength) {
// 암호가 목표 길이에 도달했을 때 유효성 검사 및 출력
if (depth == targetLength) {
if (isValid(code)) {
System.out.println(String.valueOf(code));
}
return;
}
// 재귀적으로 암호 생성
for (int i = start; i < list.length; i++) {
code[depth] = list[i];
generatePassword(list, code, i + 1, depth + 1, targetLength);
}
}
public static boolean isValid(char[] code) {
int vowels = 0, consonants = 0;
for (char ch : code) {
if ("aeiou".indexOf(ch) >= 0) {
vowels++;
} else {
consonants++;
}
}
return vowels >= 1 && consonants >= 2;
}
}
문제 해결 초반 우선순위 큐 등 복잡한 자료구조를 사용하려고 했었어서 시간을 좀 낭비한 경향이 있다.
먼저 알파벳이 중복되지 않기 때문에 정렬을 한다. 후에 알파벳 개수에 맞게 뽑고, 모음을 포함하고 있는지 찾는 것이다. 조건에 맞다면 출력한다.
지피티가 해준 처리중에 좋다고 느낀 부분은 모음 체크를 "aeiou".indexOf(ch) >= 0 방식으로 처리하여 간결하게 표현했습니다. 이다.
나같은 경우 전부 or 문으로 처리했는데 저런 방식을 사용할 수 있다는 것을 알게되었다.
AI가 발전할수록 최종 완성된 내 코드를 다른 방식으로 리팩토링할 수 있는지에 대해 참고할 때 다른 분들의 풀이를 참고하는 것과 GPT에게 물어보는 방식을 모두 효율적으로 사용해야할 것 같다.