Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- hackerank
- 백준
- 언리얼 커스텀 플러그인
- UActor
- UnrealMP
- 비재귀셰그먼트
- 5639
- 오손데이터읽기
- 민겸수
- C++
- OS
- 트랜잭션 관리
- SQL
- 백준 1253번
- FBX
- objtofbx
- Unreal
- 셰그먼트트리
- 의미와 무의미의 경계에서
- 1967번
- 실습
- oracle
- 1759번
- Linux
- 데이터베이스 배움터
- 2단계로킹
- command not found
- 1253번
- Security
- 언리얼 플러그인
Archives
- Today
- Total
fatalite
등굣길 - 프로그래머스 본문
문제
문제 난이도 : 3단계
문제 분류 : 다이나믹 프로그래밍
문제 리뷰
저번에 풀어본 문제와 비슷하고 그것보다 쉬워서 금방 풀었다.
만약 BFS 같은 탐색을 사용하였다면, 조합이 폭발적으로 상승해서 시간 초과나 메모리 초과가 뜨지 않았을까 싶다.
초등학교 때 배웠던 경우의 수 개념을 사용하면 좋은 문제이다.
- Base Case로 DP[1][2 ~ N]과 DP[2 ~ N][1]를 처리해준다. 한 가지 밖에 없거나, 가는 길에 개울이 있다면 0이 된다.
- DP[i][j]는 j,i로 가는 경우의 수를 저장한다.
DP[i][j]로 오는 방법은 DP[i-1][j] + DP[i][j-1] 이므로 이를 사용하면 되고, 만약 개울이 있다면 0으로 처리한다.
문제 소스코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int DP[101][101];
int solution(int m, int n, vector<vector<int>> puddles) {
int answer = 0;
DP[1][1] = 1;
vector<vector<bool>> Map(n+1, vector<bool>(m+1));
for(vector<int> v: puddles){
Map[v[1]][v[0]] = true;
}
for(int i = 2; i <= m; i++){
if(DP[1][i - 1] != 0) DP[1][i] = 1;
if(Map[1][i] == true) DP[1][i] = 0;
}
for(int i = 2; i <= n; i++){
if(DP[i-1][1] != 0) DP[i][1] = 1;
if(Map[i][1] == true) DP[i][1] = 0;
}
for(int i = 2; i <= n; i++){
for(int j = 2; j <= m; j++){
if(Map[i][j] != true){
DP[i][j] = DP[i-1][j] + DP[i][j-1];
}
DP[i][j] %= 1000000007;
}
}
answer = DP[n][m];
return answer;
}
'코딩 인터뷰 > 프로그래머스' 카테고리의 다른 글
도둑질 - 프로그래머스 (0) | 2023.10.15 |
---|---|
사칙 연산 - 프로그래머스 (0) | 2023.10.15 |
C++ 주식 가격 [고득점 Kit 스택 / 큐] (0) | 2023.05.13 |
C++ 다리를 지나는 트럭 [고득점 Kit 스택 / 큐] (0) | 2023.05.13 |
C++ 프로세스 [고득점 Kit 스택 / 큐] (0) | 2023.05.13 |