풀이
- 해당 문제를 BFS와 DP로 해결해봤는데
- 우선 오랜만에 BFS로 해결하다보니
- 방문 체크하는 것에 대한 기본 개념을 잊어버린 나머지 조금 시간이 걸렸음
- 그리고 DP의 경우엔 범위를 어떻게 지정해야 하나 싶었는데
- 그저 단순하게 x부터 y까지 지정하되
- 탐색하지 않았을 경우에 대한 조건을 두어 체크를 한다면 쉽게 해결이 가능했다.
// BFS 풀이
public static int s1(int x, int y, int n) {
Queue<int[]> li = new LinkedList<>() {{
add(new int[]{x,0});
}};
Set<Integer> visit = new HashSet<>() {{
add(x);
}};
while (!li.isEmpty()) {
int[] now = li.poll();
if (now[0] == y) return now[1];
for (int num: new int[]{now[0]+n,now[0]*2,now[0]*3}) {
if (num<=y && !visit.contains(num)) {
visit.add(num);
li.add(new int[]{num,now[1]+1});
}
}
}
return -1;
}
// DP 풀이
public static int s2(int x, int y, int n) {
int[] dp = new int[y+1];
for (int i=x; i<=y; i++) {
if (i!=x && dp[i]==0) {
dp[i]=-1;
continue;
}
if (i+n<=y) dp[i+n] = (dp[i+n]==0) ? dp[i]+1 : Math.min(dp[i]+1,dp[i+n]);
if (i*2<=y) dp[i*2] = (dp[i*2]==0) ? dp[i]+1 : Math.min(dp[i]+1,dp[i*2]);
if (i*3<=y) dp[i*3] = (dp[i*3]==0) ? dp[i]+1 : Math.min(dp[i]+1,dp[i*3]);
}
return dp[y];
}
'알고리즘' 카테고리의 다른 글
[프로그래머스, 자바, 84512번] 모음 사전 (0) | 2024.09.04 |
---|---|
[프로그래머스, 자바, 12911번] 다음 큰 숫자 (0) | 2024.09.04 |
[SWEA, 자바, 1983번] 조교의 성적 매기기 (0) | 2024.08.29 |
[백준, 자바, 1072번] 게임 (이분 탐색) (0) | 2024.08.27 |
[백준, 자바, 10988번] 팰린드롬인지 확인하기 (0) | 2024.08.27 |