algorithm & data structure
[프로그래머스] 등굣길 / DP, Dynamic Programming
leo_roh
2023. 7. 24. 18:26
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42898
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 접근
물에 잠기지 않은 어떠한 지역에 대해 그 곳에 오는 방법은 바로 위쪽 지역에서 오는 방법(1)과 바로 왼쪽 지역에서 오는 방법(2)이 있다.
따라서 현재 지역으로 오는 방법의 수는 (1)과 (2)의 합으로 나타낼 수 있다. 시작 지역(집)에 오는 방법을 1로 초기화 하고 다른 지역들에 도착하는 방법의 수를 갱신해나가면 된다.
코드
#include <string>
#include <vector>
#define DIV (1000000007)
using namespace std;
int solution(int m, int n, vector<vector<int>> puddles) {
int answer = 0;
int map[101][101];
for (int x = 1; x <= m; ++x) {
for (int y = 1; y <= n; ++y) {
map[x][y] = 0;
}
}
for (const auto& p : puddles) {
map[p[0]][p[1]] = -1;
}
map[1][1] = 1; //집
for (int x = 1; x <= m; ++x) {
for (int y = 1; y <= n; ++y) {
if (map[x][y] == -1) { continue; } //물에 잠긴 지역은 스킵
//어떤 물에 잠기지 않은 지역의 왼쪽으로 부터 진입하는 경우
int plx = x - 1; //previoius left x
int ply = y; //previous left y
if (plx >= 1 && ply >= 1 && plx <= m && ply <= n && map[plx][ply] != -1) {
map[x][y] += map[plx][ply];
map[x][y] %= DIV;
}
//어떤 물에 잠기지 않은 지역의 위쪽으로 부터 진입하는 경우
int pux = x; //previous up x
int puy = y - 1; //previous up y
if (pux >= 1 && puy >= 1 && pux <= m && puy <= n && map[pux][puy] != -1) {
map[x][y] += map[pux][puy];
map[x][y] %= DIV;
}
}
}
answer = map[m][n];
return answer;
}