[프로그래머스/파이썬] 외벽 점검(60062) 풀이

업데이트:



문제 정보


풀이

문제

원형 외벽의 취약 지점(weak)을 친구들의 이동 가능 거리(dist)로 모두 점검할 수 있는지 확인하고, 필요한 최소 친구 수를 구하는 문제입니다.

코드

from collections import deque
from bisect import bisect

def solution(n, weak, dist):
    dist = dist[::-1]
    ld = len(dist)
    weak = tuple(weak)
    
    q = deque([(weak, 0)])
    enQ = q.append
    deQ = q.popleft
    visited = set()
    visited.add(weak)

    while q:
        wps, i = deQ()
        for j in range(len(wps)):
            idx = bisect(wps, (wps[j]+dist[i])%n)
            tmpWps = wps[:j]+wps[idx:] if j < idx else wps[idx:j]
            ni = i+1
            if not tmpWps: return ni
            if ni < ld and tmpWps not in visited:
                enQ((tmpWps, ni))
                visited.add(tmpWps)

    return -1
            
print(solution(12, [1, 5, 6, 10], [1, 2, 3, 4]))

설명

남은 취약 지점 상태를 큐에 넣고 BFS로 탐색합니다.

한 상태에서 각 시작 취약점에 대해 현재 친구(dist[i])를 투입해 점검 가능한 구간을 제거한 다음, 남은 취약점 튜플을 다음 상태로 만듭니다.

취약점이 모두 제거되면 사용한 친구 수를 반환하고, 끝까지 불가능하면 -1을 반환합니다.



댓글남기기