문제
https://www.acmicpc.net/problem/14466
[사용한 알고리즘]
- BFS
- 시뮬레이션
[풀이]
본 문제는 BFS 를 사용하여 구현하였다. 비교적 다른 문제들에 어렵지 않은 문제니 쉽게 해결이 가능하다.
그러나 본인은 국어를 못하여 문제를 읽고 이해를 못해서 좀 늦게 풀린 감이 있다..
따라서 문제를 잘 읽어야한다.. 문제가 출력하길 요구하는것은 길을 건너지 않으면 만나지 못하는 소들의 쌍이다!!!
문제의 조건은 다음과 같다.
- 농장에는 길이 존재한다. 인접한 목초지는 소들이 자유롭게 건널 수 있지만 일부는 길을 건너야 한다.
- 건너야 하는 길이 처음에 주어진다.
- 출력해야 하는 건 길을 건너지 않고서는 만날 수 없는 소들!
알고리즘 설명
- 각 소의 위치를 cows 2차원배열에 담는다. ( cos[i][j] == 1 이라면 i행j열에 소가 존재한다는 의미이다. )
- 각 소의 위치마다 BFS 를 수행한다.
- BFS 내에서 소의 상하좌우 위치에 길이 존재할 시 에는 탐색을 생략한다. ( 소가 길을 건너지 않았을 때가 조건이므로 )
- 소가 탐색한 위치는 0 으로 값을 바꾸어준다.
- BFS 를 끝낸 뒤 cowmap 배열에서 1의 개수를 센뒤 count에 추가한다.
- 소의 쌍을 출력해야 하므로 count // 2를 출력한다.
약 20분내로 풀었던 문제이기에 코드가 깔끔하지 않다. 그만큼 비교적 쉬운 문제이고 나의 코드를 참고하기보다는 문제를 이해하고 구현에 집중하자.
코드
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import sys
from collections import deque
import copy
input = sys.stdin.readline
N, K, R = map(int,input().split())
farm = [ [[] for _ in range(N)] for _ in range(N) ]
visited = [ [False] * N for _ in range(N)]
dy = [-1,0,1,0]
dx = [0,1,0,-1]
cows = [ [0] * N for _ in range(N)]
count = 0
for _ in range(R):
r1, c1, r2, c2 = map(int,input().split())
farm[r1 - 1][c1 - 1].append([r2 -1, c2-1])
farm[r2 - 1][c2 - 1].append([r1 - 1, c1 - 1])
for _ in range(K):
r, c = map(int,input().split())
cows[r-1][c-1] = 1
def bfs(position, visit, cowmap):
q = deque()
q.append(position)
while q:
r, c = q.popleft()
if visit[r][c]:
continue
else:
visit[r][c] = 1
cowmap[r][c] = 0
for i in range(4):
nr = r + dy[i]
nc = c + dx[i]
position = (nr,nc)
po_list = [nr,nc]
roads = farm[r][c]
if po_list in roads:
continue
if 0 <= nr < N and 0 <= nc < N:
q.append(position)
return cowmap
for i in range(N):
for j in range(N):
if cows[i][j]:
cowmap = bfs((i,j), copy.deepcopy(visited),copy.deepcopy(cows))
else : continue
for k in range(N):
for z in range(N):
if cowmap[k][z]:
count += 1
print(count // 2)