알고리즘 & 자료구조/문제 풀이
[프로그래머스 알고리즘 고득점 Kit][완전탐색][Java] 모음사전
수수다
2026. 7. 27. 02:56
https://school.programmers.co.kr/learn/courses/30/lessons/84512
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이 방법
- DFS로 A,E,I,O,U를 사전순으로 조합해가며 문자열 생성
- 문자열이 하나 완성될 때마다 cnt++
- target과 일치하면 found = true로 표시하고 탐색 중단
class Solution {
char[] alphabets = {'A', 'E', 'I', 'O', 'U'};
int cnt = 0;
boolean found = false;
public int solution(String word) {
dfs(new StringBuilder(), word);
return cnt;
}
public void dfs(StringBuilder sb, String target) {
if(found) return;
if(sb.length() == 5) return;
for(int i=0; i<alphabets.length; i++) {
sb.append(alphabets[i]);
cnt++;
if(target.equals(sb.toString())) {
found = true;
return;
}
dfs(sb, target);
if(found) return;
sb.deleteCharAt(sb.length() - 1);
}
}
}

배운 점
- 사전순 나열은 알파벳 배열을 순서대로 순회하는 DFS로 자연스럽게 구현됨
- deleteCharAt(idx): 문자 하나만 삭제 (delete(start,end)는 범위 삭제라 인자 2개 필요)
- 재귀 호출 후 found 체크를 안 하면, 정답을 찾은 뒤에도 다른 분기를 계속 탐색해 cnt가 잘못 커짐 → 재귀 호출 직후 반드시 found 체크 필요
조건문을 조금 더 깔끔하게 한다면.
private void dfs(StringBuilder sb, String target) {
if (found) return;
if (sb.length() == 5) return;
for (int i = 0; i < alphabets.length && !found; i++) {
sb.append(alphabets[i]);
cnt++;
if (sb.toString().equals(target)) {
found = true;
} else {
dfs(sb, target);
}
sb.deleteCharAt(sb.length() - 1);
}
}