알고리즘/프로그래머스
Programers 미로 탈출/ C++
내이름은 킹햄찌
2023. 2. 19. 21:10
https://school.programmers.co.kr/learn/courses/30/lessons/159993
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
아이디어
레버에 도착했을때와 도착하지 않았을때 2가지 상태의 map을 BFS를 이용하여 갱신하며 레버에 갔다온 상태의 end위치의 정보를 구하면 된다.
#include <string>
#include <vector>
#include <queue>
using namespace std;
int dy[4] = { 0,0,1,-1 };
int dx[4] = { 1,-1,0,0 };
class Point {
public:
Point() {}
Point(int _y, int _x) {
y = _y;
x = _x;
lever = false;
}
Point(int _y, int _x, bool _lever) {
y = _y;
x = _x;
lever = _lever;
}
int getY() {
return y;
}
int getX() {
return x;
}
void setArriveLiver() {
lever = true;
}
bool isLever() {
return lever;
}
private:
int y;
int x;
bool lever;
};
int solution(vector<string> maps) {
int answer = 0;
int n = maps.size(), m = maps[0].size();
Point start, end, lever;
vector<vector<vector<int>>> arr = vector<vector<vector<int>>>(2, vector<vector<int>>(n, vector<int>(m, -1)));
vector<vector<vector<bool>>> visited = vector<vector<vector<bool>>>(2, vector<vector<bool>>(n, vector<bool>(m, false)));
for (int i = 0; i < maps.size(); i++) {
for (int j = 0; j < maps[i].size(); j++) {
if (maps[i].at(j) == 'S') {
start = Point(i, j);
}
else if (maps[i].at(j) == 'L') {
lever = Point(i, j);
}
else if (maps[i].at(j) == 'E') {
end = Point(i, j);
}
}
}
queue<Point> q;
q.push(start);
visited[0][start.getY()][start.getX()] = true;
arr[0][start.getY()][start.getX()] = 0;
while (!q.empty()) {
int y = q.front().getY();
int x = q.front().getX();
bool lever = q.front().isLever();
q.pop();
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
bool nlever = lever;
if (ny >= n || ny < 0 || nx >= m || nx < 0) continue;
if (maps[ny][nx] == 'X') continue;
if (visited[nlever][ny][nx]) continue;
visited[nlever][ny][nx] = true;
if (maps[ny][nx] == 'L')
nlever = true;
arr[nlever][ny][nx] = arr[lever][y][x] + 1;
q.push(Point(ny, nx, nlever));
}
}
answer = arr[1][end.getY()][end.getX()];
return answer;
}
int main(void) {
vector<string> v = { "SOOOL","XXXXO","OOOOO","OXXXX","OOOOE" };
solution(v);
}