문제 해석
문제 설명
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
![]() |
![]() |
![]() |
---|---|---|
위 그림처럼 자리 사이에 파티션이 존재한다면 맨해튼 거리가 2여도 거리두기를 지킨 것입니다. | 위 그림처럼 파티션을 사이에 두고 앉은 경우도 거리두기를 지킨 것입니다. | 위 그림처럼 자리 사이가 맨해튼 거리 2이고 사이에 빈 테이블이 있는 경우는 거리두기를 지키지 않은 것입니다. |
응시자가 앉아있는 자리(P)를 의미합니다. | 빈 테이블(O)을 의미합니다. | 파티션(X)을 의미합니다. |
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
문제 풀이
맨허튼 거리로 2이면 단순 2회 이동하였을 때로 생각하였고 5 x 5 사이즈이므로 완전탐색이 가능할 것으로 예측했다.
BFS로 풀이를 하기에는 2회 이동한 경우를 고려하기 너무 까다로울 것 같아 DFS로 동서남북 방향으로 2회 이동을 조건으로 생각하게 되었다.
DFS로 풀이를 할 때 X(벽) 을 만나게 되면 그 진행방향으로는 어디로 가도 벽에 막히게 되어 거리두기가 된 것으로 판단하고 true로 설정하였고 다른 어떤 방향에서 한 번이라도 불가능을 만나게 된다면 false를 계속 리턴할 수 있도록 설계하였다.
코 드
#include <bits/stdc++.h>
using namespace std;
vector<string> room;
vector<vector<bool>> visited;
int move_row[] = {1,-1,0,0};
int move_col[] = {0,0,1,-1};
vector< pair<int,int> > find_people() {
vector< pair<int,int> > people;
for(int row = 0 ; row < room.size() ; row++) {
for(int col = 0 ; col < room[row].length() ; col++) {
if(room[row][col] == 'P') {
people.push_back(make_pair(row, col)) ;
}
}
}
return people;
}
bool is_nearby(int depth, int row, int col) {
if(depth == 3) return true;
if(depth != 0 && room[row][col] == 'P') return false ;
if(room[row][col] == 'X') return true;
bool result = true;
for(int i = 0 ; i < 4 ; i++) {
int next_row = row + move_row[i];
int next_col = col + move_col[i];
if(next_row < 0 || next_row >= 5 || next_col < 0 || next_col >= 5) continue;
if(!visited[next_row][next_col]) {
visited[next_row][next_col] = 1;
bool around = is_nearby(depth + 1, next_row, next_col);
visited[next_row][next_col] = 0;
result = result & around;
}
}
return result;
}
bool check_distance(vector< pair<int,int> > people) {
for (pair<int,int> person : people) {
int row = person.first;
int col = person.second;
visited = vector<vector<bool>>(5, vector<bool>(5));
visited[row][col] = 1;
if(is_nearby(0, row, col) == false)
return false;
}
return true;
}
vector<int> solution(vector<vector<string>> places) {
vector<int> answer;
for (vector<string> place : places) {
room = place;
bool check = check_distance(find_people()) ;
answer.push_back(check);
}
return answer;
}
느낀점: 생각보다 내가 복잡하게 풀어낸 것 같다. 더 쉬운 방법이 많아보여 좀 아쉬웠다.
링크: https://school.programmers.co.kr/learn/courses/30/lessons/81302
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Python] 수식 최대화 (0) | 2023.11.23 |
---|---|
[프로그래머스/Python] 순위 검색 (0) | 2023.11.22 |
[프로그래머스/C++] 빛의 경로 사이클 (0) | 2023.11.02 |
[프로그래머스/C++] 전력망을 둘로 나누기 BFS / 유니온파인드 (0) | 2023.10.18 |
[프로그래머스/Python] 교점에 별 만들기 (0) | 2023.10.16 |