코딩딩/BOJ

[백준 20304번 비밀번호 제작] 문제풀이

전낙타 2024. 8. 18. 16:53
import sys
from collections import deque
input = sys.stdin.readline
INF = float('-inf')

'''
결국 bfs + 비트마스킹을 응용하면 되는 문제였음
문제를 이해하기까진 어려웠지만 이해 후엔 그냥 무지성 bf랑 똑같았음
'''

def bfs(N, initialPositions):
    distance = [INF] * (N + 1)
    # BFS 큐 초기화
    queue = deque()
    # 초기 위치 설정
    for position in initialPositions:
        distance[position] = 0
        queue.append(position)

    maxDistance = 0

    while queue:
        current = queue.popleft()
        for bit in range(20):
            nextPosition = current ^ (1 << bit)
            if nextPosition > N or distance[nextPosition] != INF:
                continue
            queue.append(nextPosition)
            distance[nextPosition] = distance[current] + 1
            maxDistance = max(maxDistance, distance[nextPosition])

    return maxDistance

N = int(input())
M = int(input())
initialPositions = list(map(int, input().split()))

result = bfs(N, initialPositions)
print(result)

 

문제 읽다가 정신 나갈뻔했다.

결국 이해하고 나니 비트마스킹 + BFS로 다른 유형과 거의 일치함