Leetcode Java Freedom Trail
업데이트:
문제
코드
class Solution {
public int findRotateSteps(String ring, String key) {
int length = ring.length();
List<Integer>[] position = new ArrayList[26];
int[][] dp = new int[length][key.length()];
for (int idx = 0; idx < 26; idx++) {
position[idx] = new ArrayList<>();
}
for (int idx = 0; idx < length; idx++) {
position[ring.charAt(idx) - 'a'].add(idx);
}
return this.dfs(position, dp, ring, length, key, 0, 0);
}
private int dfs(List<Integer>[] position, int[][] dp, String ring, int length, String key, int x, int y) {
if (y == key.length()) {
return 0;
} else if (dp[x][y] != 0) {
return dp[x][y];
} else {
int result = Integer.MAX_VALUE;
for (int num : position[key.charAt(y) - 'a']) {
int diff = Math.abs(x - num);
result = Math.min(result, Math.min(diff, length - diff) + this.dfs(position, dp, ring, length, key, num, y + 1));
}
dp[x][y] = result + 1;
return result + 1;
}
}
}
결과
설명
-
ring에 포함된 문자를 다어얼 형태로 배치하여 key에 해당하는 단어를 만들기 위한 최소 횟수를 구하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- length는 ring의 길이를 저장할 변수이다.
- position은 ring에 포함된 단어의 위치 값을 저장하기 위한 변수로, 알파벳 크기인 26의 ArrayList 배열로 정의한다.
- dp는 경우의 수를 저장하기 위한 변수로, length와 key의 길이 크기인 2차원 배열로 정의한다.
-
position에 ArrayList를 초기화하여 넣어주고, ring의 모든 문자의 위치 값을 position 내 해당 알파벳 위치값에 해당하는 ArrayList에 넣어준다.
-
5번에서 정의한 dfs(List
[] position, int[][] dp, String ring, int length, String key, int x, int y) 메서드를 수행한 결과를 주어진 문제의 결과로 반환한다. - DFS 방식으로 문제를 탐색할 dfs(List
[] position, int[][] dp, String ring, int length, String key, int x, int y) 메서드를 정의한다. - y가 key의 length와 동일한 경우, 해당 값이 존재하지 않으므로 0을 반환한다.
- dp[x][y] 값이 0이 아닌 경우, 이미 탐색된 위치의 값이므로 dp[x][y]의 값을 반환한다.
- result에 정수의 최댓값을 넣어준다.
- key의 y번째 문자에 해당하는 ArrayList를 position에서 꺼내 각 값을 num으로 아래를 수행한다.
- diff에 x와 num의 차이의 절대값을 넣어준다.
- result에 diff와 $length - diff$ 중 작은 값과 x에 num, y에 $y + 1$를 넣고 재귀 수행한 결과와 result 중 작은 값을 넣어준다.
- dp[x][y]에 $result + 1$를 넣어주고 해당 값을 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기