문제
https://school.programmers.co.kr/learn/courses/30/lessons/42898
예시 코드
function solution(m, n, puddles) {
const board = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
for (let i = 0; i < puddles.length; i++) {
const [x, y] = puddles[i];
board[x][y] = 1;
}
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
dp[0][1] = 1;
const MOD = 1000000007;
const PUDDLE = 1;
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
if (board[i][j] === PUDDLE) continue;
dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
}
}
return dp[m][n];
}
풀이
목적지까지 도달할 수 있는 최단 경로의 수를 구하는 문제입니다.
2차원 좌표 위를 움직이고, 이동 방향이 오른쪽 또는 아래로 한정되어 있어 DP를 사용할 수 있습니다.
dp[i][j]는 (i, j) 칸에 도달할 수 있는 최단 경로의 수를 나타냅니다.
어떤 칸에 도달할 수 있는 최단 경로의 수는 다음과 같습니다.
'해당 칸의 왼쪽 칸에 도달할 수 있는 최단 경로의 수' + '해당 칸의 위쪽 칸에 도달할 수 있는 최단 경로의 수'
이를 점화식으로 나타내면 다음과 같습니다.
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
코드를 간결하게 하기 위해 dp[0][1]을 1로 초기화했습니다.
board를 순회하며 dp 배열의 값을 갱신하는데, 물에 잠겨있는 칸의 경우 스킵합니다.
dp[m][n]을 반환하면 원하는 결과를 얻을 수 있습니다.
'Coding Problem' 카테고리의 다른 글
[프로그래머스] 2021 Dev-Matching: 웹 백엔드 개발자(상반기) - 다단계 칫솔 판매 (0) | 2024.11.10 |
---|---|
[프로그래머스] 2019 카카오 개발자 겨울 인턴십 - 징검다리 건너기 (0) | 2024.11.08 |
[프로그래머스] 다음 큰 숫자 (0) | 2024.03.20 |
[프로그래머스] 2022 카카오 테크 인턴십 - 두 큐 합 같게 만들기 (0) | 2024.03.19 |