반응형
문제
https://www.acmicpc.net/problem/9205
풀이
- 최대 20병이 들어가는 맥주 한 박스를 들고 출발하여 50m마다 맥주를 한 병씩 마시면서 가야 할 때, 상근이네 집에서 페스티벌에 갈 수 있으면 "happy"를, 그렇지 않으면 "sad"를 출력한다.
- 편의점 개수 + 3(편의점 개수, 상근이 집 좌표, 페스티벌 좌표 입력) 씩 인덱스를 증가시키면서 테스트 케이스를 입력받는다.
- 한 박스에 20병을 넣을 수 있고, 50m마다 맥주 한 병을 마셔야 하기 때문에 최대 이동할 수 있는 거리는 20x50=1000m이다. 따라서 서 맥주를 채울 수 있는 편의점까지 이동할 때, 또는 도착지인 페스티벌 좌표까지 이동할 때 거리가 1000m가 넘어가면 갈 수 없다.
- 편의점을 무조건 순서대로 방문하는 것이 아니기 때문에 visited 배열을 사용해 BFS로 편의점을 하나씩 가보면서 페스티벌까지 도달할 수 있는지 확인한다
class Queue {
constructor() {
this.data = [];
this.head = 0;
this.tail = 0;
}
push(item) {
this.data[this.tail++] = item;
}
pop() {
this.head++;
}
front() {
return this.data[this.head];
}
rear() {
return this.data[this.tail - 1];
}
isEmpty() {
return this.head === this.tail;
}
size() {
return Math.abs(this.head - this.tail);
}
}
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const T = +input.shift();
let idx = 0;
let answer = "";
let home, stores, festival;
// 페스티벌에 갈 수 있으면 true, 아니면 false 반환
// 20x50=1000이하인 경우 이동 가능
function isMovable(dep, des) {
return Math.abs(dep[0] - des[0]) + Math.abs(dep[1] - des[1]) <= 1000;
}
function BFS(storeCnt) {
const queue = new Queue();
const visited = Array(storeCnt).fill(false);
queue.push(home);
while (!queue.isEmpty()) {
const des = queue.front();
queue.pop();
if (isMovable(des, festival)) return true;
for (let i = 0; i < storeCnt; i++) {
if (visited[i]) continue;
if (isMovable(des, stores[i])) {
visited[i] = true;
queue.push(stores[i]);
}
}
}
return false;
}
for (let i = 0; i < T; i += 1) {
const N = +input[idx]; // 편의점 개수
home = input[idx + 1].split(" ").map(Number); // 상근이 집
stores = input.slice(idx + 2, idx + 2 + N).map((row) => row.split(" ").map(Number)); // 편의점
festival = input[idx + 2 + N].split(" ").map(Number);
answer += (BFS(N) ? "happy" : "sad") + "\n";
// 끝나고 나면 storeCnt 갱신
idx += N + 3;
}
console.log(answer);
- 런타임 에러가 나는 경우는 입력을 제대로 받고 있지 않은 경우가 많은 것 같다. 이 문제는 확실히 질문 게시판에도 런타임 에러 관련 질문이 많았는데, 편의점이 없는 경우인 입력을 넣어서 확인해 보자.
입력:
3
0
1000 1000
1000 1001
1
0 0
1000 0
0 2000
2
0 0
10000 0
0 1000
0 2000
정답:
happy
sad
happy
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[알고리즘/백준/16946] 벽 부수고 이동하기 4 (node.js) - 매번 나머지 연산 시 실패한다면? (1) | 2024.05.01 |
---|---|
[알고리즘/백준/15683] 감시(Node.js) (0) | 2024.04.03 |
[알고리즘/백준/2636] 치즈(Nodejs, BFS) (1) | 2023.08.31 |
[알고리즘/백준/14502] 연구소(BFS, DFS, Nodejs) (0) | 2023.08.26 |
[알고리즘/백준/13023] ABCDE(Node.js, BFS) (0) | 2023.08.24 |