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