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

제한 사항
- 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 bfs(place, [firstX, firstY]) {
// 탐색을 진행할 위치를 저장하는 큐 (x, y, 이동거리)
const queue = [[firstX, firstY, 0]];
// 방문 표시 배열
const visited = Array.from(Array(5), () => Array(5).fill(false));
// 상하좌우 이동하기 위한 배열
const move = [[-1, 0], [0, 1], [1, 0], [0, -1]];
// 탐색 시작 위치는 방문 표시해줌
visited[firstX][firstY] = true;
while(queue.length !== 0) {
const [currentX, currentY, currentCnt] = queue.shift();
for(let i = 0; i < 4; i++) {
const nextX = currentX + move[i][0];
const nextY = currentY + move[i][1];
const nextCnt = currentCnt + 1;
// 다음에 이동할 위치가 대기실을 벗어나거나 ||
// 이미 방문한 적이 있거나 ||
// 파티션이 있는 곳이라면 탐색하지 않음
if(nextX < 0 || nextX >= 5 || nextY < 0 || nextY >= 5
|| visited[nextX][nextY] || place[nextX][nextY] === 'X') {
continue;
}
// 다음에 이동할 거리가 2 이하일 때
if(nextCnt <= 2) {
// 그곳에 사람이 있다면 거리두기 안 지킨 거니까 0 리턴
if(place[nextX][nextY] === 'P') {
return 0;
}
// 사람 없으면 계속 탐색해야 하기 때문에 큐에 정보 넣어줌
queue.push([nextX, nextY, nextCnt]);
// 방문 표시해줌
visited[nextX][nextY] = true;
}
}
}
return 1;
}
function solution(places) {
const answer = [];
places.forEach((place) => {
// 대기실 구조를 저장할 배열
const tempPlace = []
// 사람들의 위치를 담을 배열
const peopleLocation = []
let peopleLocationLength;
place.forEach((row, rowIndex) => {
// 문자열을 배열로 만듬
const splitRow = row.split("")
// 사람 위치
let peopleIndex = splitRow.indexOf("P");
// 배열로 만든 대기실 구조를 한 행씩 넣어줌
tempPlace.push(splitRow)
// 사람들의 위치를 계속 찾아서 배열에 넣어줌
while(peopleIndex !== -1) {
peopleLocation.push([rowIndex, peopleIndex])
peopleIndex = splitRow.indexOf("P", peopleIndex + 1)
}
})
peopleLocationLength = peopleLocation.length;
// 대기실에 사람이 없으면 모두 거리두기를 지킨 것이므로 1 넣어줌
if(peopleLocationLength === 0) {
answer.push(1)
}
else {
let result = 1;
// 대기실 내 모든 사람들이 거리두기 지켰는지 확인하기 위해
// 한 명씩 bfs 돌려봄
for(let i = 0; i < peopleLocationLength; i++) {
result = bfs(tempPlace, peopleLocation[i]);
// 거리두기 안 지켰으면 반복문 즉시 종료
if(result === 0) {
break;
}
}
answer.push(result);
}
})
return answer;
}
'알고리즘 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스 LEVEL2] 양궁대회 / Javascript (0) | 2022.02.28 |
---|---|
[프로그래머스 LEVEL2] 기능개발 / Javascript (0) | 2022.02.19 |
[프로그래머스 LEVEL1] 소수 찾기 / Javascript (0) | 2022.02.19 |
[프로그래머스 LEVEL1] 체육복 / Javascript (0) | 2022.02.19 |
[프로그래머스 LEVEL1] 행렬 테두리 회전하기 / Javascript (0) | 2022.02.19 |