PS/Python

[Python] 백준 알고리즘 #2468 안전 영역 - bfs, brute force

yoo.o 2020. 8. 13. 02:07
반응형

문제

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 �

www.acmicpc.net

 

풀이

해봐야 몇개 안되겠다 싶어서 브루트포스로 모든 상황을 다 돌리기로 하고,

그래도 반복의 횟수를 조금 줄이기 위해 하나도 물에 잠기지 않는 경우와, 모두 물에 잠기는 경우를 가지치기 했다.

그래서 인풋을 받으면서 값들의 최소와 최대를 minimum, maximum에 저장했다.

 

그 후, minimum부터 maximum까지 포문을 돌면서 인풋 값이 들어있는 field 배열을 복사해서 bfs를 했고,

안전영역의 갯수를 카운팅해줬다.

 

import sys
from collections import deque
import copy

N = int(input())
field = []
maximum = 0
minimum = 100
queue = deque()

dr = [-1, 1, 0, 0]
dc = [0, 0, -1, 1]
maxcount = 1

def bfs(j):
    while queue:
        now = queue.popleft()
        for i in range(4):
            ndr = now[0] + dr[i]
            ndc = now[1] + dc[i]

            if 0 <= ndr < N and 0 <= ndc < N and copied[ndr][ndc] > j:
                queue.append([ndr, ndc])
                copied[ndr][ndc] = -1


for i in range(N):
    ls = list(map(int, sys.stdin.readline().split(" ")))
    maximum = max(maximum, max(ls))
    minimum = min(minimum, min(ls))
    field.append(ls)


for j in range(minimum, maximum):
    count = 0

    copied = copy.deepcopy(field)

    for n in range(N):
        for m in range(N):
            if copied[n][m] > j:
                count += 1
                queue.append([n, m])
                copied[n][m] = -1
                bfs(j)
    maxcount = max(maxcount, count)


print(maxcount)

맞긴 했지만 메모리랑 시간을 보니 더 좋은 방법이 있을것같다.

 

 

메모

arr.copy()하면 얕은 복사(shallow copy)가 되기 때문에 원본이든 복사본이든 수정하면 다 같이 수정된다.

따라서 import copy를 해준 후 copy.deepcopy(arr) 이런식으로 복사해줘야 원본과는 별개인 복사본이 생긴다.

반응형