코테/백준

[백준/JAVA] 10164번: 격자상의 경로

imname1am 2024. 2. 15. 15:05
반응형

📖 문제

 

10164번: 격자상의 경로

입력의 첫째 줄에는 격자의 행의 수와 열의 수를 나타내는 두 정수 N과 M(1 ≤ N, M ≤ 15), 그리고 ○로 표시된 칸의 번호를 나타내는 정수 K(K=0 또는 1 < K < N×M)가 차례로 주어지며, 각 값은 공백으

www.acmicpc.net

 

 

 

💡  풀이 방식

• DP

(0,0)부터 O 표시된 칸까지 가는 DP 한 번,O 표시된 칸부터 오른쪽 아래의 점 (N-1, M-1)까지 가는 DP 한 번해서총 2번의 DP를 진행하며 이동 경로의 수를 나타내는 2차원 배열 dp를 채웠다.

 

이 때 dp를 채우기 위한 점화식은 아래와 같다.

dp[i][j] = dp[i-1][j] + dp[i][j-1];	// 오른쪽과 아래쪽으로만 이동가능하다고 했으므로

 

 

(0,0)부터 오른쪽 아래까지 갈 수 있는 서로 다른 경로의 수는 dp[N-1][M-1]에 저장된다.

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import java.util.*;
import java.io.*;
 
public class Main {
    static int N,M,K;
    static int[][] grid, dp;
    static int ox = 0, oy = 0;  // O 표시된 칸 위치 (초기 위치 : (0,0))
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String[] str = br.readLine().split(" ");
        N = Integer.parseInt(str[0]);   // 행
        M = Integer.parseInt(str[1]);   // 열
        K = Integer.parseInt(str[2]);   // O 표시된 칸 번호
        
        grid = new int[N][M];
        
        int num = 1;
        for(int i = 0 ; i < N ; i++) {
            for(int j = 0 ; j < M ; j++) {
                grid[i][j] = num++;
                
                if(grid[i][j] == K) {
                    ox = i;
                    oy = j;
                }
            }
        }
        
        // dp 2번하기
        dp = new int[N][M];
 
        // 1차) (0,0) -> (ox, oy)
        for(int i = 0 ; i <= ox ; i++) {
            for(int j = 0 ; j <= oy ; j++) {
                if(i == 0 || j == 0)
                    dp[i][j] = 1;
                else
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        
        
        // 2차) (ox, oy) -> (n-1, m-1)
        for(int i = ox ; i < N ; i++) {
            for(int j = oy ; j < M ; j++) {
                if(i == ox || j == oy)
                    dp[i][j] = dp[ox][oy];
                else
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        
        System.out.println(dp[N-1][M-1]);
    }
}
 
cs

 

 

➕ 다른 풀이 방식

DFS로도 풀 수 있다고 한다.

 

[백준] 자바 10164 격자상의 격로

문제 행의 수가 N이고 열의 수가 M인 격자의 각 칸에 1부터 N×M까지의 번호가 첫 행부터 시작하여 차례로 부여되어 있다. 격자의 어떤 칸은 ○ 표시가 되어 있다. (단, 1번 칸과 N × M번 칸은 ○ 표

kjs-dev.tistory.com

 

 

[BOJ] 백준 10164번 : 격자상의 경로 (JAVA)

문제 행의 수가 N이고 열의 수가 M인 격자의 각 칸에 1부터 N×M까지의 번호가 첫 행부터 시작하여 차례로 부여되어 있다. 격자의 어떤 칸은 ○ 표시가 되어 있다. (단, 1번 칸과 N × M번 칸은 ○ 표

steady-coding.tistory.com


💦 어려웠던 점

- 어렵지 않은 문제인데 왜 헤맸지.. 초반에 약간 BFS로 가면서 거리 나타내는 2차원 배열 채워야하나 잠깐 고민했었다..

 

 

 

1회독 2회독 3회독 4회독 5회독
V        

 

반응형