문제 설명
개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.
대기실은 5개이며, 각 대기실은 5x5 크기입니다.거리두기를 위하여 응시자들 끼리는 맨해튼 거리1가 2 이하로 앉지 말아 주세요.단 응시자가 앉아있는 자리 사이가 파티션으로 막혀 있을 경우에는 허용합니다.
예를 들어,
위 그림처럼 자리 사이에 파티션이 존재한다면 맨해튼 거리가 2여도 거리두기를 지킨 것입니다. | 위 그림처럼 파티션을 사이에 두고 앉은 경우도 거리두기를 지킨 것입니다. | 위 그림처럼 자리 사이가 맨해튼 거리 2이고 사이에 빈 테이블이 있는 경우는 거리두기를 지키지 않은 것입니다. |
---|---|---|
응시자가 앉아있는 자리(P)를 의미합니다. | 빈 테이블(O)을 의미합니다. | 파티션(X)을 의미합니다. |
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places
가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.
제한사항
places
의 행 길이(대기실 개수) = 5places
의 각 행은 하나의 대기실 구조를 나타냅니다.
places
의 열 길이(대기실 세로 길이) = 5places
의 원소는P
,O
,X
로 이루어진 문자열입니다.places
원소의 길이(대기실 가로 길이) = 5P
는 응시자가 앉아있는 자리를 의미합니다.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] |
그래프 탐색을 시도했다가, 코드가 지저분해지는 것을 보고 ‘질문하기’에 들어가서 아래 링크 분의 코드를 보고 이해하고 스스로 짜보았다
풀이방식
바로 answer에 map을 사용해서 정답 포멧으로 변환하기 때문에 코드가 깔끔하다.
Key Point
- 문제의 핵심은 P의 상하좌우 중 P가 하나라도 있으면 거리두기가 안 지켜지고 있는 것이고, O의 상하좌우 중 P가 2개 이상 있으면 거리두기가 안 지켜지고 있다는 것이다.
some
함수는or
같은 개념으로 조건을 배열의 한 원소라도 조건을 통과하면 true를 return하고,every
는and
같은 개념으로 모든 원소가 조건을 통과해야 true를 반환한다.- some은 세개의 인자를 받는다 .첫번째는 현재 인덱스의 값, 두번째는 인덱스, 세번째는 some을 호출한 배열이다.
- 이 문제에서는 한번이라도 거리두기가 안 지켜지면 그 대기실 전체가 안 지켜지고 있는 것으로 간주하기 때문에
some
을 사용하고, 그 내부에 some을 하나 더 둔다. 이 some의 목적은, P의 상하좌우에 P가 하나 이상 있든지, O의 상하좌우에 P가 2개 이상 있든지, 한 사례라도 발견되면 거리두기 실패이기 때문에 이를 검증한다.
- String을 배열처럼 적용할 수 있게
split
으로 나눠준다. - peopleAround이라는 변수를 두고,
some
의 인자를 활용해서 상하좌우에 뭐가 있는지 파악하고,filter
와 length로 p의 개수를 파악한다. - 내부 some은 여기서 하나라도 조건에 해당하는지 파악하고, 만약 조건에 걸린다면 true, 아니라면 false를 바깥 some에 전달한다.
- 바깥 some은 전달받은 값이 true라면 0, 아니라면 1을 반환한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function solution(places) {
var answer = [];
answer = places.map((place) => {
//전체 대기실
return place.some((room, rowIdx) =>
room.split("").some((curr, colIdx, roomArr) => {
if (curr === "X") return false;
let peopleAround = [
roomArr[colIdx + 1] || "",
roomArr[colIdx - 1] || "",
(place[rowIdx + 1] || "")[colIdx],
(place[rowIdx - 1] || "")[colIdx],
].filter((curr) => curr == "P").length;
return (
(curr == "P" && peopleAround > 0) || (curr == "O" && peopleAround > 1)
);
})
)
? 0
: 1;
});
return answer;
}