Lv.2 - 거리두기 확인하기

·2022년 9월 21일
0

프로그래머스

목록 보기
17/18
post-thumbnail
  • PPOOX, POPXO같은 경우는 미리 거르고 시작하고 싶다.
    -> 해당 배열이 PPPOP를 포함하면 바로 0을 return

  • POOOP
    OOOPX
    [0,4]를 체크했을 때 [1,3] 때문에 틀린다는 걸 return하기 때문에 [1,3]에서 [0,4]를 체크할 필요가 없다.
    -> 먼젓번 행은 탐색할 필요가 없다.

  • POOPO
    OOPOX
    -> 먼젓번 열은 탐색할 필요가 있다.

PP, POP를 거른 다음, 각 P마다 왼쪽 대각선, 오른쪽 대각선, 아래 2칸 까지만 탐색하면 된다.

function solution(places) {
  const check = (i, j, place) => {
    if (i < 4) {
      if (place[i + 1][j] === "P") return false;
      if (i < 3 && place[i + 1][j] === "O" && place[i + 2][j] === "P")
        return false;
      if (
        j < 4 &&
        place[i + 1][j + 1] === "P" &&
        !(place[i + 1][j] === "X" && place[i][j + 1] == "X")
      ) {
        return false;
      }
      if (
        j > 0 &&
        place[i + 1][j - 1] === "P" &&
        !(place[i][j - 1] === "X" && place[i + 1][j] === "X")
      ) {
        return false;
      }
    }
    return true;
  };

  return places.reduce((acc, place) => {
    // 만약 배열 중에 PP나 POP를 포함하는 자리가 있다면 바로 0을 return
    if (place.some((s) => s.includes("PP") || s.includes("POP"))) {
      acc.push(0);
      return acc;
    }
    
    for (let i = 0; i < place.length; i++) {
      for (let j = 0; j < place[i].length; j++) {
        if (place[i][j] === "P") {
          // 각 P마다 아래 2칸, 양 대각선 탐색
          if (!check(i, j, place)) {
            acc.push(0);
            return acc;
          }
        }
      }
    }
    acc.push(1);
    return acc;
  }, []);
}
profile
모르는 것 투성이

0개의 댓글