let dir = [[0,1],[0,-1],[1,0],[-1,0]];
function solution(places) {
let answer = [];
for(let k = 0 ; k < places.length; k++){
let arr = Array.from(Array(5), ()=>Array(5).fill(0))
let visited = Array.from(Array(5), ()=>Array(5).fill(0))
let w = places[k];
let p = [];
for(let i =0 ; i <w.length; i++){
let a = w[i].split('');
arr[i] = a;
}
for(let i = 0 ; i < 5; i++){
for(let j = 0 ; j < 5; j++){
if(arr[i][j]=='P')
p.push([i,j]);
}
}
let flag3 = 0;
for(let i = 0 ; i < p.length; i++){
let flag1 = 0;
let flag2 = 0;
let [y,x] = p[i];
let queue = [];
queue.push([y,x,0]);
while(queue.length){
let [y1,x1,cnt] = queue.shift();
if(cnt>1)
continue;
for(let t= 0; t<4; t++){
let dy1 = y1 + dir[t][0];
let dx1 = x1 + dir[t][1];
if(dy1<5&&dx1<5&&dy1>=0&&dx1>=0&&arr[dy1][dx1]=='O'&&!(dy1==y1&&x1==dx1)){
queue.push([dy1,dx1,cnt+1])
}else if(dy1<5&&dx1<5&&dy1>=0&&dx1>=0&&arr[dy1][dx1]=='P'&&!(dy1==y&&x==dx1)){
answer.push(0);
flag1 = 1;
break;
}
}
if(flag1==1){
flag2 = 1;
break;
}
}
if(flag2==1){
flag3 = 1;
break;
}
}
if(!flag3)
answer.push(1);
}
console.log(answer);
return answer
}
BFS를 통해 2이상의 경우 Continue를 해주면 되는 문제였다.
반성할 점은 BFS를 별도의 함수로 빼고 P에 도달하는 경우 그냥 return을 해주었으면 되는데 굳이 함수를 따로 안빼내고 무식하게 flag를 통해서 반복을 탈출했던 점이다.
let dir = [
[0, 1],
[0, -1],
[1, 0],
[-1, 0],
];
function solution(places) {
let answer = [];
for (let k = 0; k < places.length; k++) {
let arr = Array.from(Array(5), () => Array(5).fill(0));
let w = places[k];
let p = [];
for (let i = 0; i < w.length; i++) {
let a = w[i].split('');
arr[i] = a;
}
for (let i = 0; i < 5; i++) {
for (let j = 0; j < 5; j++) {
if (arr[i][j] == 'P') p.push([i, j]);
}
}
let temp;
for (let i = 0; i < p.length; i++) {
let [y, x] = p[i];
temp = bfs(y, x, arr);
if (temp == 0) break;
}
if (temp == 0) answer.push(0);
else answer.push(1);
}
return answer;
}
function bfs(y, x, arr) {
let queue = [];
queue.push([y, x, 0]);
while (queue.length) {
let [y1, x1, cnt] = queue.shift();
if (cnt > 1) continue;
for (let t = 0; t < 4; t++) {
let dy1 = y1 + dir[t][0];
let dx1 = x1 + dir[t][1];
if (
dy1 < 5 &&
dx1 < 5 &&
dy1 >= 0 &&
dx1 >= 0 &&
arr[dy1][dx1] == 'O' &&
!(dy1 == y1 && x1 == dx1)
) {
queue.push([dy1, dx1, cnt + 1]);
} else if (
dy1 < 5 &&
dx1 < 5 &&
dy1 >= 0 &&
dx1 >= 0 &&
arr[dy1][dx1] == 'P' &&
!(dy1 == y && x == dx1)
) {
return 0;
}
}
}
return 1;
}
최소한 이렇게 로직을 분리해둬야 스스로가 덜 헷갈릴거 같다. VS Code처럼 괄호 닫는 기능이 없기 때문에 너무나 헷갈린다.
또한 c로 문제를 풀었던 습관인지 코테에서는 습관적으로 for(let i= 0 ~~) 형식을 사용했었는데,
이게 겹겹이 쌓이는게(nested?) 반복되면 변수 선언에서 실수하거나 시간 낭비할 가능성이 높겠다고 느꼈다.
PS에서도 가독성을 위해 불필요한 구간이라면 forEach를 좀 적극적으로 써보는 연습을 해야겠다.
'Algorithm > PGMS' 카테고리의 다른 글
PGMS - 소수찾기 (0) | 2022.01.13 |
---|---|
PGMS 점프와 순간이동 (0) | 2022.01.10 |
PGMS 캐시 (0) | 2022.01.10 |
PGMS 전력망을 둘로 나누기 (0) | 2022.01.10 |
PGMS 메뉴 리뉴얼 (0) | 2021.12.29 |