문제이해에 한시간을 쏟았다.
결론을 낸건 DFS를 사용해서 풀어야 한다는 것이다.
내 이론은 이렇다.
A시작점을 기준으로 왼쪽으로 X는 추가하지않는것이고, Ax, AAx, AAAx, AAAAx, AAAAA, AAAAE,AAAAI, AAAAO, AAAAU, 다시 한칸 더 위로가서, AAAEx, AAAEA, AAAEE.... 이런식으로 완전탐색으로 풀면되겠다 싶었다.
하지만 나의 능력의 한계에 부딪혀 결국 치트키를 썼다.
그래서 얻어낸 코드를 보며 코드의 설명을 해보겠다.
public class Main {
static final char[] WORDS = {'A', 'E', 'I', 'O', 'U'};
static final int MAX_LENGTH = 5;
public static int solution(String word) {
int answer = 0;
List<String> elements = new ArrayList<>();
//다섯개문자 각각에 대해 dfs메서드를 호출해 가능한 모든 단어 생성
for(int i=0; i<WORDS.length; i++){
dfs(elements, String.valueOf(WORDS[i]));
}
//elements 를 순회하면서 word의 인덱스 구하고 +1 해준다.
for(int i=0; i<elements.size(); i++){
if(elements.get(i).equals(word)){
answer = i + 1;
break;
}
}
return answer;
}
//elements = 모든단어 저장, str = 현재까지 생성된 문자열
static void dfs(List<String> elements, String str){
//str길이가 5초과하면 재귀중지
if(str.length() > MAX_LENGTH) return;
//elements에 현재 str이 없다면 추가 (중복없음)
if(!elements.contains(str)) elements.add(str);
//다섯 개의 문자각각에 대해 재귀 호출
for(int i=0; i<WORDS.length; i++){
dfs(elements, str+WORDS[i]);
}
}
public static void main(String[] args) {
String word = "E";
String word2 = "AAAE";
String word3 = "I";
String word4 = "EIO";
String word5 = "AAAOE";
System.out.println(solution(word)); // 782
System.out.println(solution(word2)); // 10
System.out.println(solution(word3)); //1563
System.out.println(solution(word4)); //1189
System.out.println(solution(word5)); //24
}
}
코드를 보며 dfs메서드가 재귀되면서 어떻게 되는지를 그려가며 해봤다. 그려보니 이제서야 이해가 갔다. 근데 도저히 내머리로는 이걸 코드로 짜는게 안될거같긴하지만 익숙해지려 노력해보면 언젠가 될거라 믿는다...!
코드를 일단 눈에 익혀보자!
'Java > 알고리즘' 카테고리의 다른 글
주차 요금 계산 (0) | 2023.11.08 |
---|---|
더맵게(Priority Queue, Min Heap) (0) | 2023.11.02 |
알고리즘 공부(3) - 완전탐색을 알아보자 (1) | 2023.10.31 |
게임 맵 최단거리 (0) | 2023.10.31 |
N진수 게임 (1) | 2023.10.30 |