BOJ_2606 바이러스
- TOC {:toc}
이 글은 백준 온라인 저지의 2606번 문제를 풀이한 것을 모아놓은 글입니다.
일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.
2021.07.03 (Python)
메모리 | 시간 | 코드 길이 |
---|---|---|
29200 KB | 72 ms | 394 B |
단계 | 시작 시각 | 끝난 시각 | 걸린 시간 |
---|---|---|---|
문제 이해 | 14:43:43 | 14:45:37 | |
풀이 생각 | 14:45:38 | 14:45:49 | |
코딩 | 14:55:00 | 15:03:21 | |
디버깅 | 15:04:32 | 15:13:25 |
import sys
input = sys.stdin.readline
N = int(input())
net = [[] for _ in range(N + 1)]
visited = [False] * (N + 1)
count = 0
for _ in range(int(input())):
a, b = map(int, input().split())
net[a].append(b)
net[b].append(a)
queue = [1]
while queue:
n = queue.pop()
if not visited[n]:
visited[n] = True
count += 1
queue += net[n]
print(count - 1)
아이디어 & 풀이
dfs나 bfs로 그래프를 탐색하면서 count
를 높인 뒤 출력한다.
- dfs를 이용했다.
디버그
queue
에서 원소를 pop 할 때마다count
를 올렸더니 값이 너무 크게 나왔다.net[n]
에 이미 방문한 곳도 포함되어 있어서queue
는 중복 원소도 포함하기 때문에 그런 듯.not visited
조건 안쪽에서count
를 증가시키고- 1번 컴퓨터는 개수에서 제외해야 하므로 마지막에
count - 1
을 출력한다.
피드백
count
를 따로 관리하는 대신visited
를True/False
가 아닌0/1
로 구성해visited
의 합을 구해도 된다.
2022.04.05 (JS)
메모리 | 시간 | 코드 길이 |
---|---|---|
9452 KB | 120 ms | 792 B |
단계 | 시작 시각 | 끝난 시각 | 걸린 시간 |
---|---|---|---|
문제 이해 | 22:56:08 | 23:00:33 | |
풀이 생각 | 23:00:47 | 23:01:14 | |
코딩 | 23:01:15 | 23:22:01 |
const fs = require("fs");
const input = fs.readFileSync('/dev/stdin').toString().trim().split("\n");
const [N, E, ...lines] = input;
const edges = Array(E + 1);
lines.forEach((line) => {
const [A, B] = line.split(" ").map((n) => parseInt(n));
if (!edges[A]) edges[A] = [B];
else edges[A].push(B);
if (!edges[B]) edges[B] = [A];
else edges[B].push(A);
});
function bfs() {
const visited = Array(N + 1).fill(false);
visited[1] = true;
const queue = [1];
while (queue.length) {
const n = queue.shift();
edges[n].forEach((m) => {
if (!visited[m]) {
visited[m] = true;
queue.push(m);
}
});
}
return visited.filter((e) => e === true).length - 1;
}
console.log(bfs());
참고 답안
import sys
input = sys.stdin.readline
def dfs(n):
global visited
visited.append(n)
for x in net[n]:
if x not in visited:
dfs(x)
net = [[] for _ in range(int(input()) + 1)]
for _ in range(int(input())):
a, b = map(int, input().split())
net[a].append(b)
net[b].append(a)
visited = []
dfs(1)
print(len(visited) - 1)
아이디어 & 풀이
위의 풀이와 동일하게 dfs를 이용했다.
count
를 별도로 관리하지 않고 방문한 노드를visited
에 추가한 뒤visited
의 길이를 출력한다.- 방문 여부는
x not in visited
로 확인한다. queue
대신 재귀를 이용해서 dfs를 구현했다.
-
ps-python ps-js