function solution(places) {
var answer = [];
let isDone = false; // 반복을 덜 하기 위한 flag 변수
// 거리두기가 위반될 경우의 좌표 종류
let directArr = [[0, 2], [1, 1], [2, 0], [1, -1], [0, -2], [-1, -1], [-2, 0], [-1, 1], [1, 0], [0, 1], [-1, 0], [0, -1]];
places.forEach(place => {
place = place.map(v => v.split(''));
for(let i = 0; i < 5; i++ ){
for(let j = 0; j < 5; j++) {
if(place[i][j] === 'P') {
// 거리부터 확인
let i2, j2;
for(let k = 0; k < directArr.length; k++) {
i2 = directArr[k][0] + i;
j2 = directArr[k][1] + j;
if(i2 < 0 || i2 > 4 || j2 < 0 || j2 > 4){
continue;
}
if(place[i2][j2] === 'P') {
let dx = i > i2 ? i - i2 : i2 - i
let dy = j > j2 ? j - j2 : j2 - j
let d = dx + dy;
if(d === 1) { // 1. 바로 인접한 경우
isDone = true;
break;
} else if(dx === 2 || dy === 2) { // 2. 직선으로 위반한 경우
if((dx === 2 && place[Math.min(i, i2) + 1][j] !== 'X') || (dy === 2 && place[i][Math.min(j, j2) + 1] !== 'X')) {
isDone = true;
break;
}
} else { // 3. 대각으로 위반한 경우
if(!((place[i][j2] === 'X') && (place[i2][j] === 'X'))){
isDone = true;
break;
}
}
}
}
if(isDone) break;
}
}
if(isDone) break;
}
if(isDone) answer.push(0)
else answer.push(1);
isDone = false;
})
return answer;
}
/**
let places = [
["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"]
];
let result = [1, 0, 1, 1, 1];
console.log('my Answer: ',solution(places));
console.log('Real Answer: ', result);
*/
isDone
: 반복문을 빠져나오기 위한 flag이자, 위반할 경우를 확인할 수 잇는 flag입니다.directArr
: 먼저 거리두기를 위반한 좌표에 사람이 있는지 확인하기 위해 하나의 P를 중심으로 위반할 수 있는 모든 경우의 좌표를 담은 배열을 준비했습니다.directArr
에 해당하는 좌표값을 얻어 확인합니다. if(i2 < 0 || i2 > 4 || j2 < 0 || j2 > 4){
continue;
}
위 if
문을 통해 좌표평면을 벗어난 경우를 벗어납니다.
if(place[i2][j2] === 'P')
이라면 3가지 경우가 있습니다.X
가 있는지 확인합니다.X
가 있는지 확인해 줍니다.설명이 길지만 차근차근 접근하면 풀 수 있다고 생각합니다.
역시나 시간은 오래 걸렸지만, 그래도 혼자 풀었다는 것에 큰 의의를 두고 있습니다.
생각보다 문제푸는게 너무 즐거웠습니다.
뭔가 역시 L2는 풀만하긴 하지만, 잘못하면 코드가 산으로 가버리는 경우가 많은 것 같습니다. 생각을 잘 정리해서 구현하는 능력이 많이 요구되는 것 같습니다.
이번에 처음으로 vsCode에 debug기능을 활용해봤는데 엄청신기하고 편리한 것 같습니다.
아직은 많은 기능을 사용하진 못하지만 다시 엘리님 강의를 보면서 차근차근 써보려 합니다.