요르딩딩
백준 : 1890 점프 (DP) 본문
728x90
반응형
역시 아직까지 DP문제는 조금 어렵게? 느껴지는것 같다.
처음에는 재귀를 사용하여 풀었느나, 시간초과가 나와 다른 방법을 찾아보던 중 DP를 사용하게 되었다.
DP를 사용할때 헷갈렸던 부분은 해당 위치에 값을 넣을때 기준이
dp[i][j + value] += dp[i][j];// 오른쪽
dp[i + value][j] += dp[i][j]; // 아래
되는 부분이 이해가 안갔다.
내가 생각한 DP테이블은 해당 점을 지나가는 횟수가 해당점에 기록된다고 생각했다.
하지만, 기준은 해당점에 도달할 수 있는 경로의 수를 표시하는 거였다.
아래 내용을 바탕으로 나는 dp[1][1]을 4번 지나가니깐 4가 들어가야되는거 아닌가 생각했다.
하지만, 지나가는 횟수가 아니라, dp[0][0] -> dp[1][1]까지 갈수 있는 경로의 수로 2가 맞았던 것이었다.
이런 판단오류로 조금 혼동스러웠지만, 결과적으로 이해할 수 있어서 만족스러웠다.
앞으로는 DP관련 문제를 많이 풀어보도록 해야겠다.
import java.util.*;
class Main {
static int n, result = 0;
static int[][] graph;
static long[][] dp;
public static void road(int x, int y) {
dp[0][0] = 1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (dp[i][j] == 0 || (i == n - 1 && j == n - 1)) {
continue;
}
int value = graph[i][j];
if (j + value < n) { // 범위
dp[i][j + value] += dp[i][j];// 오른쪽
}
if (i + value < n) {
dp[i + value][j] += dp[i][j]; // 아래
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
sc.nextLine();
// 초기화
graph = new int[n][n];
dp = new long[n][n];
// 그래프입력
for (int i = 0; i < n; i++) {
String st = sc.nextLine();
String[] stArr = st.split(" ");
for (int j = 0; j < n; j++) {
graph[i][j] = Integer.parseInt(stArr[j]);
}
}
road(0, 0);
System.out.println(dp[n - 1][n - 1]);
}
}
728x90
반응형
'[코딩테스트] > 문제풀이' 카테고리의 다른 글
백준 : 14501 : 퇴사 (DP) (0) | 2022.04.01 |
---|---|
백준 : 2293 : 동전 1 (DP) (0) | 2022.04.01 |
백준 : 1932 (정수 삼각형) (DP) (0) | 2022.03.29 |
백준 : 5567 (결혼식) (BFS) (0) | 2022.03.28 |
백준 : 2644 (촌수 계산) (DFS) (0) | 2022.03.28 |
Comments