/ 제출 1 / (소요 시간: 1시간)
import sys
input = sys.stdin.readline
from collections import deque
from copy import deepcopy
n = int(input())
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
board = [list(map(int, input().split())) for _ in range(n)]
teamMin = {}
def getCandidateBridge():
teamNum = 10000 + 1
q = deque([])
candidate = []
for i in range(n):
for j in range(n):
if board[i][j] == 1:
q.append((i, j))
board[i][j] = teamNum
teamMin[teamNum] = teamNum
while q:
x, y = q.popleft()
faceSea = False
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if 0 <= nx < n and 0 <= ny < n and board[nx][ny] == 1:
q.append((nx, ny))
board[nx][ny] = teamNum
if 0 <= nx < n and 0 <= ny < n and board[nx][ny] == 0:
faceSea = True
if faceSea:
candidate.append((x, y))
teamNum += 1
return candidate
bridgeOptions = getCandidateBridge()
for option in bridgeOptions:
visited = [[0] * n for _ in range(n)]
i, j = option
q = deque([(i, j)])
visited[i][j] = 1
myTeamMin = teamMin[board[i][j]]
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < n:
if board[nx][ny] == 0 and not visited[nx][ny]:
visited[nx][ny] = visited[x][y]+1
q.append((nx, ny))
if not visited[nx][ny] and board[nx][ny] != 0 and board[nx][ny] != board[x][y]:
myTeamMin = min(myTeamMin, visited[x][y]+1)
if visited[nx][ny] > myTeamMin:
break
teamMin[board[i][j]] = myTeamMin
print(min(teamMin.values()))
7%에서 터졌습니다.
틀린 것 알지만 기록용으로 제출했는데 일부 맞긴하나봅니다.
중간에 꼬여 버려서 원하는대로 결과값이 안 나왔습니다. 시간이 많이 소요되어서 일단 스탑하고 풀이 보고 다시 꼬인 부분 정리하겠습니다.
로직은 맞는데 구현하면서 일을 꼬아버린 부분이 좀 있는 것 같습니다.
[파이썬python] 백준 2146번 - 다리 만들기
백준 2146번 다리 만들기 문제를 풀어보겠습니다. 무려 골드 3짜리 문제입니다. 문제를 푼 아이디어와 과정을 자세히 적어봤으니 문제가 이해가 안되셨거나 풀이를 모르겠다하시면 끝까지 집중
coarmok.tistory.com
'CodingTest > Baekjun Online Judge' 카테고리의 다른 글
[ BOJ / 파이썬 ] 17478 재귀 함수가 뭔가요? (0) | 2022.08.25 |
---|---|
[ BOJ / 파이썬 ] 1600 말이 되고픈 원숭이 (0) | 2022.08.21 |
[ BOJ / 파이썬 ] 2573 빙산 (0) | 2022.08.20 |
[ BOJ / 파이썬 ] 9466 텀 프로젝트 (0) | 2022.08.19 |
[ BOJ / 파이썬 ] 2206 벽 부수고 이동하기 (0) | 2022.08.17 |