Study hard

(c++)프로그래머스 코딩테스트 연습 - 등굣길 본문

프로그래머스/DP

(c++)프로그래머스 코딩테스트 연습 - 등굣길

Nimgnoej 2020. 10. 20. 20:17

programmers.co.kr/learn/courses/30/lessons/42898

 

코딩테스트 연습 - 등굣길

계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다. 아래 그림은 m =

programmers.co.kr

[풀이]

오른쪽과 아래로만 움직이면 갈 수 있는 지도의 면적이 작게 쪼개지므로 DP를 사용해 풀 수 있다.

점화식

DP[i][j] : (i,j)좌표로 가는 최단 경로의 수

DP[i][j] = DP[i-1][j] + DP[i][j-1]

#include <string>
#include <vector>

using namespace std;
const int D = 1000000007;

int dp[101][101];

void DP(int m, int n) {
	dp[1][1] = 1;
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			//물에 잠긴 지역이면
			if (dp[i][j] == -1) {
				dp[i][j] = 0;
				continue;
			}
			if (i == 1 && j == 1)
				continue;
			//1행이면
			if (i - 1 < 1)
				dp[i][j] = dp[i][j - 1];
			//1열이면
			else if (j - 1 < 1)
				dp[i][j] = dp[i - 1][j];
			else
				dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % D;
		}
	}
}

int solution(int m, int n, vector<vector<int>> puddles) {
	int answer = 0;
	for (int i = 0; i < puddles.size(); i++) {
		dp[puddles[i][0]][puddles[i][1]] = -1;
	}
	DP(m, n);
	answer = dp[m][n] % D;
	return answer;
}