본문 바로가기

알고리즘/🥈 실버

백준 1697 숨바꼭질 파이썬 풀이, 반례

728x90

난이도 : 실버1
풀이일 : 04237
https://www.acmicpc.net/problem/1697

1697번: 숨바꼭질

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

www.acmicpc.net


링크로 이동하기 귀찮은 분들을 위한 문제 캡쳐


풀이 코드

# 모든 좌표에 visited 배열 생성
# 순간이동 우선으로 BFS 탐색
# 시간초과 방지 queue 포인터 사용
# 만약, N==K라면 함수 실행 없이 0 출력

import sys

def BFS(n):
    visited[n] = 1
    queue = [n]
    p = 0
    while p < len(queue):
        x = queue[p]
        p += 1
        dx = [x, -1, 1]
        for k in range(3):
            nx = x + dx[k]
            if 0 <= nx < 100001 and not visited[nx]:
                queue.append(nx)
                visited[nx] = visited[x] + 1
                if nx == K:
                    return print(visited[x])

N, K = map(int, sys.stdin.readline().split())
visited = [0] * 100001

if N == K:
    print(0)
else:
    BFS(N)

코드 구성
1. 가능한 모든 숫자를 포함하는 visited 배열 생성
2. 순간이동이 걷기보다 시간 소모 적음
-> 순간이동 우선으로 큐에 추가
3. queue 사용 시 시간초과 우려
-> 포인터를 사용해 pop 구현
4. 만약, 수빈이와 동생의 좌표가 같다면 0 출력, 아니라면 함수 실행


느낀점
동일한 로직의 골드 문제를 먼저 풀고 와서 그냥 세이브를 만들어 두는 느낌으로 기록
조금 더 어려운 문제를 풀고 싶다면 순간이동 시간 조건이 다른 숨바꼭질3을 추천