📌 문제 링크
https://www.acmicpc.net/problem/5567
📌 문제 탐색하기
- 자신의 결혼식에 자신의 친구와 친구의 친구까지 초대한다면 초대할 사람의 수는 몇명일지 구하려라
- 자기 자신은 1번이다.
시간복잡도
- O(N + M)
알고리즘 선택
- BFS
📌 코드 설계하기
- 문제의 `input`을 개행으로 분리하여 `n`, `m`, `arr`로 값을 가져옵니다.
- `n`과 `m`을 숫자로 변환합니다
- `arr`은 띄어쓰기로 분리하여 숫자로 변환해서 `relationships`를 초기화해줍니다.
- `graph` 배열을 만듭니다.
- 양방향 관계를 설정합니다.
- `visited`배열을 `n+1`크기로 만들고 `false`로 초기화합니다.
- 자기 자신은 방문 처리 합니다.
- 초대할 사람 수를 셀 `count`변수를 초기화합니다.
- `queue`를 `[[1, 0]]`으로 초기화합니다 (시작점과 depth)
- `queueIndex`를 0으로 초기화하여 `queue` 순회를 시작합니다
- `queue`를 순회하면서
- 현재 위치와 깊이를 가져옵니다
- 깊이가 2 이상이면 건너뜁니다 (친구의 친구까지만)
- 현재 노드의 친구들을 확인합니다:
- 방문하지 않은 친구라면:
- 방문 처리를 합니다
- 큐에 [친구번호, 현재깊이+1]을 추가합니다
- 초대할 사람 수 `count`를 증가시킵니다
- 방문하지 않은 친구라면:
- 최종적으로 `count`를 반환합니다
📌 정답 코드
//https://www.acmicpc.net/problem/5567
export {};
const fs = require('fs');
const filePath =
process.platform === 'linux' ? '/dev/stdin' : __dirname + '/input2.txt';
const [n, m, ...input] = fs
.readFileSync(filePath)
.toString()
.trim()
.split('\n');
const [N, M] = [n, m].map(Number);
const relationships = input.map((x: string) => x.split(' ').map(Number));
const graph: number[][] = Array.from({ length: N + 1 }, () => []);
for (const [a, b] of relationships) {
graph[a].push(b);
graph[b].push(a);
}
const visited = new Array(n + 1).fill(false);
visited[1] = true;
let count = 0;
const queue: [number, number][] = [[1, 0]];
let queueIndex = 0;
while (queueIndex < queue.length) {
const [current, depth] = queue[queueIndex++];
if (depth >= 2) continue;
for (const friend of graph[current]) {
if (!visited[friend]) {
visited[friend] = true;
queue.push([friend, depth + 1]);
count++;
}
}
}
console.log(count);
'코딩 > 알고리즘' 카테고리의 다른 글
백준) 2193 - 이친수 JS (1) | 2024.10.26 |
---|---|
백준) 2303 - 숫자게임 JS (0) | 2024.10.25 |
백준) 2204 - 도비의 난독증 테스트 JS (0) | 2024.10.23 |
백준) 2644 - 촌수계산 JS (0) | 2024.10.22 |
백준) 11724 - 연결 요소의 개수 JS (0) | 2024.10.21 |