문제
토마토 (https://www.acmicpc.net/problem/7576)
풀이
1. 초기 접근
- 문제조건 해석
- 움직임, 경로에 대한 문제고, 간선의 길이가 1로 정해져있다.
- BFS 문제다.
- 움직임, 경로에 대한 문제고, 간선의 길이가 1로 정해져있다.
- 알고리즘
- 가장 기초적인 BFS 문제라고 생각된다.
- 코드
import sys
from collections import deque
dxs = [-1, 0, 1, 0]
dys = [0, -1, 0, 1]
m, n = map(int, sys.stdin.readline().split())
board, q, visited = [], deque(), set()
for _ in range(n):
board.append(list(map(int, input().split())))
for i in range(n):
for j in range(m):
if board[i][j] == 1:
q.append((i, j))
visited.add((i, j))
def bfs():
step = 0
while q:
size = len(q)
for i in range(size):
x, y = q.popleft()
for dx, dy in zip(dxs, dys):
nx, ny = x + dx, y + dy
if nx >=0 and nx < n and ny >= 0 and ny < m and \
(nx, ny) not in visited and board[nx][ny] != -1:
visited.add((nx, ny))
q.append((nx, ny))
board[nx][ny] = 1
step += 1
for i in range(n):
for j in range(m):
if board[i][j] == 0:
return -1
return step - 1
print(bfs())
2. 유의사항
- 초기 코드 (여기에는 없다.) 에는
q
를deque
가 아닌 일반list
를 사용했었다.
즉,q = []
였고, pop 할 때도,x, y = q.pop(0)
식으로 사용했었다. - 근데 이러면 시간초과가 뜬다.
이유는q.pop(0)
에는 O(n) 만큼 시간이 걸린다. 나도 몰랐는데, 아무튼 연산시간이 그렇다. - 반면
deque.leftpop()
에는 O(1) 만큼 시간이 걸린다. 매우매우 차이가 크다.
이게 사람들이 파이썬에서queue
를 쓸 때,list
를 안쓰고deque
를 사용하는 이유다. - 파이썬에서
queue
가 필요하면 무조건deque
를 사용하자.
파이썬 내장 함수의 시간복잡도
'취업과 기본기 튼튼 > 코딩 테스트 노트' 카테고리의 다른 글
[BOJ] 12851. 숨바꼭질 2 (2) | 2019.04.07 |
---|---|
[BOJ] 7569. 토마토 (0) | 2019.04.07 |
[BOJ] 2644. 촌수 계산 (0) | 2019.04.07 |
[BOJ] 16397. 탈출 (0) | 2019.04.07 |
[BOJ] 1697. 숨바꼭질 (0) | 2019.04.07 |