프로그래머스 81302번. 2021년 카카오 인턴쉽 코테에서 나온 거리두기 확인하기 문제이다.
접근 방식은 도움을 받았으니 그래도 코드는 직접 짰다..
/*
처음에는 완전탐색으로 p의 위치를 죄다 찾아서 해당 인원이 거리두기를 지키고 있는지
체크해가지고 하나씩 탈락시키려고 했었음.
하지만 문제의 접근과정을 살펴보니....
각 P와 X의 상태를 5X5 int배열로 나타낸다! 라는 느낌으로 풀어가더라.
*/
function solution(places) {
let PList = []; // P와 X의 좌표를 끄집어 냄.
let XList = [];
console.log(places);
for(let i = 0; i < places.length; i++){
let place = places[i]; // 각 대기실
let eachP = [];
let eachX = [];
for(let x = 0; x < place.length; x++){
let line = place[x]; // 각 라인 (x)
for(let y = 0; y < line.length; y++){
let person = line[y]; // 각 사람 (y)
if(person === 'P'){
eachP.push([x,y]);
} else if(person === 'X'){
eachX.push([x,y]);
}
}
}
PList[i] = eachP;
XList[i] = eachX;
}
let answer = [1,1,1,1,1];
for(let k = 0; k < 5; k++){
let intArr = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]] // 0으로 채워진 5X5 배열
for(let i = 0; i < PList[k].length; i++){
let person = PList[k][i]; // P
let [x, y] = person; // person의 좌표
//console.log(person)
//console.log(x,y)
intArr[x][y] -= 1; //P의 자리부터 --;
if(x < 4) intArr[x+1][y]--; // 아래쪽 -- (x가 4 이상이면 자리 없음)
if(x > 0) intArr[x-1][y]--; // 위쪽 --; (x가 0 이하면 자리 없음)
if(y < 4) intArr[x][y+1]--; // 오른쪽--;
if(y > 0) intArr[x][y-1]--;
}
console.log("---");
for(let j = 0; j < XList[k].length; j++){
let block = XList[k][j];
let [x,y] = block;
intArr[x][y] += 10; // X로 막은데는 10을 더해서 아예 막혀있음을 나타냄
}
console.log(intArr)
// -2보다 작은 것들이 있는지 체크
for(let a = 0; a < 5; a++){
for(let b = 0; b < 5; b++){
if(intArr[a][b] <= -2){
console.log(a,b)
answer[k] = 0;
break;
}
}
}
}
return answer;
}
어... 그런데 다른 사람의 풀이도 보니깐 그냥 완전탐색으로 풀어버린 사람들도 많은거 같다 ㅋㅋㅋㅋ p위치 찾고 각 사람마다 거리두기를 지키는지?를 판단해서
역시 코테는 내가 가는 길을 안 까먹는 것이 중요한 거 같다 ㅋㅋ