상세 컨텐츠

본문 제목

감시

코딩테스트/DFS,BFS

by 수타. 2023. 7. 24. 23:44

본문

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

 

15683번: 감시

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

www.acmicpc.net

문제요약:

2차원 배열이 주어지고 1번부터 5번은 카메라 6번은 벽을 의미한다, 각각 카메라는 볼수 있는 각도가 다르고 회전이 가능 할 때 가장 안전지대가 적을때를 구하여라

 

소요시간:

50분

난이도 골드4

 

코딩:

import sys
import math
import copy
input = sys.stdin.readline
sys.setrecursionlimit(10000) 

n,m = map(int,input().split())

arr = [list(map(int,input().split())) for _ in range(n)]

dy = [-1,0,1,0]
dx = [0,1,0,-1]

camera = []
cam_5 = []

#카메라의 위치 찾기
for y in range(n):
    for x in range(m):
        if 0<arr[y][x]<5:
            camera.append([y,x,arr[y][x]])
        if arr[y][x] == 5:
            cam_5.append([y,x])

#벽에 부딫히기 전까지 카메라가 볼수 있는것 표시
def go(temp,y,x,i):
    ny = y
    nx = x
    while True:
        ny += dy[i]
        nx += dx[i]
        if 0<=ny<n and 0<=nx<m and temp[ny][nx]!=6:
            if temp[ny][nx]==0:
                temp[ny][nx] = '#'
        else:
            return

#카메라에 따라 방향 전환
def check(temp,dir,y,x,cam):
    if cam == 5:
        for i in range(4):
            go(temp,y,x,i)
    else:
        go(temp,y,x,dir)     
        elif cam == 2:
            dir +=2
            if dir>=4:
                dir-=4
            go(temp,y,x,dir)
        elif cam ==3:
            dir +=1
            if dir>=4:
                dir-=4
            go(temp,y,x,dir)
        elif cam==4:
            dir +=1
            if dir>=4:
                dir-=4
            go(temp,y,x,dir)
            dir +=1
            if dir>=4:
                dir-=4
            go(temp,y,x,dir)

#5번카메라는 변하지 않으므로 , 미리가놓기
for y,x in cam_5:
    check(arr,-1,y,x,5)
ans = int(1e9)

def dfs(arr,num):
    global ans
    if num == len(camera):
        if (zero :=sum([i.count(0) for i in arr])) < ans:
            ans = zero
        return
        
    y,x,cam = camera[num]
    for dir in range(4):    
        temp = copy.deepcopy(arr)
        check(temp,dir,y,x,cam)
        dfs(temp,num+1)

dfs(arr,0)
print(ans)

전형적인 dfs, 구현 문제이며, 구조가 복잡하진 않지만 필요한것을 빠르게 구현하는것이 관건인것같습니다. 카메라들의 위치를 먼저 찾고 이때, 5번카메라는 회전에 따라 바뀌지 않기 때문에 , 따로 찾아 미리 표시해 주었습니다. 그리고 카메라들의 방향을 바꿔가며 dfs를 진행했고, 끝났을때 제일 작은 답을 찾아 기록했습니다.

'코딩테스트 > DFS,BFS' 카테고리의 다른 글

교환(임시)  (0) 2023.09.20
사다리 조작  (0) 2023.07.26
테트로미노  (0) 2023.07.21
다단계 칫솔 판매  (0) 2023.07.14
불량 사용자  (0) 2023.07.07

관련글 더보기