-
[BOJ]7576 토마토알고리즘 2021. 1. 8. 11:43
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토
www.acmicpc.net
시작점이 여러개인 BFS 문제이다.
첫 시작점만 리스트로 넣어주면 되는 문제.
하지만
시간초과가 계속 났다.
이유는 queue를 이용하지 않아서.
평소에 나는 list.pop(0)을 사용하는데, 이번엔 이걸 쓰면 시간초과가 나는 문제였다.
이걸 deque.popleft()로 바꿧더니 풀리는 문제..
from collections import deque import sys def solution(sp : list ,tomato : list,v : list): N,M=len(tomato),len(tomato[0]) q=sp X=[0,0,1,-1] Y=[1,-1,0,0] while q: c_x,c_y=q.popleft() for i in range(4): n_x=c_x+X[i] n_y=c_y+Y[i] if n_x>=0 and n_x<N and n_y>=0 and n_y<M: if tomato[n_x][n_y]==0: if v[n_x][n_y]>v[c_x][c_y]+1: q.append((n_x,n_y)) tomato[n_x][n_y]=1 v[n_x][n_y]=v[c_x][c_y]+1 return -1 if sum(list(map(lambda x : x.count(0),(*tomato))))!=0 else max(map(max,v)) N,M=(map(int,input().split(' '))) tomato=[] sp=[] v=[[10000]*N for i in range(M)] for i in range(M): r=list(map(int,input().split(' '))) tomato.append(r) for idx,j in enumerate(r): if j==1: sp.append((i,idx)) v[i][idx]=0 elif j==-1: v[i][idx]=0 print(solution(sp,tomato,v))
'알고리즘' 카테고리의 다른 글
[kakao 2019 internship]징검다리 건너기 (0) 2021.01.12 [boj]2146 다리만들기 - 파이썬, pypy3 (0) 2021.01.11 [Kakao blind 2020]자물쇠와 열쇠 (0) 2021.01.07 [자료구조] trie(트라이)구조 (0) 2021.01.04 [BOJ 1715] 카드 정렬하기 (0) 2021.01.03