새소식

⌨️ Algorithms/백준

[Python] 백준 1697번_숨바꼭질

2023. 1. 19. 21:34

  • -

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

 

1697번: 숨바꼭질

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

www.acmicpc.net

 

  • 숨바꼭질
  • 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있음
  • 수빈이는 걷거나 순간이동 가능
  • 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동
  • 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동
  • 수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하기
  • 입력
    • 첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어짐
    • N과 K는 정수
  • 출력
    • 수빈이가 동생을 찾는 가장 빠른 시간을 출력
  • 시간 제한: 2초
  • 메모리 제한: 128 MB

 

"""
입출력 예시)

5 17
    -> 4
"""
# N = 5, K = 17

# -> 수빈이가 5-10-9-18-17 순으로 가면 4초만에 동생을 찾을 수 있음
# => 4

 

 

## 의사코드 ##

# 가장 빠른 시간 -> 최단 경로 찾기 => BFS
# deque

# 수빈이 위치: N
# 동생 위치: K

# 수빈이가 이동할 수 있는 곳
#   1) X - 1
#   2) X + 1
#   3) 2 * X

# N+1만큼의 배열(visited) 생성 
# visited = [0] * (N+1)

# BFS

# while q:
#   현재 위치 = q.popleft()
#   if 현재 위치 == K: # K -> 동생 위치
#       reutrn visited[현재 위치]
#   # 수빈이가 이동할 수 있는 위치 내에서 탐색 
#   for 다음 위치 in ((현재 위치 -1), (현재 위치 +1), (2*현재 위치)):
#   if 0 <= 다음 위치 < (N+1) and not visited[다음 위치]:
#       visited[다음 위치] = visited[현재 위치] + 1 # 방문처리 & 시간+1
#       q.append(다음 위치)

 

 

 

첫 번째 시도

 

from collections import deque

# 수빈이 위치, 동생 위치
n, k = map(int, input().split())

# n+1 만큼의 배열(visited) 생성
visited = [0] * (n+1)

# BFS 수행
def bfs():
    q = deque([n])
    while q:
        current_pos = q.popleft()
        if current_pos == k:
            return visited[current_pos]
        # 수빈이가 이동할 수 있는 위치 내에서 탐색
        for next_pos in (current_pos-1, current_pos+1, 2*current_pos):
            # 다음 위치가 그래프의 범위를 벗어나지 않으면서 아직 방문하지 않았다면
            if 0 <= next_pos < (n+1) and not visited[next_pos]:
                # 방문처리 & 걸리는 시간 + 1
                visited[next_pos] = visited[current_pos] + 1
                q.append(next_pos)

print(bfs())

-> 틀림 (값이 return 되지 않음)

-> visited의 길이를 n과 k의 최댓값만큼 설정해야 하는데 그냥 n+1 값으로 설정해서 틀림 

       (n=5 -> visited의 길이가 6으로만 설정된 것)

 

 

통과한 코드

 

from collections import deque

# 수빈이 위치, 동생 위치
n, k = map(int, input().split())

# n+1 만큼의 배열(visited) 생성
max_n = 100000
visited = [0] * (max_n+1)

# BFS 수행
def bfs():
    q = deque([n])
    while q:
        current_pos = q.popleft()
        if current_pos == k:
            return visited[current_pos]
        # 수빈이가 이동할 수 있는 위치 내에서 탐색
        for next_pos in (current_pos-1, current_pos+1, 2*current_pos):
            # 다음 위치가 그래프의 범위를 벗어나지 않으면서 아직 방문하지 않았다면
            if 0 <= next_pos < (max_n+1) and not visited[next_pos]:
                # 방문처리 & 걸리는 시간 + 1
                visited[next_pos] = visited[current_pos] + 1
                q.append(next_pos)

print(bfs())

-> visited를 생성할 때 N과 K의 최대값인 100000 만큼을 따로 변수로 설정

 

 

 

BFS로 탐색을 진행할 때

기본 BFS의 소스코드에서 탐색할 범위를 수빈이가 이동할 수 있는 범위로 어떻게 수정해야 할지가 바로 떠오르지 않았다.

그래도 이번 문제를 통해서 탐색할 범위를 어떻게 설정하면 되는지 배울 수 있었다!

 

 

 

 

참고)

 

https://data-flower.tistory.com/78

 

[백준 1697번] 숨바꼭질 - 파이썬

문제 링크: https://www.acmicpc.net/problem/1697 1697번: 숨바꼭질 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나

data-flower.tistory.com

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!