https://www.acmicpc.net/problem/14676
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
let [n, m, k] = input[0].split(" ").map(Number);
let indegrees = new Array(n + 1).fill(0);
let graph = new Array(n + 1);
for (let i = 0; i < graph.length; i++) {
graph[i] = [];
}
let building_num = new Array(n + 1).fill(0);
for (let i = 0; i < m; i++) {
let [from, to] = input[i + 1].split(" ").map(Number);
graph[from].push(to);
indegrees[to]++;
}
let flag = true;
for (let i = 0; i < k; i++) {
let [a, b] = input[i + m + 1].split(" ").map(Number);
if (a === 1) {
// 건설
if (indegrees[b] !== 0) {
flag = false;
break;
} else {
if (building_num[b] === 0) {
for (let j = 0; j < graph[b].length; j++) {
indegrees[graph[b][j]]--;
}
}
building_num[b]++;
}
} else {
// 파괴
if (building_num[b] === 0) {
flag = false;
break;
}
if (building_num[b] === 1) {
for (let j = 0; j < graph[b].length; j++) {
indegrees[graph[b][j]]++;
}
}
building_num[b]--;
}
}
if (flag) {
console.log("King-God-Emperor");
} else {
console.log("Lier!");
}
✔ 알고리즘 : 위상정렬
✔ 간선 정보를 입력받으면서 graph를 구현하고 indegrees 배열을 통해 어떠한 건물이 건설하기 위해 필요한 이전 건물의 수를 저장한다.
✔ 정보를 탐색
✔ flag가 true인 경우 치트키를 쓰지 않은 경우이다.
✔ 난이도 : 백준 기준 골드 4