const readline = require('readline');
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
let N, M;
rl.on('line', (line) => {
input.push(line.split(' ').map(Number));
[N, M] = input[0];
if (input.length === M + 1) {
rl.close();
}
});
rl.on('close', () => {
const obj = {};
const matrix = Array(N + 1)
.fill(0)
.map((_) => Array(N + 1).fill(false));
for (let i = 1; i <= M; ++i) {
const [s, e] = input[i];
if (!obj[s]) obj[s] = [];
obj[s].push(e);
matrix[s][e] = true;
}
const visited = Array(N + 1).fill(0);
let result = 1; // 현재 연합 번호
for (let i = 1; i <= N; ++i) {
if (visited[i]) continue; // 이미 연합에 속해 있으면 넘어가기
const q = [i]; // 탐색 후보 큐
while (q.length) {
const curr = q.shift();
visited[curr] = result;
if (!obj[curr]) continue; // 연결된 섬이 없으면 넘어가기
for (const next of obj[curr]) {
if (!obj[next]) continue; // 연결된 섬이 없으면 넘어가기
if (!matrix[next][curr] || visited[next]) continue; // 쌍방 연결이 아니거나 이미 연합에 속해 있으면 넘거가기
q.push(next);
}
}
++result;
}
console.log(result - 1);
process.exit();
});
행렬로도 해보고 리스트로도 해보고 섞어서도 해보는데 1시간 동안 해결이 안 됐다. 통과를 못하는 테스트 케이스가 너무 많다... 뭘 놓친 걸까. 내일 해설 보고 다시 해봐야겠다.
09/05 해설 참조 후 추가
이게 BFS구나...
연결된 섬끼리 연합이 된다는 게 결국에는 '갈 수 있는 모든 곳을 탐색한다'였다.
이런 문제는 정말 많이 풀어보면서 감을 잡는 수밖에 없는 것 같고, 아직은 내 힘만으로 풀기 힘든 수준인 것 같다.