알고리즘 공부(C++)
[C++]프로그래머스 보행자 천국(동적 계획법 DP)
혀니리리
2023. 9. 7. 19:31
728x90
코딩테스트 연습 - 보행자 천국 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#include <vector>
using namespace std;
int MOD = 20170805;
int solution(int m, int n, vector<vector<int>> city_map) {
int answer = 0;
int right[501][501] = {0,};
int down[501][501] = {0,};
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == 1 && j == 1)
{
right[i][j] = 1;
down[i][j] = 1;
}
else
{
if(city_map[i - 1][j - 1] == 0)
{
right[i][j] = (right[i][j - 1] + down[i - 1][j]) % MOD;
down[i][j] = (right[i][j - 1] + down[i - 1][j]) % MOD;
}
else if(city_map[i - 1][j - 1] == 1)
{
right[i][j] = 0;
down[i][j] = 0;
}
else
{
right[i][j] = right[i][j - 1] % MOD;
down[i][j] = down[i - 1][j] % MOD;
}
}
}
}
return down[m][n] % MOD;
}
이런 제대로된 DP 문제는 거의 처음이지 않을까... 역시 사람이 도전은 해봐야 되는 것 같다.
처음이라 이해하는 데도 무척이나 오래 걸렸지만...
2는 위에서 왔을때와 왼쪽에서 왔을 떄 그 경우의 수 값을 갱신해주지 않는다고 생각하면 편함.
0은 무조건 왼쪽에서 오는 right 값 + 위에서 오는 down값의 합이며, 그것이 곧 정답이며, 그것이 곧 그 위치에서의 right값이자 down 값임.
따라서 답은 right가 돼도, down이 돼도 상관없음.
+ dp배열을 구하는 과정에서는 MOD로 나눠도 항상 같은 답이 나옴
+ dp같은 문제는 이전 인덱스 참조 ( - 1)해야 하므로 주어진 2차원 벡터와는 달리 0,0 대신 1,1에서 시작해주어야 -1 했을 때 정상적으로 0을 도출하기 때문에 완전 별개의 테이블을 만들었다고 생각하면 편하다.
이 모든것은 결국 0이라는 곳에 도달했을 때의 경로값을 구하기 위한 행동들이다.
728x90