Home 프로그래머스 - 거리두기 Javascript
Post
Cancel

프로그래머스 - 거리두기 Javascript

문제 설명

개발자를 희망하는 죠르디가 카카오에 면접을 보러 왔습니다.코로나 바이러스 감염 예방을 위해 응시자들은 거리를 둬서 대기를 해야하는데 개발 직군 면접인 만큼아래와 같은 규칙으로 대기실에 거리를 두고 앉도록 안내하고 있습니다.

대기실은 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을 담습니다.

입출력 예

placesresult
[[“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하고, everyand 같은 개념으로 모든 원소가 조건을 통과해야 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;
}
This post is licensed under CC BY 4.0 by the author.

프로그래머스 - 위장 Javascript

프로그래머스 - 스킬트리 Javascript