[프로그래머스]
프로그래머스 거리두기 확인하기
Hevton
2023. 10. 9. 19:37
반응형
카카오 채용연계형 인턴십 문제이다.
2021년 당시에는 풀지도 못한 문제였는데.
2년이 지난 지금, 20분만에 풀었다.
나는 BFS를 이용해 풀었는데, depth를 계산하다가 맨헤튼 거리가 2가 넘어가는 순간 실패로 책정했다.
#include <string>
#include <vector>
#include <cstring>
#include <queue>
// 20
using namespace std;
bool visit[5][5];
int mx[4] = {0, 0, -1, 1};
int my[4] = {1, -1, 0, 0};
bool bfs(vector<string>& place, int sx, int sy) {
queue<pair<pair<int ,int>, int>> que;
que.push({{sx, sy}, 0});
visit[sx][sy] = true;
while(!que.empty()) {
int x = que.front().first.first;
int y = que.front().first.second;
int d = que.front().second;
que.pop();
for(int i = 0; i < 4; i++) {
int tx = x + mx[i];
int ty = y + my[i];
if(tx < 0 || tx >= 5 || ty < 0 || ty >= 5)
continue;
if(!visit[tx][ty]) {
if(place[tx][ty] == 'O') {
que.push({{tx, ty}, d + 1});
visit[tx][ty] = true;
} else if(place[tx][ty] == 'P') {
if(d + 1 <= 2)
return false;
else {
que.push({{tx, ty}, d + 1});
visit[tx][ty] = true;
}
}
}
}
}
return true;
}
vector<int> solution(vector<vector<string>> places) {
vector<int> answer;
for(auto place : places) {
bool flag = true;
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 5; j++) {
if(place[i][j] == 'P') {
memset(visit, 0, sizeof(visit));
if(!bfs(place, i, j)) {
flag = false;
}
}
}
}
if(flag)
answer.push_back(1);
else
answer.push_back(0);
}
return answer;
}
다른 분의 풀이도 봤는데, 신기한 풀이가 있었다.
그 분은 모든 2차원 반복문을 돌며, P를 만날 때면 상하좌우를 체크해준다. (갈 수 있는 O일 경우) 이게 끝이다.
문제에서 주어진 맨헤튼거리가 2이상이면 거리두기에 실패한 것이고, 맨헤튼거리가 2이상이라는건
한쪽에서 한칸으로 갈 수 있다면 다른 한 쪽에서도 한칸으로 갈 수 있는 것이다.
이 원리를 이용하신 것..! 감탄했다.
반응형