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
- 월간 코드 챌린지
- 스택/큐
- SWEA
- 백준
- 시뮬레이션
- 2020 KAKAO BLIND
- 코드리뷰
- Web
- Gold 5
- 브루트포스
- 2020 카카오 인턴십
- next_permutation
- 백트래킹
- 그리디
- 부스트코스
- Level 3
- 삼성 SW 역량 테스트
- 2019 KAKAO BLIND
- 프로그래머스
- c++
- pass
- Level 2
- 코드 리뷰
- Gold 4
- BFS
- DFS
- level 1
- Level 4
- 구현
- DP
Archives
- Today
- Total
Min:D's Devlog
[프로그래머스][2017 카카오코드 예선][C++] 보행자 천국 본문
문제
프로그래머스 2017 카카오코드 예선 - 보행자 천국 (Level 3)
코딩테스트 연습 - 리틀 프렌즈 사천성
리틀 프렌즈 사천성 언제나 맛있는 음식들이 가득한 평화로운 푸드 타운. 푸드 타운에서 행복하게 사는 리틀 프렌즈들은 마을에 있는 매직 스푼을 보물처럼 보관하고 있다. 매직 스푼은 재료만
programmers.co.kr
문제 풀이
접근 방식
출발점에서 도착점까지 이동 가능한 전체 경로의 수를 구하는 문제이다.
이 문제는 단순한 맵이 아닌 조건이 있는 맵이기 때문에 이를 고려하여 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