https://programmers.co.kr/learn/courses/30/lessons/81302
코딩테스트 연습 - 거리두기 확인하기
[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] [1, 0, 1, 1, 1]
programmers.co.kr
문제 설명

문제 설명
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.
코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼
아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
- 대기실은 5개이며, 각 대기실은 5x5 크기입니다.
- 거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.
- 단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,



위 그림처럼 자리 사이에 파티션이 존재한다면 맨해튼 거리가 2여도 거리두기를 지킨 것입니다. | 위 그림처럼 파티션을 사이에 두고 앉은 경우도 거리두기를 지킨 것입니다. | 위 그림처럼 자리 사이가 맨해튼 거리 2이고 사이에 빈 테이블이 있는 경우는 거리두기를 지키지 않은 것입니다. |
응시자가 앉아있는 자리(P)를 의미합니다. | 빈 테이블(O)을 의미합니다. | 파티션(X)을 의미합니다. |
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
- places의 행 길이(대기실 개수) = 5
- places의 각 행은 하나의 대기실 구조를 나타냅니다.
- places의 열 길이(대기실 세로 길이) = 5
- places의 원소는 P,O,X로 이루어진 문자열입니다.
- places 원소의 길이(대기실 가로 길이) = 5
- P는 응시자가 앉아있는 자리를 의미합니다.
- O는 빈 테이블을 의미합니다.
- X는 파티션을 의미합니다.
- 입력으로 주어지는 5개 대기실의 크기는 모두 5x5 입니다.
- return 값 형식
- 1차원 정수 배열에 5개의 원소를 담아서 return 합니다.
- places에 담겨 있는 5개 대기실의 순서대로, 거리두기 준수 여부를 차례대로 배열에 담습니다.
- 각 대기실 별로 모든 응시자가 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 담습니다.
입출력 예
places | result |
[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]] | [1, 0, 1, 1, 1] |
문제 풀이
function solution(places) {
let answer = [1, 1, 1, 1, 1];
const dx = [1, -1, 0, 0];
const dy = [0, 0, 1, -1];
let queue = [];
function BFS(x, y, index) {
places[index][x][y] = "O";
for (let i = 0; i < 4; i++) {
const nx = x + dx[i];
const ny = y + dy[i];
if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5) {
if (places[index][nx][ny] === "O") {
queue.push([nx, ny]);
} else if (places[index][nx][ny] === "P") {
answer[index] = 0;
break;
}
}
}
}
for (let j = 0; j < 5; j++) {
places[j] = places[j].map((x) => x.split(""));
for (let k = 0; k < 5; k++) {
for (let l = 0; l < 5; l++) {
queue = [];
if (places[j][k][l] === "P") {
BFS(k, l, j);
let newQueue = queue.slice();
for (let m of newQueue) {
if (places[j][m[0]][m[1]] === "O") BFS(...m, j);
}
}
}
}
}
return answer;
}
BFS를 이용하여 문제를 풀었다.
'P'를 기준으로 2칸 이내에 다른 P가 없으면 되니까 상하좌우 BFS를 2번씩 진행한다.
이때 'X'를 만나거나 'P'가 없으면 문제가 없는 것이다.
'P'를 만나면 그 place는 0을 리턴하면 된다.
'CS > Algorithm\Coding Test' 카테고리의 다른 글
프로그래머스 : 가장 먼 노드 - javascript (0) | 2022.01.18 |
---|---|
프로그래머스 : 신고 결과 받기 - javascript (0) | 2022.01.18 |
LeetCode : 6 - javascript (0) | 2021.12.23 |
프로그래머스 : 다리를 지나는 트럭-javascript (0) | 2021.12.22 |
프로그래머스 : H-index-javascript (2) | 2021.12.20 |