본문 바로가기
PS(알고리즘) 문제풀이/DP

[LeetCode] 62. 유일한 경로(Unique Paths) [Java, DP]

by 현군의 coding&IT story 2024. 8. 25.

문제

[문제 설명]

로봇이 m x n 격자에 있습니다. 로봇은 초기 위치에서 왼쪽 상단 모서리(즉, grid[0][0])에 있습니다. 
로봇은 오른쪽 하단 모서리(즉, grid[m-1][n-1])로 이동하려고 합니다. 
로봇은 언제든지 아래쪽이나 오른쪽으로만 이동할 수 있습니다.

정수 m과 n이 주어지면, 로봇이 오른쪽 하단 모서리에 도달하기 위해 취할 수 있는 가능한 고유 경로의 수를 반환하세요.
테스트 케이스는 정답이 2 * 109 이하가 되도록 생성됩니다.


[제한 사항]

1 <= m, n <= 100

 

[입출력 예시]

m	n	return
3	7	28
3	2	3

 

[입출력 예시 설명]

입출력 예#1
총 28가지 경로가 있습니다.

입출력 예#2
왼쪽 상단 모서리에서 오른쪽 하단 모서리로 도달하기 위한 총 3가지 경로가 있습니다

1. 오른쪽 -> 아래 -> 아래
2. 아래 -> 아래 -> 오른쪽
3. 아래 -> 오른쪽 -> 아래

 

문제 분석

  • 로봇이 좌상단 → 우하단 으로 가는 경우의 수 구하기 (이동은 오른쪽, 왼쪽으로만 가능)
  • row가 0이거나 col이 0인 경우 이동할 수 있는 경우의 수는 한 개밖에 없다. (쭉 직진)
  • 해당 지점의 이동 경우의 수는 해당 지점 위쪽의 이동 경우의 수 + 해당 지점의 왼쪽의 이동 경우의 수 이다.
  • DP의 메모이제이션 특성을 활용하여 각 지점까지 이동할 수 있는 경우의 수를 저장한다.

 

정답 코드

정답 코드에서는 dp 배열 대신 board 배열로 메모이제이션을 하였다.

import java.util.*;

class Solution {
    public int solution(int m, int n) {
        int answer = 0;
        int[][] board = new int[n][m];
        
        for(int row=0; row<n; row++) {
            for(int col=0; col<m; col++) {
                if(row == 0 || col == 0) { // basecase
                    board[row][col] = 1;
                }
                else { // logic
                    board[row][col] = board[row-1][col] + board[row][col-1];
                }
            }
        }
        
        return board[n-1][m-1]; // 도착 지점까지 도착하는 경우의 수 출력
    }
}

 

교훈점

현재 경우의 수를 구하기 위해서 이전 경우의 수를 구해야 하는 경우 매번 연산하는 것이 아니라 그 연산 결과를 저장하고 활용하여 연산 횟수를 줄일 수 있다. (메모이제이션)