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 | 31 |
Tags
- Lv2
- 우박수열정적분
- 프로그래머스
- div2개
- solved.ac플래티넘
- c++
- solved.ac골드
- 정렬
- 5강클로저
- pccp기출문제
- 타겟넘버
- [pccp 기출문제]
- 스택
- JS
- 이중지도
- 2023카카오블라인드코테
- React.StrictMode
- 백준 알고리즘
- 알고리즘 문제풀이
- JS스터디
- 두원사이의정수쌍
- 최소스패닝트리
- DP
- 지도 여러개
- 과제진행하기
- 코어자바스크립트
- 백준알고리즘
- 비트마스크
- Lv3
- 알고리즘문제풀이
Archives
- Today
- Total
호지
[프로그래머스] 미로 탈출 문제 풀이 c++ 본문
BFS문제의 변형이다.
시작지점에서 레버까지의 BFS로 최소거리를 구하고, 레버에서 출구까지 BFS로 최소거리를 구하면 된다
우선 maps를 전체 탐색하여 시작지점과 출구의 위치를 구한다.
큐를 2개 쓰거나, 반복문을 새로 시작하는 방법도 있었지만 반복문 하나에서 큐1개로 해결하기 위해 ck라는 변수를 활용했다.
S->L로 가는 동안 visit체크는 maps에 V를 표시하고 L에 도달하면 ck를 W로 바꿔서 W로 visit 체크를 한다.
L에 도달하기 전에 E에 먼저 도달한 경우는 L을 만나서 ck가 W로 바꿔야 레버를 먼저 동작시킨 것이므로 ck가 W일때만 출구에 도달한 것이 된다.
#include <string>
#include <vector>
#include <queue>
using namespace std;
struct Pos{
int x;
int y;
int cnt;
Pos(int a, int b, int c){
x = a; y = b; cnt = c;
}
};
int solution(vector<string> maps) {
Pos start(0,0,0), end(0,0,0);
for(int i=0; i<maps.size(); i++){
for(int j=0; j<maps[0].size(); j++){
if(maps[i][j] == 'S'){
start.x = i; start.y = j;
}
else if(maps[i][j] == 'E'){
end.x = i; end.y = j;
}
}
}
queue<Pos> q;
q.push(start);
int moves[4][2] = {{0,1}, {1,0}, {-1,0}, {0,-1}};
char ck = 'V';
while(!q.empty()){
int x = q.front().x;
int y = q.front().y;
int cnt = q.front().cnt;
for(int i=0; i<4; i++){
int nx = x + moves[i][0];
int ny = y + moves[i][1];
int ncnt = cnt + 1;
if(nx>=0 && nx<maps.size() && ny>=0 && ny<maps[i].size() && maps[nx][ny] != 'X' && maps[nx][ny] != ck){
if(maps[nx][ny] == 'L'){
while(!q.empty()) q.pop();
q.push(Pos(x,y,cnt));
q.push(Pos(nx,ny,ncnt));
ck = 'W';
maps[nx][ny] = ck;
break;
}
else if(nx == end.x && ny == end.y && ck =='W'){
return ncnt;
}
else{
q.push(Pos(nx,ny,ncnt));
maps[nx][ny] = ck;
}
}
}
q.pop();
}
return -1;
}
https://school.programmers.co.kr/learn/courses/30/lessons/159993
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 추억 점수 문제풀이 JS (0) | 2023.07.19 |
---|---|
[프로그래머스] 달리기 경주 문제풀이 JS (0) | 2023.07.19 |
[프로그래머스] 혼자서 하는 틱택토 c++ (0) | 2023.05.04 |
[프로그래머스] 미로 탈출 명령어 c++ (0) | 2023.04.14 |
[프로그래머스] 표 병합 c++ (0) | 2023.04.06 |
Comments