| 문제 | 레벨 | 정답률 |
|---|---|---|
| 숫자 변환하기 | Lv.2 | 56% |

import java.util.Arrays;
public class Solution {
public int solution(int x, int y, int n) {
int[] dpArr = new int[y + 1];
Arrays.fill(dpArr, Integer.MAX_VALUE);
dpArr[x] = 0;
for (int i = x; i <= y; i++) {
if (dpArr[i] != Integer.MAX_VALUE) {
int next1 = i + n;
int next2 = i * 2;
int next3 = i * 3;
if (next1 <= y) dpArr[next1] = Math.min(dpArr[next1], dpArr[i] + 1);
if (next2 <= y) dpArr[next2] = Math.min(dpArr[next2], dpArr[i] + 1);
if (next3 <= y) dpArr[next3] = Math.min(dpArr[next3], dpArr[i] + 1);
}
}
return dpArr[y] == Integer.MAX_VALUE ? -1 : dpArr[y];
}
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.solution(10, 40, 5)); // 2
System.out.println(solution.solution(10, 40, 30)); // 1
System.out.println(solution.solution(2, 5, 4)); // -1
}
}
로직을 간단히 설명해보자면,
우선 dpArr 배열에는 각 숫자의 연산 횟수가 저장된다.
이를 0이 아닌 Integer.MAX_VALUE로 초기화하는 이유는, 뒤에서 더 작은 값을 비교해서 배열에 저장하도록 하는데 초기값이 커야 해당 배열의 값이 연산을 해서 나온 횟수인지, 원래 초기값인지 비교가 되기 때문!
그런데 여기서 x값은 0으로 초기화함.
이유는 뒤에 나오는 for문 안의 if문에서 Integer.MAX_VALUE가 아닌 값들만 코드를 실행하게 하는데, x부터 계산을 시작하려면 x는 Integer.MAX_VALUE면 안됨
그리고 x부터 y까지 for문을 돌린다.
dpArr배열의 값이 Integer.MAX_VALUE가 아닌 값들에 대해서, 즉 이미 계산된 결과인 값들에 한해서 코드를 적용한다.
각 int 변수에 3가지 연산 값을 저장한다.
이미 같은 숫자가 결과로 나온적이 있다면, 그때의 연산 횟수와 현재 연산 횟수 +1 값을 서로 비교해서 작은 수를 dpArr[next?]값에 저장한다.
ㄴ 만약 나온적 없는 숫자라면, 저장된 값이 Integer.MAX_VALUE일테니 자동으로 dpArr[i]+1 값이 저장됨
그리고 마지막으로 y에 저장된 값이 Integer.MAX_VALUE면 한 번도 나오지 않은 결과이지 -1을,
아니라면 저장된 숫자를 return 하면 된다.
사실 이렇게 결과 코드만 놓고 보면 꽤나 간단한 코드인데, 생각보다 머릿속의 로직을 코드로 체계화하는 과정이 쉽지 않다는걸 깨달았다 ,,
좋은 코드를 많이 보고 많이 공부해야겠다는 깨달음을 준 문제 🥲
갈 길이 멀다...!