📝문제
💡풀이
문제 유형
다이나믹 프로그래밍
걸린 시간
1시간 30분
시간 복잡도
O(N)
풀이 방법 도출
- 처음엔 bfs로 접근했다가 메모리 초과 문제로 dp로 돌렸다.
- 문제가 좀 애매했던 거 같다.
- 계단 오르는 횟수를 정확히 K번 가려면 dp[N]==K여야 하는 줄 알았지만
- 생각을해보니 dp[0]은 순간이동으로 몇번째 행동에도 계속 0에 있을 수 있다.
- 이는 곧 최소 횟수만 구하면 그 이후의 횟수는 맘대로 늘리기가 가능하다는 것이다.
- 그래서 dp[N] <= K이기만 하면 답이 성립되는 것이다.
- 아래 두 식을 사용하여 점화식으로 답을 구했다.
- dp[i+1] = Math.min(dp[i+1], dp[i]+1)
- dp[i+i/2] = Math.min(dp[i+i/2], dp[i]+1)
import java.util.*;
import java.io.*;
class Main {
static final int INF = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] dp = new int[N + 1];
Arrays.fill(dp, INF);
dp[0] = 0;
for (int i = 0; i < N; i++) {
if (i + 1 <= N) {
dp[i + 1] = Math.min(dp[i + 1], dp[i] + 1);
}
if (i + i / 2 <= N) {
dp[i + i / 2] = Math.min(dp[i + i / 2], dp[i] + 1);
}
}
System.out.println(dp[N] <= K ? "minigimbob" : "water");
}
}
🤔Review
꽤 새로운 시각으로의 접근이 필요했던 문제였다.
'Algorithm' 카테고리의 다른 글
[Algorithm] 백준_줄 세우기_2252번 (JAVA) 위상정렬 알고리즘 (1) | 2025.04.30 |
---|---|
[Algorithm] 백준_나의 인생에는 수학과 함께_17265번 (JAVA) (2) | 2025.04.25 |
[Algorithm] 백준_강아지는 많을수록 좋다_27971번 (JAVA) BFS, DP (0) | 2025.04.23 |
[Algorithm] 백준_테트로미노_14500번 (JAVA) (0) | 2025.04.22 |
[Algorithm] 프로그래머스_신규 아이디 추천 (JAVA) 정규표현 (1) | 2025.04.21 |