🔥 접근
- slice 를 이용해 각 테스트케이스를 나눈 후에 그래프를 만든다.
- 간선이 한개 + 단방향으로 이루어진 그래프이므로 큐를 만들지 않고 visited 로만 방문을 했는지 판단 가능하다고 생각
- 모든 정점을 한번씩은 다 방문해야하므로 for문으로 모든 정점을 돌되, 이미 방문했던 곳은 return
- 그래프에서 한 싸이클을 찾기 위해서 path 배열을 두고, 마지막으로 방문한 정점에서 다음 노드가 path 에 있는지 indexOf 를 이용하여 판단
- 이때 path 내부에 해당 노드가 존재한다면(-1이 아닐때) 해당 인덱스부터 path의 마지막 요소까지 한 싸이클이 완성 된 것!
- -1 이라면 한 싸이클이 만들어지지 않았기때문에 count를 올리지 않음
- 전체 학생 수 - count 를 하여 답을 도출
🧑💻 코드
const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : 'input.txt';
const input = fs.readFileSync(filePath, 'utf8').toString().trim().split('\n');
const T = input.shift();
function solution() {
for (let i = 0; i < T; i++) {
const [n, nums] = input.slice(i * 2, i * 2 + 2);
const total = Number(n);
const students = [-1, ...nums.split(' ').map(Number)];
console.log(bfs(total, students));
}
}
function bfs(total, graph) {
const visited = Array(total + 1).fill(false);
let count = 0;
for (let i = 1; i <= total; i++) {
if (visited[i]) continue;
let current = i;
const path = [];
while (!visited[current]) {
visited[current] = true;
path.push(current);
current = graph[current];
}
const idx = path.indexOf(current);
if (idx !== -1) {
count += path.length - idx;
}
}
return total - count;
}
solution();
🔗 관련 링크
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ] 2217번 - 로프 (0) | 2025.04.10 |
---|---|
[BOJ] 1931번 - 회의실 배정 (0) | 2025.04.10 |
[BOJ] 11047번 - 동전 0 (0) | 2025.04.10 |
[BOJ] 2206번 - 벽 부수고 이동하기 (0) | 2025.04.08 |
[BOJ] 2504번 - 괄호의 값 (1) | 2025.04.07 |