알고리즘/문제풀이
[Python] 백준 14466 소가 길을 건너간 이유 6
정찡이
2021. 7. 24. 19:32
728x90
1. 문제 링크
14466번: 소가 길을 건너간 이유 6
첫 줄에 N, K, R이 주어진다. 다음 R줄에는 한 줄에 하나씩 길이 주어진다. 길은 상하좌우로 인접한 두 목초지를 잇고, r c r′ c′의 형태 (행, 열, 행, 열)로 주어진다. 각 수는 1 이상 N 이하이다.
www.acmicpc.net
2. 문제 요약
- 길을 이용해야 하는 소들 쌍을 구하는 문제

- 예제 문제를 그려보면 아래와 같다. 소의 위치와 길의 위치가 주어지고, 두 소가 쌍을 지어 서로 길 없이 만날 수 있는지 확인을 해야 한다.

3. 아이디어 정리
- 소를 한 마리씩 돌려주면서(소 1) 정해진 길 없이 길을 건널 때 방문 여부를 모두 체크 ⇒ bfs
- 1에서 구한 소 1의 방문 여부 결과에서 소 2의 위치에 방문을 못한 경우 count + 1
4. 문제 풀이
4-1. 내 풀이
"""
정해진 길을 이용해야하는 소들 쌍
"""
import sys
from collections import deque
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
def bfs(r1, c1):
dq = deque()
dq.append((r1, c1))
cow_visit[r1][c1] = True
while dq:
x, y = dq.popleft()
for d in range(4):
nx = dx[d] + x
ny = dy[d] + y
# 범위 체크
if nx < 0 or ny < 0 or nx >= n or ny >= n:
continue
if cow_visit[nx][ny]: # 방문 체크
continue
if (nx, ny) in road[x][y]: # 다리인 경우 pass
continue
dq.append((nx, ny))
cow_visit[nx][ny] = True
n, k, r = map(int, sys.stdin.readline().split()) # n*n, k: 마리, r: 정해진 길
road = [[[] for _ in range(n)] for _ in range(n)]
cow_visit = [[False] * n for _ in range(n)]
count = 0
# 길 위치 담기
for _ in range(r):
r1, c1, r2, c2 = map(int, sys.stdin.readline().split())
road[r1 - 1][c1 - 1].append((r2 - 1, c2 - 1))
road[r2 - 1][c2 - 1].append((r1 - 1, c1 - 1))
# 소의 위치 담기
cow_list = list()
for _ in range(k):
a, b = map(int, sys.stdin.readline().split())
cow_list.append((a - 1, b - 1))
# 1. 소를 한마리씩 돌려가면서 방문 여부 탐색
for i, cow in enumerate(cow_list):
cow_visit = [[False] * n for _ in range(n)]
# 2. 현재 소가 정해진 길 없이 가는 경로를 탐색
bfs(cow[0], cow[1])
for r2, c2 in cow_list[i + 1:]:
# 3. 방문을 완료하지 못한 경우 결과 + 1
if not cow_visit[r2][c2]:
count += 1
print(count)
5. 결론
- 문제 자체를 이해하기 어려웠던 문제 ⇒ 문제를 더 상세하게 설명해주면 좋을 듯하다.😕
- 기본적인 bfs에 다리가 존재하는 경우 방문을 안 하도록 하면 되는 문제
반응형