[프로그래머스] 모음 사전

최지나·2023년 12월 17일
1

코딩테스트

목록 보기
103/154

문제

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.

단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.

제한사항
word의 길이는 1 이상 5 이하입니다.
word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.

입출력 예

wordresult
"AAAAE"6
"AAAE"10
"I"1563
"EIO"1189

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/84512

생각

  • 모음으로 만들 수 있는 모든 1~5자의 글자를 구해야 하므로 DFS 문제이다
  • wordList에 모음으로 만들 수 있는 모든 글자들을 담은 뒤 Collections.sort로 사전 순 정렬하자
  • 재귀함수 DFS의 호출을 통해 모든 모음 글자들을 구하자

코드

import java.util.*;

class Solution {
    
    static char[] currentWord;
    public int solution(String word) {
        
        List<String> wordList = new ArrayList<>();

        currentWord = new char[5];
        DFS(0, wordList);
        
        Collections.sort(wordList);
        
        int idx = 1;
        for (String w : wordList){
            if (w.equals(word)) return idx;
            idx++;
        }
        return idx;
    }
    
  private void DFS(int L, List<String> lst) {
        char[] alphabet = {'A', 'E', 'I', 'O', 'U'};
        
        if (L > 0) {
            lst.add(new String(currentWord, 0, L));
        }

        if (L == 5) {
            return;
        }

        for (char letter : alphabet) {
            currentWord[L] = letter;
            DFS(L + 1, lst);
        }
    }

}

다른 사람의 풀이

import java.util.*;
class Solution {
    List<String> list = new ArrayList<>();
    void dfs(String str, int len) {
        if(len > 5) return;
        list.add(str);
        for(int i = 0; i < 5; i++) dfs(str + "AEIOU".charAt(i), len + 1);
    }
    public int solution(String word) {
        dfs("", 0);
        return list.indexOf(word);
    }
}
  • 주어진 word의 사전에서의 순서를 얻는 과정에서 불필요한 탐색이 있기는 하지만.. 나의 풀이에 비해 훨씬 간결하고 정렬을 사용할 필요도 없어서 직관적인 풀이었다고 생각한다
  • 완전탐색 문제 연습을 본격적으로 해봐야겠다!!
profile
의견 나누는 것을 좋아합니다 ლ(・ヮ・ლ)

0개의 댓글