Algorithm/백준

[백준/Python] 감시

poppy 2021. 12. 20. 16:21
반응형

https://www.acmicpc.net/problem/15683

 

15683번: 감시

스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감

www.acmicpc.net

import copy

N, M = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(N)]
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
direction = {
    1: [[0], [1], [2], [3]],
    2: [[0, 2], [1, 3]],
    3: [[0, 1], [1, 2], [2, 3], [3, 0]],
    4: [[0, 1, 2], [1, 2, 3], [2, 3, 0], [3, 0, 1]],
    5: [[0, 1, 2, 3]]
} # cctv 종류에 따른 감시 방향

def watch(x, y, direction, tmp):
    for d in direction:
        nx, ny = x, y
        # 이동할 수 없을 때까지 이동하면서 '#'으로 변경
        while True:
            nx += dx[d]
            ny += dy[d]
            if nx < 0 or nx >= N or ny < 0 or ny >= M or tmp[nx][ny] == 6: # 이동 가능한 범위를 벗어나거나 벽이면 break
                break
            elif tmp[nx][ny] == 0: # 빈칸이면 감시 구역으로 변경
                tmp[nx][ny] = '#'

def dfs(n, graph):
    global ans
    tmp = copy.deepcopy(graph)
    
    if n == len(cctv):
        count = 0 # 빈칸 개수
        for t in tmp:
            count += t.count(0)
        ans = min(ans, count) # 사각지대 최소 크기를 구한다
        return

    x, y, c = cctv[n]
    # 해당 cctv의 종류에 따른 감시 구역을 구한다
    for d in direction[c]:
        watch(x, y, d, tmp)
        dfs(n+1, tmp)
        tmp = copy.deepcopy(graph)

cctv = [] # cctv 리스트
ans = 1e9 # 사각지대 크기

# cctv 찾기
for i in range(N):
    for j in range(M):
        if graph[i][j] != 0 and graph[i][j] != 6:
            cctv.append([i, j, graph[i][j]]) # x위치, y위치, cctv 종류

dfs(0, graph)
print(ans)

1. 필요한 정보를 입력받고 방향벡터(dx, dy)와 cctv 종류에 따른 감시 방향 리스트(direction)를 생성한다.

2. 입력받은 사무실 정보(graph)에서 cctv만 찾아 리스트에 저장한다.

3. 모든 경우를 탐색한다.

    3-1. 현재 탐색하고 있는 cctv 정보를 가져와 해당 cctv의 종류에 따른 감시 구역을 구한다.

    3-2. 이동할 수 없을 때까지 이동하면서 '#'으로 변경한다.

    3-3. 변경이 끝났다면 다음 cctv로 넘어가 위의 과정을 반복한다.

    3-4. 모든 cctv의 탐색이 끝났다면 사각지대의 최소 크기를 구한다.

4. 결과를 출력한다.

반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준/Python] LCS  (0) 2021.12.30
[백준/Python] 이분 그래프  (0) 2021.12.26
[백준/Python] 민겸 수  (0) 2021.12.13
[백준/Python] 크게 만들기  (0) 2021.12.06
[백준/Python] 병든 나이트  (0) 2021.12.02