🧫 문제 분석
✔️ 출처
📖 문제

나의 가장 약한 부분인 DP 연습 기간을 잡아 DP문제를 풀어보려한다.
DFS + DP로 풀었다.
중복 탐색 방지를 위해 static으로 방문처리 배열을 만들어서 처리했다.
약간 백트래킹 느낌으로
BFS + 우선순위 큐 풀이도 있다고 한다.
생각해보면 탐색은 점점 높이가 낮은 곳으로 이동하므로
높이가 낮은 순으로 큐에 넣으면
중복없이 풀어낼 수 있다는 것이다.
탐색 조건에 뭔가 우선순위를 매길 수 있다면 우선순위 큐를 떠올려 보자
🔅 문제 풀이
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static int[][] dp;
static int[][] map;
static int[] dr = {1, -1, 0, 0};
static int[] dc = {0, 0, 1, -1};
static boolean[][] visited;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
dp = new int[N][M];
map = new int[N][M];
visited = new boolean[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < N; i++) {
Arrays.fill(dp[i], -1);
}
dp[N-1][M-1] = 1;
visited[0][0] = true;
System.out.println(dfs(0, 0));
}
private static int dfs(int r, int c) {
if (dp[r][c] !=-1) {
return dp[r][c];
}
dp[r][c] = 0;
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nr >= N
|| nc < 0 || nc >= M
|| map[r][c] <= map[nr][nc]
|| visited[nr][nc]) continue;
visited[nr][nc] = true;
dp[r][c] += dfs(nr, nc);
visited[nr][nc] = false;
}
return dp[r][c];
}
}
❗ 오답노트 / 필요한 지식
'baekjoon > DP' 카테고리의 다른 글
백준 2253번 : 점프 [자바] (2) | 2025.08.30 |
---|---|
백준 14585번: 사수빈탕 [자바] (2) | 2025.07.10 |
백준 16565번 : N포커 [자바] (0) | 2025.07.01 |
백준 2533번 : 사회망 서비스 (SNS) [자바] (0) | 2025.06.27 |
백준 17626번 : Four Squaares [자바] (1) | 2025.06.13 |