[BaekJoon] 백준 3055번 : 탈출

Updated:

3055번 : 탈출


일반 DFS 문제보다 조금 신경 써야 할 조건이 있는 문제이다.

작업을 분 단위로 나누어서 해당 시점에 퍼져야 하는 물을 전부 퍼트린 후 고슴도치를 이동시키면 된다.

처음 제출했을 때 런타임 에러가 자꾸 발생해 어떤 문제인지 찾기 어려웠었다.

그런데.. 나는 물이 한 군데에서 시작하는 경우만 따지고 있었다.

물이 여러 군데에서 시작할 수도 있는데 말이다!

물의 시작 위치를 여러 군데로 받을 수 있게 고쳐주니 바로 통과했다.


from collections import deque


def solution(water_start, hedgehog_start):
	water_queue = deque(water_start)
	hedgehog_queue = deque([hedgehog_start])
	dirs = [[-1, 0], [0, 1], [1, 0], [0, -1]]

	while hedgehog_queue:
		hedgehog_i, hedgehog_j, hedgehog_minute = hedgehog_queue.popleft()
		while water_queue:
			if water_queue[0][2] == hedgehog_minute:
				water_i, water_j, water_minute = water_queue.popleft()
			else:
				break
			for val in dirs:
				water_visit_i = water_i + val[0]
				water_visit_j = water_j + val[1]
				if 0 <= water_visit_i < r and 0 <= water_visit_j < c:
					if ground[water_visit_i][water_visit_j] == '.':
						ground[water_visit_i][water_visit_j] = 'X'
						water_queue.append([water_visit_i, water_visit_j, water_minute + 1])

		for val in dirs:
			hedgehog_visit_i = hedgehog_i + val[0]
			hedgehog_visit_j = hedgehog_j + val[1]
			if 0 <= hedgehog_visit_i < r and 0 <= hedgehog_visit_j < c:
				if ground[hedgehog_visit_i][hedgehog_visit_j] == '.':
					ground[hedgehog_visit_i][hedgehog_visit_j] = 'X'
					hedgehog_queue.append([hedgehog_visit_i, hedgehog_visit_j, hedgehog_minute + 1])
				if ground[hedgehog_visit_i][hedgehog_visit_j] == 'D':
					return hedgehog_minute + 1

	return "KAKTUS"


if __name__ == '__main__':
	r, c = map(int, input().rsplit())
	ground = [list(map(str, input())) for _ in range(r)]

	water_start = []
	hedgehog_start = []
	for i in range(r):
		for j in range(c):
			if ground[i][j] == '*':
				water_start.append([i, j, 0])
			if ground[i][j] == 'S':
				hedgehog_start = [i, j, 0]

	print(solution(water_start, hedgehog_start))



Categories:

Updated:

Leave a comment