https://school.programmers.co.kr/learn/courses/30/lessons/87694
어려운 문제이다. 지나는 점을 표시해두고 문제를 풀려하면 문제가 발생한다. 연결이 되어있는 점인지, 아니면 따로 떨어져 있는 점인지 구분 할 수 없다.
예를 들어, 테두리를 1로 둔다고 하자. 이때 그대로 점을 찍었을 때, 이러한 모양의 그래프가 있다고 하자.
0 0 0 0 0
0 0 1 1 1
0 0 1 1 0
0 0 0 1 1
이 경우 노란색 부분이 최소 거리가 될 것이다. 하지만 사실 이 그래프는 4번째 행에서 1이 위아래로 서로 연결되어 있지 않는 구조이다. 따라서 정답은 다음과 같이 나와야한다.
0 0 0 0 0
0 0 1 1 1
0 0 1 1 0
0 0 0 1 1
즉, 1끼리 어디가 연결이 된 것인지 알 수 없으므로, 크기를 두배로 늘려주어야 한다. 크기를 늘려준다면
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 1 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 1 1 0
이렇게 깔끔하게 구분되어 질 것이다.
따라서 모든 것을 다 두배를 해주어야 한다. characterX, characterY, itemX, itemY 모두 두배를 빼먹지 않고 잘 해주야 하고, 그래프의 크기도 넉넉히 102로 만들어 주어야 한다.
from collections import deque
def solution(rectangle, characterX, characterY, itemX, itemY):
answer = int(1e9)
graph = [[0]*102 for _ in range(102)]
for data in rectangle:
lx,ly,ux,uy = data
for i in range(lx*2, (ux*2+1)):
graph[i][ly*2] = 1 # 테두리
graph[i][uy*2] = 1 # 테두리
for i in range(ly*2, (uy*2+1)):
graph[lx*2][i] = 1 # 테두리
graph[ux*2][i] = 1 # 테두리
for lx, ly, ux, uy in rectangle:
for i in range(lx * 2 + 1, ux * 2):
for j in range(ly * 2 + 1, uy * 2):
graph[i][j] = 5 # 내부
dx = [1,-1,0,0]
dy = [0,0,1,-1]
visited = [[False]*102 for _ in range(102)]
q = deque([[characterX*2, characterY*2, 0]])
visited[characterX*2][characterY*2] = True
while q:
nx, ny, dist = q.popleft()
for i in range(4):
tx = nx + dx[i]
ty = ny + dy[i]
if graph[tx][ty] == 1 and visited[tx][ty] == False and tx>=0 and tx<=100 and ty>=0 and ty<=100:
if tx == itemX*2 and ty == itemY*2:
answer = min(answer, dist+1)//2
q.append([tx, ty, dist+1])
visited[tx][ty] = True
return answer
(수정 2023.03.03)