[프로그래머스] 거리두기 확인하기 - javascript

Yongwoo Cho·2021년 12월 6일
0

알고리즘

목록 보기
55/104
post-thumbnail
post-custom-banner

📌 문제

https://programmers.co.kr/learn/courses/30/lessons/81302

📌 풀이

function solution(places) {
  let answer = [];
  for (const tc of places) {
    let flag = true;
    let arr = new Array(5);
    for (let i = 0; i < arr.length; i++) {
      arr[i] = [];
    }
    for (let i = 0; i < tc.length; i++) {
      arr[i] = tc[i].split("");
    }
    let dx = [0, 0, 1, -1];
    let dy = [1, -1, 0, 0];
    for (let i = 0; i < 5; i++) {
      for (let j = 0; j < 5; j++) {
        // 거리두기 위반 case 1 : P가 붙어있는 경우
        if (arr[i][j] === "P") {
          for (let k = 0; k < 4; k++) {
            if (
              i + dx[k] >= 0 &&
              i + dx[k] < 5 &&
              j + dy[k] >= 0 &&
              j + dy[k] < 5 &&
              arr[i + dx[k]][j + dy[k]] === "P"
            ) {
              flag = false;
            }
          }
        }
        // 거리두기 위반 case 2 : 빈테이블(O)주변(4방향)에 사람이 두명이상 존재
        if (arr[i][j] === "O") {
          let count = 0;
          for (let k = 0; k < 4; k++) {
            if (
              i + dx[k] >= 0 &&
              i + dx[k] < 5 &&
              j + dy[k] >= 0 &&
              j + dy[k] < 5 &&
              arr[i + dx[k]][j + dy[k]] === "P"
            ) {
              count++;
            }
            if (count > 1) {
              flag = false;
            }
          }
        }
      }
    }
    if (flag) {
      answer.push(1);
    } else {
      answer.push(0);
    }
  }
  return answer;
}

✔ 알고리즘 : 완전탐색 + 구현

✔ 반례를 통하여 거리두기가 지켜지는지 검사하였다.

✔ 위반되는 case 1
P를 만났을 때 4방향(상하좌우) 탐색하여 P를 만나면 거리두기가 위반된 경우이다.

✔ 위반되는 case 2
O를 만났을 때 4방향 탐색하여 P를 2번 이상 만나면 거리두기가 위반된 경우이다.

✔ 위반되는 case를 만나면 flag를 false로 변경

✔ flag가 true이면 거리두기가 잘 지켜진 경우이므로 answer에 1를 push, false이면 거리두기가 안지켜진 경우이므로 answer에 0을 push

✔ 난이도 : 프로그래머스 기준 LEVEL 2

profile
Frontend 개발자입니다 😎
post-custom-banner

0개의 댓글