강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

이경훈님의 프로필 이미지
이경훈

작성한 질문수

파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)

14. 안전영역(DFS)

BFS방식으로 풀었을 때 5번 시간초과..

작성

·

163

0

import queue
import copy

dx = [0,-1,0,1]
dy = [-1,0,1,0]

n = int(input())
arr = [list(map(int,input().split())) for _ in range(n)]
min = 2147000000
max = -min
cnt = 0

for i in range(n):
    for j in range(n):
        if arr[i][j] > max:
            max = arr[i][j]
        if arr[i][j] < min:
            min = arr[i][j]

start = min+1
end = max

for val in range(start,end):
    q = queue.Queue()
    region = 0
    tmp = copy.deepcopy(arr)
    for i in range(n):
        for j in range(n):
            if tmp[i][j] > val:
                q.put((i,j))
                tmp[i][j] = 0
                region += 1
                while q.qsize() > 0:
                    now = q.get()
                    for k in range(4):
                        nx = now[0]+dx[k]
                        ny = now[1]+dy[k]
                        if 0<= nx < n and 0<= ny < n and tmp[nx][ny] > val:
                            tmp[nx][ny] = 0
                            q.put((nx,ny))
    if region > cnt:
        cnt = region

print(cnt)

BFS방식으로 풀었을 때 5번에서 시간초과가 뜹니다 ㅠㅠ

위 소스처럼 tmp = copy.deepcopy(arr) 방식 말고

ch =[[0]*n for _ in range(n)] 로 체크만 하는 경우에도 똑같이 5번에서 시간 초과가 뜨네요..

혹시 개선할만한 부분이 있을까요?

답변 1

1

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

제 경험칙에 의하면 파이썬에서는 queue 보다는 deque가 더 성능이 좋습니다. deque로 한 번 해보세요. 그리고 

위 소스처럼 tmp = copy.deepcopy(arr) 방식 말고

ch =[[0]*n for _ in range(n)] 로 체크만 다시 해보시기 바랍니다.

이경훈님의 프로필 이미지
이경훈

작성한 질문수

질문하기