프로그래머스 : 거리두기

KHW·2021년 11월 15일
0

코딩테스트

목록 보기
11/17
post-custom-banner

문제

100/100
1시간 반 이상

의도한 것

거리두기를 지키지 않는 시기를 배열로 순회하면서 찾으면 그때에 값을 나중에 확인해서 문제가 있는 것이면 리턴 값을 처리한다.
5*5 행렬이므로 효율성 문제는 순회하는데 거의 별일 없다고 판단

배열을 순회하면서 문제가 발생하는 경우를 IsDistancing이라는 함수를 통해 체크를 진행하였다.

문제점

a[i][j]기준으로 a[i][j+1]이나 a[i][j+2]와 비교를 하는데
배열을 넘어서는 문제가 발생하거나 이를 해결해도
a[a.length-2][a.length-2]가 a[a.length-1][a.length-1] 같은 것을 확인 할 수 없는 상황이 발생했다.

해결방법

기존에 5*57*7로 바꾸었다.
해당 추가되는 부분은 전부 파티션으로 처리하여 5*5와 결과에는 문제가 없이 처리했고 이를 통해 기존에 5*5의 뒤쪽부분에서 체크하지 못하는 것까지 쉽게 처리할 수 있다.

해결코드

const IsDistancing = (places7x7, i, j, k) => {
  if (places7x7[i][j][k] === "P") {
    if (places7x7[i][j][k + 1] === "P" || places7x7[i][j + 1][k] === "P")
      return false;

    if (places7x7[i][j + 1][k + 1] === "P") {
      if (places7x7[i][j + 1][k] === "O" || places7x7[i][j][k + 1] === "O")
        return false;
    }

    if (places7x7[i][j + 2][k] === "P" && places7x7[i][j + 1][k] === "O")
      return false;

    if (places7x7[i][j][k + 2] === "P" && places7x7[i][j][k + 1] === "O")
      return false;
  } else if (places7x7[i][j][k] === "X") {
    if (
      places7x7[i][j][k + 1] === "P" &&
      places7x7[i][j + 1][k] === "P" &&
      places7x7[i][j + 1][k + 1] === "O"
    )
      return false;
  } else if (places7x7[i][j][k] === "O") {
    if (places7x7[i][j][k + 1] === "P" && places7x7[i][j + 1][k] === "P")
      return false;
  }

  return true;
};

function solution(places) {
  let rowArr = [];
  let answer = [];
  let isProblem = false;
  let places7x7 = [...places];

  places7x7 = places7x7.map((arr) => {
    arr = arr.map((val) => {
      val = val.concat("X");
      val = val.concat("X");
      return val;
    });
    arr.push("XXXXXXX");
    arr.push("XXXXXXX");
    return arr;
  });

  // 각각의 arr 실행
  places.forEach((waitRoomArr, i) => {
    isProblem = false;
    // 5*5 행렬 waitRoomArr 실행
    waitRoomArr.forEach((rows, j) => {
      rowArr = [];
      // 1~5행을 각각 실행  (크게만든 6,7행은 순회해도 의미가 없으니 순회하지않는다.)
      isProblem = rows.split("").some((_, k) => {
        rowArr.push(IsDistancing(places7x7, i, j, k));
        return rowArr.indexOf(false) > -1;
      });
    });

    if (isProblem) answer.push(0);
    else answer.push(1);
  });
  return answer;
}

console.log(
  solution([
    ["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"],
  ])
);

IsDistancing은 해당 배열 위치값에서 거리두기를 하지 못했을때 false를 거리두기를 했을때 true를 리턴하여
해당 값들을 answer에 넣고 false가 존재한다면 해당 문제를 정리한다.

팀원들과 피드백

배열은 문제가 발생하는 때는 일차원배열이 undefined일때 이차원부분을 찾으려할때 Error가 발생한다.

let arr = [[],[],[],[]]

arr[100]	//undefined
arr[1][100]	//undefined
arr[4]	//undefined
arr[5][100]	//Error

일차원배열의 접근 가능한 [0][1][2][3]의 경우는 접근 가능하고
그외의 일차원 배열은 전부 undefined이다.
이차원배열의 경우 [0][1][2][3]을 제외한 부분에서 접근시
Error가 난다.
왜냐하면 arr[5]는 undefined인데 undefined의 100번째 배열을 찾으려하기 때문이다.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자
post-custom-banner

0개의 댓글