알고리즘 풀이/백준

[ 백준 15683 ] 감시 - Python

12.tka 2020. 6. 10. 15:07
728x90

문제 보기

이 문제는 브루트 포스 문제이다.

2차원 배열에 존재하는 CCTV의 가능한 모든 방향을 다 고려한 후 사각지대의 최소 크기를 출력하면 된다.

1번 -> 상, 하, 좌, 우

2번 -> (상, 하), (좌, 우)

3번 -> (상, 우), (우, 하), (하, 좌), (좌, 상)

4번 -> (좌, 상, 우), (상, 우, 하), (우, 하, 좌), (하, 좌, 상)

5번 -> (상, 하, 좌, 우)

 

5가지 CCTV가 움직일 수 있는 방향은 위와 같으며 코드 상에서 반복적으로 나오는 부분이 많아서 코드의 길이가 길다.

 

코드

import sys
import copy


def dfs(idx):
    global min_area, arr
    if idx == len(position):
        temp = 0
        for i in range(N):
            for j in range(M):
                if arr[i][j] == 0:
                    temp += 1
        min_area = min(min_area, temp)
    else:
        value, row, col = position[idx]
        temp = copy.deepcopy(arr)
        if value == 1:
            # 상
            for i in range(row - 1, -1, -1):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            dfs(idx + 1)

            # 하
            arr = copy.deepcopy(temp)
            for i in range(row + 1, N):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            dfs(idx + 1)

            # 좌
            arr = copy.deepcopy(temp)
            for i in range(col -1, -1, -1):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            dfs(idx + 1)

            # 우
            arr = copy.deepcopy(temp)
            for i in range(col + 1, M):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            dfs(idx + 1)
        elif value == 2:
            # 상, 하
            for i in range(row - 1, -1, -1):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            for i in range(row + 1, N):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            dfs(idx + 1)

            # 좌, 우
            arr = copy.deepcopy(temp)
            for i in range(col -1, -1, -1):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            for i in range(col + 1, M):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            dfs(idx + 1)
        elif value == 3:
            # 상, 우
            for i in range(row - 1, -1, -1):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            for i in range(col + 1, M):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            dfs(idx + 1)

            # 우, 하
            arr = copy.deepcopy(temp)
            for i in range(col + 1, M):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            for i in range(row + 1, N):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            dfs(idx + 1)

            # 하, 좌
            arr = copy.deepcopy(temp)
            for i in range(row + 1, N):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            for i in range(col -1, -1, -1):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            dfs(idx + 1)

            # 좌, 상
            arr = copy.deepcopy(temp)
            for i in range(col -1, -1, -1):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            for i in range(row - 1, -1, -1):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            dfs(idx + 1)
        elif value == 4:
            # 좌, 상, 우
            for i in range(col -1, -1, -1):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            for i in range(row - 1, -1, -1):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            for i in range(col + 1, M):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            dfs(idx + 1)

            # 상, 우, 하
            arr = copy.deepcopy(temp)
            for i in range(row - 1, -1, -1):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            for i in range(col + 1, M):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            for i in range(row + 1, N):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            dfs(idx + 1)

            # 우, 하, 좌
            arr = copy.deepcopy(temp)
            for i in range(col + 1, M):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            for i in range(row + 1, N):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            for i in range(col -1, -1, -1):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            dfs(idx + 1)

            # 하, 좌, 상
            arr = copy.deepcopy(temp)
            for i in range(row + 1, N):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            for i in range(col -1, -1, -1):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            for i in range(row - 1, -1, -1):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            dfs(idx + 1)
        else:
            # 상
            for i in range(row - 1, -1, -1):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            # 하
            for i in range(row + 1, N):
                if arr[i][col] == 0:
                    arr[i][col] = '#'
                elif arr[i][col] == 6:
                    break
            # 좌
            for i in range(col -1, -1, -1):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            # 우
            for i in range(col + 1, M):
                if arr[row][i] == 0:
                    arr[row][i] = '#'
                elif arr[row][i] == 6:
                    break
            dfs(idx + 1)


if __name__ == "__main__":

    # input
    N, M = map(int, sys.stdin.readline().split())  # 세로, 가로
    arr = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

    # CCTY 위치 가져오기
    position = []
    for i in range(N):
        for j in range(M):
            if arr[i][j] != 0 and arr[i][j] != 6:
                position.append(([arr[i][j], i, j]))

    min_area = sys.maxsize
    dfs(0)
    print(min_area)
728x90