developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 코테파이썬
  • 삼성코테파이썬풀이
  • 카카오코테java풀이
  • 삼성코테기출
  • 삼성코테기출자바풀이
  • 통계분석
  • 카카오코테
  • c++디자인패턴
  • 통계학
  • 삼성코테구현문제추천
  • 데이터분석
  • SW역량테스트파이썬풀이
  • 시계열
  • 운영체제인터럽트
  • AR모형
  • 삼성코테구현풀이
  • 삼성코테준비
  • BOJ파이썬풀이
  • 삼성코테자바꿀팁
  • 백준파이썬풀이
  • 시계열분석
  • 삼성코테파이썬
  • SW역량테스트파이썬
  • 삼성코테자바풀이
  • Arima
  • c++ 빌더 패턴
  • ARIMA모형
  • 삼성코테자바준비
  • 삼성코테파이썬준비
  • MA모형

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 감시 15683번 (python)

2021. 10. 15. 16:12

❓ 문제 - 백준 감시 15683번 - python 풀이법

출처 

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

 

15683번: 감시

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

www.acmicpc.net

 

 

 

📝 문제해결법

1. 이 문제는 DFS+구현으로 풀었다.

  • mode라는 리스트로 CCTV의 종류(1, 2, 3, 4, 5)에 따라 회전했을 때 바라보는 방향을 넣어준다.
  • 사무실의 정보를 입력받을 때, cctv의 종료 및 위치(i,j)를 cctv 리스트에 append한다.
  • DFS를 돌려서 해당 cctv의 종류의 각도로 감시를 실행한 후,  cctv 갯수만큼 CCTV로 감시를 다 했을 때 사각지대의 최솟값을 갱신한다.
  • fill() : 해당 CCTV의 종류에서 바라보는 방향에 따라 감시할 수 있는 곳은 다 7로 변환시켜 감시하고, 만약 벽을 만나거나 범위를 넘는 곳을 탐색하면 while 문을 빠져 나와 감시를 종료한다.

 

 

💻 소스코드

import copy
n, m = map(int, input().split())
cctv = []
graph = []
mode = [
    [],
    [[0], [1], [2], [3]],
    [[0, 2], [1, 3]],
    [[0, 1], [1, 2], [2, 3], [0, 3]],
    [[0, 1, 2], [0, 1, 3], [1, 2, 3], [0, 2, 3]],
    [[0, 1, 2, 3]],
]

# 북 - 동 - 남 - 서
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

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

def fill(board, mm, x, y):
    for i in mm:
        nx = x
        ny = y
        while True:
            nx += dx[i]
            ny += dy[i]
            if nx < 0 or ny < 0 or nx >= n or ny >= m:
                break
            if board[nx][ny] == 6:
                break
            elif board[nx][ny] == 0:
                board[nx][ny] = 7

def dfs(depth, arr):
    global min_value

    if depth == len(cctv):
        count = 0
        for i in range(n):
            count += arr[i].count(0)
        min_value = min(min_value, count)
        return
    temp = copy.deepcopy(arr)
    cctv_num, x, y = cctv[depth]
    for i in mode[cctv_num]:
        fill(temp, i, x, y)
        dfs(depth+1, temp)
        temp = copy.deepcopy(arr)


min_value = int(1e9)
dfs(0, graph)
print(min_value)

 

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

BOJ - 드래곤 커브 15685번 (python)  (0) 2021.10.16
BOJ - 사다리 조작 15684번 (python)  (0) 2021.10.15
BOJ - 톱니바퀴 14891번 (python, JAVA)  (0) 2021.10.15
BOJ - 경사로 14890번 (python, JAVA)  (0) 2021.10.15
BOJ - 스타트와 링크 14889번 (python)  (4) 2021.10.14
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 드래곤 커브 15685번 (python)
    • BOJ - 사다리 조작 15684번 (python)
    • BOJ - 톱니바퀴 14891번 (python, JAVA)
    • BOJ - 경사로 14890번 (python, JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바