📄 문제



📝 나의 풀이
function solution(places) {
let answer = [];
const bfs = (place) => {
let target = [];
place.forEach((a) => {
let item = a.split("");
target.push(item);
});
let box = [];
for (let i = 0; i < 5; i++) {
for (let j = 0; j < 5; j++) {
if (target[i][j] === "P") {
box.push([i, j]);
}
}
}
let dx = [-1, 1, 0, 0];
let dy = [0, 0, 1, -1];
while (box.length != 0) {
const [x, y] = box.shift();
for (let i = 0; i < 4; i++) {
let nx = x + dx[i];
let ny = y + dy[i];
if (nx < 0 || nx >= 5 || ny < 0 || ny >= 5) continue;
if (target[nx][ny] == "X") continue;
if (target[nx][ny] == "P") return 0;
for (let j = 0; j < 4; j++) {
let newX = nx + dx[j];
let newY = ny + dy[j];
if (newX < 0 || newX >= 5 || newY < 0 || newY >= 5) continue;
if (newX == x && newY == y) continue;
if (target[newX][newY] == "P") return 0;
}
}
}
return 1;
};
for (let i = 0; i < 5; i++) {
answer.push(bfs(places[i]));
}
return answer;
}

⌨ 접근법
1. 들어오는 입력을 보면 [ [1], [2], [3], [4], [5] ] 5개의 대기실 배열이다. 각 대기실마다 검사하는 bfs 함수를 만든다.
2. bfs 함수
2-1. 일단 들어오는 모양 그대로 2차원 배열로 만든다. target[]
2-2. 그리고 target에 있는 'P' 즉 유저의 좌표를 배열에 넣는다. box[]
2-3. 동서남북의 방향을 dx, dy 세트로 만든다.
2-4. 루프 시작 box에 있는걸 하나씩 shift() 하면서 진행한다. 그 대상은 [x,y] 로 들어오니 일단 담아둔다.
2-5. 가져온 해당 좌표를 4방향 탐색한다. target 영역 밖인 방향이면 바로 다음 방향으로 continue
2-6. target 영역 안이지만 'X' 즉 파티션을 만나면 막혀있으니 continue
2-7. 탐색 중 'P' 즉 다른 응시자를 만나면 바로 return 0 으로 거리두기 안되는 대기실
2-8. 2-5 ~ 2-7 까지를 모두 통과한 녀석이라면 그 방향에서 다시 한 번 4방향 탐색
2-9. 위와 마찬가지로 target영역 밖이면 continue, 왔던 방향은 바로 continue, 응시자를 만나면 return 0
2-10. 2-5 ~ 2-9 로직을 완료하면 거리두기 제약사항에 걸리지 않으므로 1 지키고 있는 대기실!
3. bfs함수를 대기실 배열들 마다 돌리고 미리 선언해두었던 answer 배열에 결과를 넣어주면 완성!
😤 스토리
- 이 문제는 스터디 1기 시절에 풀었던 문제이다 (지금은 2기)
- 올린 코드에는 주석이 없지만 한 줄에 하나씩 주석을 달아가며 열심히 풀었던 문제다.
- 풀었던 문제여서 JAVA로 코드를 옮겨 보려 했는데 어우 너무 어려워서 그냥 javascript 버전만 포스팅 한다. ㅜㅜ
- 자바 조금씩 기본 강의부터 보는데 얼른 익혀서 그린이랑 같이 자바도 조금씩 해야겠다.
📚 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/81302?language=javascript
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'TEAM 알고싶다 > 성공 문제' 카테고리의 다른 글
[프로그래머스] JavaScript - 다리를 지나는 트럭 (0) | 2022.08.09 |
---|---|
[Baekjoon (Node.js)] 1065번 한수 (0) | 2022.07.31 |
[Baekjoon (Node.js)] 10026번 적록색약 (0) | 2022.07.19 |
[Baekjoon (Node.js)] 11724번 연결 요소의 개수 (0) | 2022.07.13 |
[Baekjoon (Node.js)] 24479번 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2022.07.13 |