Leetcode Java Minimum Cost to Convert String I
업데이트:
문제
코드
class Solution {
public long minimumCost(String source, String target, char[] original, char[] changed, int[] cost) {
long result = 0;
long[][] costs = new long[26][26];
for (long[] row : costs) {
Arrays.fill(row, Integer.MAX_VALUE);
}
for (int i = 0; i < original.length; i++) {
int num1 = original[i] - 'a';
int num2 = changed[i] - 'a';
costs[num1][num2] = Math.min(costs[num1][num2], cost[i]);
}
for (int i = 0; i < 26; i++) {
costs[i][i] = 0;
}
for (int k = 0; k < 26; k++) {
for (int i = 0; i < 26; i++) {
for (int j = 0; j < 26; j++) {
costs[i][j] = Math.min(costs[i][j], costs[i][k] + costs[k][j]);
}
}
}
for (int i = 0; i < source.length(); i++) {
int num1 = source.charAt(i) - 'a';
int num2 = target.charAt(i) - 'a';
if (num1 == num2) {
continue;
}
if (costs[num1][num2] == Integer.MAX_VALUE) {
return -1L;
} else {
result += costs[num1][num2];
}
}
return result;
}
}
결과
설명
- source 문자열을 target 문자열로 변경할 때 발생하는 최소 비용을 계산하는 문제이다.
- original[i] 문자를 changed[i] 문자로 바꿀 때 발생하는 비용은 cost[i] 이다.
- source 문자열을 target 문자열로 변경이 불가능한 경우, -1을 주어진 문제의 결과로 반환한다.
- 문제 풀이에 필요한 변수를 정의한다.
- result는 결과를 저장하기 위한 변수로, 0으로 초기화한다.
- costs Floyd Warshall 알고리즘을 이용하여 거리를 계산하기 위한 변수로, 문자열의 갯수인 26을 이용하여 $26 \times 26$ 크기의 2차원 정수 배열로 초기화 후 아래를 수행한다.
- costs의 모든 위치에 정수의 최댓값을 넣어준다.
- original과 changed를 costs의 위치에 현재 값과 cost 값 중 작은 값을 넣어준다.
- 자기 자신의 값을 변경하는 경우의 위치에는 값을 0으로 초기화해준다.
- 값을 여러 번 바꿔 비용이 발생하는 경우를 위해서 costs[i][j]에 기존 비용인 자기 자신의 값과 k번째 문자를 거쳐 바꿔지는 경우인 $costs[i][k] + costs[k][j]$ 중 최소 비용을 넣어준다.
- 0부터 26 미만까지 i를 증가시키면서 아래를 반복한다.
- source의 i번째 문자가 target의 i번째 문자와 동일하면 바꿀 필요가 없으므로, 다음 반복을 수행한다.
- costs의 source의 i번째 문자 순서와 target의 i번째 문자 순서의 값이 동일하여 변경이 불가능한 경우, -1을 주어진 문제의 결과로 반환한다.
- costs의 source의 i번째 문자 순서와 target의 i번째 문자 순서의 값이 동일하여 변경이 가능한 경우, result에 해당 값을 더해준다.
- 반복이 완료되면 최소 비용인 result를 주어진 문제의 결과로 반환한다.
해설
- 여느 문제와 같이 도시의 숫자가 작은 값부터 이동 가능한 도시의 갯수가 동일한 경우를 포함하는 이유는, 문제의 조건인 도시의 숫자가 큰 경우만 남기기 위함이다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기