https://school.programmers.co.kr/learn/courses/30/lessons/1832
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
경우의 수를 찾는 문제이다. 처음에 dfs로 풀다가 m과 n이 꽤 큰 것을 보고 시간 초과가 날 거 같아 방식을 바꿨다.
한 지점 A가 있으면 왼쪽과 위쪽에 위치한 지점의 경우의 수를 더해주는 방식으로 해줬다. 이 때 좌회전 우회전 금지일 경우 한 칸 더 전으로 계산해주었다.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#include <memory.h>
using namespace std;
int MOD = 20170805;
//void dfs(int m, int n, int direct){
// if(m>=realMap.size()||n>=realMap[0].size()){
// return;
// }
// if(m==realMap.size()-1&&n==realMap.size()-1){
// sum=(sum+1)%MOD;
// }
// if(realMap[m][n]==1){
// return;
// }else if(realMap[m][n]==2){
// //direct가 1이면 아래, 2이면 오른쪽
// if(direct==1){
// dfs(m+1,n,1);
// }else{
// dfs(m,n+1,2);
// }
// }else{
// dfs(m+1,n,1);
// dfs(m,n+1,2);
// }
//}
// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int m, int n, vector<vector<int>> city_map) {
int answer = 0;
int resultMap[500][500];
memset(resultMap, 0, sizeof(resultMap));
resultMap[0][0]=1;
for(int i = 1; i<n; i++){
if(city_map[0][i]==1){
resultMap[0][i]=0;
}else{
resultMap[0][i]=resultMap[0][i-1];
}
}
for(int i = 1; i<m; i++){
if(city_map[i][0]==1){
resultMap[i][0]=0;
}else{
resultMap[i][0]=resultMap[i-1][0];
}
}
for(int i = 1; i<m; i++){
for(int j=1; j<n; j++){
if(city_map[i][j]==2){
continue;
}else if(city_map[i][j]==1){
city_map[i][j]=0;
}else{
if(city_map[i][j-1]==2){
int tmp = 2;
while(j-tmp>=0&&city_map[i][j-tmp]==2){
tmp++;
}
if(j-tmp>=0){
resultMap[i][j]=(resultMap[i][j]+resultMap[i][j-tmp])%MOD;
}
}else{
resultMap[i][j]=(resultMap[i][j]+resultMap[i][j-1])%MOD;
}
if(city_map[i-1][j]==2){
int tmp = 2;
while(i-tmp>=0&&city_map[i-tmp][j]==2){
tmp++;
}
if(i-tmp>=0){
resultMap[i][j]=(resultMap[i][j]+resultMap[i-tmp][j])%MOD;
}
}else{
resultMap[i][j]=(resultMap[i][j]+resultMap[i-1][j])%MOD;
}
}
}
}
// for(int i = 0 ; i<m; i++){
// for(int j = 0 ; j<n; j++){
// cout<<resultMap[i][j]<<" ";
// }
// cout<<endl;
// }
return answer=resultMap[m-1][n-1];
}
'코딩테스트 > C++' 카테고리의 다른 글
[프로그래머스 Level 3] 표현 가능한 이진트리 (C++) (0) | 2024.11.06 |
---|---|
[프로그래머스 Level 3] 미로 탈출 명령어 (C++) (0) | 2024.10.21 |
[프로그래머스 Level 3] 길 찾기 게임 (C++) (0) | 2024.10.09 |
[프로그래머스 Level 3] 합승 택시 요금 (C++) (0) | 2024.09.30 |
플로이드 워셜 알고리즘 (0) | 2024.09.27 |