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
- 프로그래머스
- 2020 카카오 인턴십
- DFS
- 월간 코드 챌린지
- 삼성 SW 역량 테스트
- 부스트코스
- 구현
- Level 4
- level 1
- 백트래킹
- Gold 5
- Web
- BFS
- c++
- next_permutation
- 2020 KAKAO BLIND
- 코드 리뷰
- 코드리뷰
- 브루트포스
- Level 3
- 그리디
- 스택/큐
- 백준
- pass
- 2019 KAKAO BLIND
- DP
- SWEA
- Gold 4
- 시뮬레이션
- Level 2
Archives
- Today
- Total
Min:D's Devlog
[프로그래머스][2017 카카오코드 예선][C++] 보행자 천국 본문
문제
프로그래머스 2017 카카오코드 예선 - 보행자 천국 (Level 3)
문제 풀이
접근 방식
출발점에서 도착점까지 이동 가능한 전체 경로의 수를 구하는 문제이다.
이 문제는 단순한 맵이 아닌 조건이 있는 맵이기 때문에 이를 고려하여 DP 방식으로 문제를 해결해주었다.
우선, map의 값이 0인 경우에는 모든 방향으로 움직일 수 있고,
1인 경우에는 갈 수 없으며, 2인 경우에는 직진만 가능하다.
2인 경우에 직진만 가능하기 때문에 수직 방향(↓)과 수평 방향(→)을 나눠서 고려해주어야 한다.
그래서 이중 for문을 돌며 V 벡터에는 수직 방향으로 갈 수 있는 경우의 수를 저장해주었고,
H 벡터에는 수평 방향으로 갈 수 있는 경우의 수를 저장해주어 최종적인 답을 구하였다.
풀이 코드 - C++
#include <vector>
using namespace std;
int MOD = 20170805;
int solution(int m, int n, vector<vector<int>> city_map) {
vector<vector<int>> V(m+1, vector<int>(n+1)); // 아래로 이동 가능 횟수
vector<vector<int>> H(m+1, vector<int>(n+1)); // 오른쪽으로 이동 가능 횟수
V[1][1] = 1, H[1][1] = 1;
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(city_map[i-1][j-1] == 0){
V[i][j] = (V[i][j] + V[i-1][j] + H[i][j-1]) % MOD;
H[i][j] = (H[i][j] + V[i-1][j] + H[i][j-1]) % MOD;
} else if(city_map[i-1][j-1] == 1){
V[i][j] = 0;
H[i][j] = 0;
} else{
V[i][j] = V[i-1][j];
H[i][j] = H[i][j-1];
}
}
}
return H[m][n];
}
실행 결과
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][2020 카카오 인턴십][C++] 수식 최대화 (0) | 2020.09.06 |
---|---|
[프로그래머스][2020 카카오 인턴십][C++] 보석 쇼핑 (0) | 2020.09.06 |
[프로그래머스][DP][C++] 도둑질 (0) | 2020.08.30 |
[프로그래머스][그리디][C++] 단속카메라 (0) | 2020.08.29 |
[프로그래머스][그리디][C++] 구명보트 (0) | 2020.08.28 |
Comments