알고리즘

[프로그래머스, 자바, 84512번] 모음 사전

hminor 2024. 9. 4. 17:04

풀이

  • 해당 문제는 자바로 재귀 문제를 해결해보고자 푼 문제로
  • 두 가지 방법을 활용하여 해결해봄
  • 우선 첫 번째로는 기본적이며 완전탐색하는 방법으로 
    • 모든 조합을 만든 다음 같은 문장을 찾는 방법으로 해결했으며
  • 두 번째 방법은 join을 활용해서
    • 현재 추가된 배열의 값과 같은 문자열을 찾으면 멈추는 방법으로 해결
  • 두 가지 방법 모두 재귀와 백트래킹을 활용하여 해결했음
  • 다만 계속 return 사용에 대한 혼동이와서 시간이 걸렸지만
  • 이제 해결할 수 있을 것 같다.
  • 혼동이 온 이유는 파이썬에서는 return에 대한 타입을
    • 따로 정의하지 않다보니 어디부분에선 return 만 사용하고
    • 어디부분에선 return {정수타입 변수} 로 하다보니
  • 갑자기 혼동이 와서 헷갈렸었다.

 

// 첫 번째 방법

import java.util.*;

class Solution {
    static List<String> li;
    static String[] words = {"A","E","I","O","U"};

    public int solution(String word) {
        li = new ArrayList<>();
        find("",0);
        for (int i=0; i<li.size(); i++) {
            if (word.equals(li.get(i))) return i;
        }
        return 0;
    }

    static void find(String str, int len) {
        li.add(str);
        if (len==5) return;
        for (int i=0; i<5; i++) find(str+words[i],len+1);
    }

}

 

// 두 번째 방법

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    static Deque<String> li;
    static String[] words = {"A","E","I","O","U"};
    static int cnt = 0;
    public int solution(String word) {
        li = new ArrayDeque<>();
        return find(word);
    }
    
    static int find(String word) {
        if ((word.length()==li.size())
            &&(li.stream().map(String::valueOf).collect(Collectors.joining("")).equals(word))) return cnt;
        else if (li.size()==5) return -1;
        for (String w: words) {
            li.add(w); 
            cnt++;
            int check = find(word);
            if (check != -1) return check;
            li.pollLast();
        }
        return -1;
    }
    
}