본문 바로가기
Algorithm/Baekjoon

17071. 숨바꼭질 5 (Python)

by 원만사 2022. 6. 9.
반응형

 

 

17071번: 숨바꼭질 5

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 500,000)에 있고, 동생은 점 K(0 ≤ K ≤ 500,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

www.acmicpc.net

 

풀이

 시간 제한이 0.25초로 빡빡하기 때문에 일반적인 방문체크로는 정답을 구할 수 없다. 이때 필요한 것이 짝수초와 홀수초로 나누어 방문 체크를 하는 것이다.

 예를 들어 수빈이가 10의 위치에 2초에 도착했다고 가정해보자. 수빈이는 X-1이나 X+1을 이동할 수 있다. 즉, 10에서 왼쪽으로 한 번 이동하고 오른쪽으로 한 번 이동하는 방식으로 다시 같은 위치로 이동할 수 있다. 10의 위치에 2 + 2초, 2 + 4초, 2 + 6초, .... 와 같은 방식으로 도착할 수 있는 것이다. 만약 동생이 10의 위치에 6초가 걸려 도착했다면 둘은 6초에 10에서 만날 수 있음을 알 수 있다.

 

 그렇기 때문에 방문 체크는 짝수초와 홀수초로 나누어 해당 위치에 짝수초에 도착했는지 홀수초에 도착했는지를 체크한다.

visited[loc][0] : loc 위치에 짝수초가 걸려 도착했음을 의미
visited[loc][1] : loc 위치에 홀수초가 걸려 도착했음을 의미

 

 위와 같은 방법으로 방문 체크를 하면 시간 안에 수빈이와 동생이 몇 초에 만날 수 있는지를 구할 수 있다.

 

코드

LIMIT = 500_000

if __name__ == '__main__':
    N, K = map(int, input().split())

    # visited[loc][0] : loc 위치에 짝수초에 도착, visited[loc][1] : loc 위치에 홀수초에 도착
    visited = [[-1] * 2 for _ in range(LIMIT + 1)]

    if N == K:  # 시작부터 둘의 위치가 같을 경우 0 출력하고 종료
        print(0)
        exit()

    q = [N]
    time = 1
    K += time

    while True:
        if K > LIMIT:  # 동생이 500,000을 넘어서면 탐색 종료
            break

        nextQ = []

        for subin in q:
            for nextSubin in [subin + 1, subin - 1, subin * 2]:
                # 수빈이의 다음 위치가 범위 안에 있고 아직 도착한 적이 없는 위치라면
                if 0 <= nextSubin <= LIMIT and visited[nextSubin][time % 2] == -1:
                    nextQ.append(nextSubin)  # 새로운 큐에 위치를 넣어주고
                    visited[nextSubin][time % 2] = time  # 방문 체크를 해준다.

        # 동생의 위치 K가 짝수초 또는 홀수초에 도착한 적이 있다면
        # 현재 시간을 출력하고 시스템 종료
        if visited[K][time % 2] != -1:
            print(time)
            exit()

        time += 1
        K += time
        q = nextQ

    # 프로그램이 종료되지 않았다면 둘은 범위 내에서 만날 수 없음을 의미
    print(-1)
반응형

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

2624. 동전 바꿔주기 (Python)  (0) 2022.06.11
1774. 우주신과의 교감 (Python)  (0) 2022.06.10
17136. 색종이 붙이기 (Python)  (0) 2022.06.07
2240. 자두나무 (Python)  (0) 2022.06.06
2141. 우체국 (Python)  (0) 2022.06.04

댓글