[백준] 1012번 유기농 배추

[백준] 1012번 유기농 배추

출처: [백준] 1012번 유기농 배추


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 512 MB 72068 27007 18264 35.782%

문제

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다.

(한 배추의 상하좌우 네 방향에 다른 배추가 위치한 경우에 서로 인접해있다고 간주한다)

한나가 배추를 재배하는 땅은 고르지 못해서 배추를 군데군데 심어놓았다. 배추들이 모여있는 곳에는 배추흰지렁이가 한 마리만 있으면 되므로 서로 인접해있는 배추들이 몇 군데에 퍼져있는지 조사하면 총 몇 마리의 지렁이가 필요한지 알 수 있다.

예를 들어 배추밭이 아래와 같이 구성되어 있으면 최소 5마리의 배추흰지렁이가 필요하다.

(0은 배추가 심어져 있지 않은 땅이고, 1은 배추가 심어져 있는 땅을 나타낸다.)

1 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 1 1 0 0 0 1 1 1
0 0 0 0 1 0 0 1 1 1

입력

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 첫째 줄에는 배추를 심은 배추밭의 가로길이 M(1 ≤ M ≤ 50)과 세로길이 N(1 ≤ N ≤ 50), 그리고 배추가 심어져 있는 위치의 개수 K(1 ≤ K ≤ 2500)이 주어진다. 그 다음 K줄에는 배추의 위치 X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)가 주어진다.


출력

각 테스트 케이스에 대해 필요한 최소의 배추흰지렁이 마리 수를 출력한다.


예제 입력 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5

예제 출력 1

1
2
5
1

예제 입력 2

1
2
3
4
5
6
7
8
1
5 3 6
0 2
1 2
2 2
3 2
4 2
4 0

예제 출력 2

1
2

힌트


출처

  • 문제를 만든 사람: author2
  • 빠진 조건을 찾은 사람: jinsj1

알고리즘 분류


풀이


소스코드_DFS(List)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import sys

sys.setrecursionlimit(10 ** 6)
input = sys.stdin.readline

# 이동할 네 방향 정의 (상, 하, 좌, 우)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]


def dfs(x, y):
ground[x][y] = 0 # 해당 지점은 확인

for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= N or ny >= M:
continue
else:
if ground[nx][ny] == 1:
dfs(nx, ny)


T = int(input())
for _ in range(T):
M, N, K = map(int, input().split())
ground = [[0 for _ in range(M)] for _ in range(N)]
count = 0
for _ in range(K):
X, Y = map(int, input().split())
ground[Y][X] = 1

for i in range(N):
for j in range(M):
if ground[i][j] == 1:
dfs(i, j)
count += 1
print(count)

[백준] 9466번 텀 프로젝트

[백준] 9466번 텀 프로젝트

출처: [백준] 9466번 텀 프로젝트


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
3 초 256 MB 30631 7499 4796 24.632%

문제

이번 가을학기에 ‘문제 해결’ 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을 수도 있다. 프로젝트 팀을 구성하기 위해, 모든 학생들은 프로젝트를 함께하고 싶은 학생을 선택해야 한다. (단, 단 한 명만 선택할 수 있다.) 혼자 하고 싶어하는 학생은 자기 자신을 선택하는 것도 가능하다.

학생들이(s1, s2, …, sr)이라 할 때, r=1이고 s1이 s1을 선택하는 경우나, s1이 s2를 선택하고, s2가 s3를 선택하고,…, sr-1이 sr을 선택하고, sr이 s1을 선택하는 경우에만 한 팀이 될 수 있다.

예를 들어, 한 반에 7명의 학생이 있다고 하자. 학생들을 1번부터 7번으로 표현할 때, 선택의 결과는 다음과 같다.

1 2 3 4 5 6 7
3 1 3 7 3 4 6

위의 결과를 통해 (3)과 (4, 7, 6)이 팀을 이룰 수 있다. 1, 2, 5는 어느 팀에도 속하지 않는다.

주어진 선택의 결과를 보고 어느 프로젝트 팀에도 속하지 않는 학생들의 수를 계산하는 프로그램을 작성하라.


입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫 줄에는 학생의 수가 정수 n (2 ≤ n ≤ 100,000)으로 주어진다. 각 테스트 케이스의 둘째 줄에는 선택된 학생들의 번호가 주어진다. (모든 학생들은 1부터 n까지 번호가 부여된다.)


출력

각 테스트 케이스마다 한 줄에 출력하고, 각 줄에는 프로젝트 팀에 속하지 못한 학생들의 수를 나타내면 된다.


예제 입력 1

1
2
3
4
5
2
7
3 1 3 7 3 4 6
8
1 2 3 4 5 6 7 8

예제 출력 1

1
2
3
0

힌트


출처


링크


알고리즘 분류


풀이

  • 연결 된 점이 싸이클이 되면 팀 형성…

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import sys

sys.setrecursionlimit(10**6)
input = sys.stdin.readline

test_case = int(input())


def dfs(v):
global result
team[v] = True
cycle.append(v)
num = arr[v]

if not team[num]:
dfs(num)
else:
if num in cycle:
result += cycle[cycle.index(num):]
return


for _ in range(test_case):
N = int(input())
arr = [0] + list(map(int, input().split()))
team = [True] + [False] * N
result = []

for i in range(1, N + 1):
if not team[i]:
cycle = []
dfs(i)
print(N - len(result))

[백준] 2606번 바이러스

[백준] 2606번 바이러스

출처: [백준] 2606번 바이러스


문제

신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.

예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

img

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.


입력

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.


출력

1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.


예제 입력 1

1
2
3
4
5
6
7
8
7
6
1 2
2 3
1 5
5 2
5 6
4 7

예제 출력 1

1
4

힌트


출처


알고리즘 분류


풀이


소스코드_BFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import sys
from collections import deque

input = sys.stdin.readline

computers = int(input())
edges = int(input())

networks = {}
for i in range(computers):
networks[i + 1] = set()

for i in range(edges):
a, b = map(int, input().split())
networks[a].add(b)
networks[b].add(a)


def bfs(network, start):
queue = [start]
while queue:
for i in network[queue.pop()]:
if i not in visited:
visited.append(i)
queue.append(i)


visited = []
bfs(networks, 1)
print(len(visited) - 1)

소스코드_DFS(List)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import sys

sys.setrecursionlimit(10 ** 6)
input = sys.stdin.readline


def dfs(graph, v, visited):
visited[v] = True
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)


computers, edges = int(input()), int(input())

networks = [[] for _ in range(computers + 1)]
visited = [False] * (computers + 1)

for i in range(edges):
a, b = map(int, input().split())
networks[a].append(b)
networks[b].append(a)

dfs(networks, 1, visited)
print(visited.count(True) - 1)

소스코드_DFS(Dict)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import sys

sys.setrecursionlimit(10 ** 6)
input = sys.stdin.readline

computers = int(input())
edges = int(input())

networks = {}
for i in range(computers):
networks[i + 1] = set()

for i in range(edges):
a, b = map(int, input().split())
networks[a].add(b)
networks[b].add(a)


def dfs(graph, v, visited):
visited[v] = True
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)


visited = [False] * (computers + 1)
dfs(networks, 1, visited)
print(visited.count(True) - 1)