Po_tta_tt0
콩심콩 팥심팥 🌱
Po_tta_tt0
전체 방문자
오늘
어제
  • 분류 전체보기 (266)
    • 🐛 회고 (14)
    • 💭 생각 (2)
    • 🤸‍♀️ 내 프로젝트 (16)
      • FISH-NEWS (8)
      • MBTI 과몰입 테스트 (2)
      • twitter clonecoding with TS (4)
      • pilzagenda (2)
    • 👨‍👩‍👧‍👦 팀 프로젝트 (2)
      • 피우다 프로젝트 (0)
      • SEMO(세상의 모든 모임) (1)
      • 마음을 전하는 텃밭 (1)
      • Stackticon (0)
    • 👨‍💻 CS지식 (11)
    • ✍ 공부 (94)
      • JavaScript (21)
      • TypeScript (39)
      • Html (0)
      • CSS (2)
      • React (18)
      • NextJS (7)
      • Vue (1)
      • Python (1)
      • Django (0)
      • 개발환경 & 그 외 (2)
    • 🏄‍♀️ 코딩테스트 (99)
      • 🐍 Python (99)
    • 🐙 Git & GitHub (3)
    • 📑 오류기록 (8)
    • 📚 우리를 위한 기록 (9)
    • 수업 (3)
    • 강의 등 (2)
    • 👩‍🎓 SSAFY (0)
    • 👋 우테코 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 백준
  • React
  • react-router-dom
  • js
  • 파이썬 감시 피하기
  • 백준 파이썬
  • Next.js
  • 백준 숨바꼭질
  • bfs
  • dfs
  • 이분탐색
  • 구현
  • 자바스크립트
  • 플로이드 워셜
  • 파이썬
  • DP
  • 파이썬 다익스트라
  • 문자열
  • 시뮬레이션
  • BFS + DP

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Po_tta_tt0

콩심콩 팥심팥 🌱

🏄‍♀️ 코딩테스트/🐍 Python

[ 백준 13549 ] ( python ) 숨바꼭질 3

2022. 6. 22. 22:49
반응형

 

📚 숨바꼭질 3

 

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

 

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

 

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

 

예제 입력 1 복사

5 17

예제 출력 1 복사

2

 

 

 

 

✍ 접근

  • 최단거리구하기문제는 여러가지 접근법이 있다는 것을 기억!
  • BFS / 다익스트라로 접근했다

 

 

 

정답코드 ( BFS )

# ✨ 입력
import sys
from collections import deque
input = sys.stdin.readline
N,K = map(int,input().split())
INF = 2147000000

# ✨ BFS
def BFS(N,K):
    dq = deque([])
    dq.append((0,N))
    ch_board = [INF] * (100001)
    ch_board[N] = 0
    while dq:
        val, node = dq.popleft()
        for x in [(1,node+1),(1,node-1),(0,node*2)]:
            if 0<=x[1]<100001:
                if ch_board[x[1]] > val+x[0]:
                    ch_board[x[1]] = val+x[0]
                    dq.append((ch_board[x[1]],x[1]))
    return ch_board[K]

# ✨ 출력
print(BFS(N,K))

입력

  • BFS를 쓰기 위해 deque를 import해오고 입력받는다

BFS 함수

  • N과 K를 인자로 받아 BFS
  • ch_board에 가장 빠른 거리를 갱신해주며 입력해준다. 100001개를 INF로 초기화
  • while문에서는
    • [(n+1,1),(n-1,1),(n*2,0)]을 돌면서
    • if문을 통해 list밖으로 벗어나지 않을 때만
    • 그 중에서도 ch_board에 저장된 값(시간)보다 val+x[0] 현재 node까지 온 시간과 다음 node(위치)까지 가는 시간이 적을 때
      • ch_board를 업데이트해두고
      • dq에 값을 추가해준다

 

 

정답코드 ( 다익스트라 | Dijkstra )

# ✨ 입력
import sys
import heapq
input = sys.stdin.readline
N,K = map(int,input().split())
INF = 2147000000

# ✨ dijkstra 함수
def dijkstra(N,K):
    dist = [INF]*(100001)
    dist[N] =0 
    hq = []
    heapq.heappush(hq,(0,N))
    while hq:
        w,n = heapq.heappop(hq)
        for nx in [(n+1,1),(n-1,1),(n*2,0)]:
            if 0<=nx[0]<100001 and dist[nx[0]] > w + nx[1]:
                dist[nx[0]] = w + nx[1]
                heapq.heappush(hq,(dist[nx[0]],nx[0]))
    print(dist[K])
dijkstra(N,K)

입력

  • dijkstra를 쓰기 위해 heapq를 import해오고 입력받는다

dijkstra 함수

  • dist라는 list를 INF 100001개로 초기화해준 후
  • dist[N] = 누나 위치를 0으로 초기화한다
  • hq에 (time, N) == (0,N)을 넣어준다
  • while문을 돌면서
    • for문을 통해 BFS랑 같은 방식으로 돌아준다

 

heap이냐 deque냐의 문제이지 방법은 같다

 

 

 

⭐ 배움

  • 최단거리!
반응형
저작자표시 (새창열림)

'🏄‍♀️ 코딩테스트 > 🐍 Python' 카테고리의 다른 글

[ 백준 4485 ] ( python ) 녹색 옷 입은 애가 젤다지?  (0) 2022.06.23
[ 백준 1261 ] ( python ) 알고스팟  (0) 2022.06.23
[ 백준 1504 ] ( python ) 특정한 최단 경로  (0) 2022.06.22
[ 백준 2470 ] ( python ) 두 용액  (0) 2022.06.15
[ 백준 1946 ] ( python ) 신입 사원  (0) 2022.06.13
    '🏄‍♀️ 코딩테스트/🐍 Python' 카테고리의 다른 글
    • [ 백준 4485 ] ( python ) 녹색 옷 입은 애가 젤다지?
    • [ 백준 1261 ] ( python ) 알고스팟
    • [ 백준 1504 ] ( python ) 특정한 최단 경로
    • [ 백준 2470 ] ( python ) 두 용액
    Po_tta_tt0
    Po_tta_tt0
    감자의 코딩하는 블로그 콩심은데 콩나고 팥심은데 팥난다

    티스토리툴바