소토
소토의 기록하는 삶
소토
전체 방문자
오늘
어제
  • 분류 전체보기 (34)
    • Algorithm (34)
      • Problem (34)
    • Web (0)
    • ML & AI (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 직장인인강
  • 코드스테이츠
  • 한번에끝내는JavaSpring웹개발마스터초격차패키지Online
  • 백준
  • 직장인자기계발
  • 알고리즘
  • 패스트캠퍼스후기
  • 패스트캠퍼스
  • 패캠챌린지
  • 문제

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
소토

소토의 기록하는 삶

Algorithm/Problem

[Baekjoon] 15683번 : 감시 - Python

2022. 2. 4. 13:14

Gold 5

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

 

15683번: 감시

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

www.acmicpc.net

문제 풀이

오랜만에 dfs 유형! + 구현

각 카메라마다 볼 수 있는 방향들을 리스트로 만들어주고 dfs로 탐색해준다.

 

코드

from copy import deepcopy

n, m = map(int, input().split())
office, cctv = [], []
min_value = 1e9

for i in range(n):
    office.append(list(map(int, input().split())))
    for j in range(m):
        if office[i][j] in [1, 2, 3, 4, 5]:
            cctv.append((office[i][j], i, j))


# 각 카메라별로 볼 수 있는 방향 설정
camera = [[],
          [[0], [1], [2], [3]],
          [[0, 2], [1, 3]],
          [[0, 1], [1, 2], [0, 3], [2, 3]],
          [[0, 1, 2], [1, 2, 3], [0, 2, 3], [0, 1, 3]],
          [[0, 1, 2, 3]]]


mx = [1, 0, -1, 0]
my = [0, -1, 0, 1]

def on_cctv(direction, x, y, arr):
    for d in direction:
        nx, ny = x, y
        while True:
            nx += mx[d]
            ny += my[d]

            if 0 > nx or nx >= n or ny < 0 or ny >= m:
                break
            if arr[nx][ny] == 6:
                break
            elif arr[nx][ny] == 0:
                arr[nx][ny] = 7


def solution(num, arr):
    global min_value

    # cctv 개수 모두 탐색이 완료되면 중단
    if num == len(cctv):
        count = 0
        for i in range(n):
            count += arr[i].count(0)
        min_value = min(count, min_value)
        return

    # 값만 복사 하도록 deepcopy
    temp_office = deepcopy(arr)

    # cctv번호와 좌표
    cctv_num, x, y = cctv[num]
    for direction in camera[cctv_num]:
        on_cctv(direction, x, y, temp_office)
        solution(num+1, temp_office)
        # 다시 원상 복귀
        temp_office = deepcopy(arr)


solution(0, office)
print(min_value)
728x90
저작자표시 (새창열림)

'Algorithm > Problem' 카테고리의 다른 글

[Baekjoon] 14500 : 테트로미노 - Python  (0) 2022.02.10
[Baekjoon] 14891 : 톱니바퀴 - Python  (0) 2022.02.07
[Baekjoon] 20055번 : 컨베이어 벨트 위의 로봇 - Python  (0) 2022.02.04
[Baekjoon] 2565번 : 전깃줄  (0) 2022.01.25
[Baekjoon] 11054번 : 가장 긴 바이토닉 부분 수열  (0) 2022.01.24
    소토
    소토

    티스토리툴바