λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm/λ°±μ€€

BOJ 13549. μˆ¨λ°”κΌ­μ§ˆ 3 (파이썬 Python)

by IT learning 2021. 6. 20.
728x90

 

Solved.ac κΈ°μ€€ πŸ₯‡ κ³¨λ“œ 5

문제

μˆ˜λΉˆμ΄λŠ” 동생과 μˆ¨λ°”κΌ­μ§ˆμ„ ν•˜κ³  μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” ν˜„μž¬ 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” κ±·κ±°λ‚˜ μˆœκ°„μ΄λ™μ„ ν•  수 μžˆλ‹€. λ§Œμ•½, 수빈이의 μœ„μΉ˜κ°€ X일 λ•Œ κ±·λŠ”λ‹€λ©΄ 1초 후에 X-1 λ˜λŠ” X+1둜 μ΄λ™ν•˜κ²Œ λœλ‹€. μˆœκ°„μ΄λ™μ„ ν•˜λŠ” κ²½μš°μ—λŠ” 0초 후에 2*X의 μœ„μΉ˜λ‘œ μ΄λ™ν•˜κ²Œ λœλ‹€.

μˆ˜λΉˆμ΄μ™€ λ™μƒμ˜ μœ„μΉ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μˆ˜λΉˆμ΄κ°€ 동생을 찾을 수 μžˆλŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ΄ λͺ‡ 초 후인지 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫 번째 쀄에 μˆ˜λΉˆμ΄κ°€ μžˆλŠ” μœ„μΉ˜ Nκ³Ό 동생이 μžˆλŠ” μœ„μΉ˜ Kκ°€ 주어진닀. Nκ³Ό KλŠ” μ •μˆ˜μ΄λ‹€.

좜λ ₯

μˆ˜λΉˆμ΄κ°€ 동생을 μ°ΎλŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ„ 좜λ ₯ν•œλ‹€.

 

 

문제 풀이

λ¬Έμ œμ—μ„œ μ£ΌλŠ” 쑰건이 기쑴에 μˆ¨λ°”κΌ­μ§ˆκ³ΌλŠ” λ‹€λ₯Έμ μ΄ μžˆλ‹€. μ›λž˜ μœ„μΉ˜μ˜ 이동은 λ‹€ 1초둜 ν†΅μΌλ˜μ–΄μžˆμ—ˆλŠ”λ°, μ—¬κΈ°μ„  μ•ž λ’€ μ›€μ§μž„λ§Œ 1μ΄ˆκ°€ μ†Œμš”λœλ‹€κ³  λ‚˜μ˜¨λ‹€. 즉 μˆœκ°„μ΄λ™μ„ ν•  λ•ŒλŠ” μ‹œκ°„μ΄ μ†Œμš”λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 말이닀. 이 점만 잘 κ΅¬ν˜„ν•΄μ£Όλ©΄ λœλ‹€κ³  μƒκ°ν–ˆλ‹€.

 

μ²˜μŒμ—” 이 μ‹œλ¦¬μ¦ˆμ˜ 이전 문제의 λ‘œμ§μ„ 따라 ν–ˆμ—ˆλ‹€. x-1,x+1, x*2 λ₯Ό ν•˜λ‚˜λ‘œ λ¬Άμ–΄μ„œ for문을 λŒλ Έμ§€λ§Œ, 닡은 잘 λ‚˜μ˜€μ§€ μ•Šμ•˜λ‹€.

 

κ·ΈλŸ¬λ‹€ μ—¬λŸ¬ λΈ”λ‘œκ·Έλ₯Ό 돌며 λ‘œμ§μ„ νŒŒμ•…ν–ˆκ³ , 닡을 λ„μΆœν–ˆλ‹€.

 

일단 μ˜ˆμ‹œ 문제λ₯Ό ν‘ΈλŠ” 과정을 μ‚΄νŽ΄λ΄€λ‹€. 

 

μ˜ˆμ‹œ 문제의 input은 5 , 17 .

이 문제λ₯Ό μˆ˜λΉˆμ΄κ°€ 5-10-9-18-17 순으둜 κ°€λ©΄ 2μ΄ˆλ§Œμ— 동생을 찾을 수 μžˆλ‹€. λ‘œ ν‘ΈλŠ” 힌트λ₯Ό 보며, λ¨Όμ € κ³±ν•˜κ³  μ•ž λ’€λ‘œ λΉΌλŠ” 둜직이 λ§žκ² κ΅¬λ‚˜ λΌλŠ” 생각을 ν•΄λƒˆλ‹€. λ”°λΌμ„œ ν•œλ²ˆμ— λ‹€ ν•˜λŠ”κ²Œ μ•„λ‹Œ, λ¨Όμ € κ³±ν•˜κ³  μ•ž λ’€λ‘œ λΉΌμ£ΌλŠ” κ±Έ κ΅¬μƒν–ˆλ‹€.

 

# μˆ¨λ°”κΌ­μ§ˆ 3
import sys
from collections import deque
input = sys.stdin.readline
n,k = map(int,input().split())
MAX_INDEX = 100000
board = [-1] * (MAX_INDEX+1)
#dist = [False] * (MAX_INDEX+1)
q = deque()
q.append(n)
board[n] = 0
#dist[n] = True
while q:
    x = q.popleft()
    if x == k:
        break
    if x * 2 <= MAX_INDEX and board[x*2] == -1: #dist[x*2] == False:
        q.append(x*2)
        board[x*2] = board[x]
        #dist[x*2] = True
    
    for nx in (x-1, x+1):
        if 0 <= nx <= MAX_INDEX and board[nx] == -1: #dist[nx] == False:
            q.append(nx)
            board[nx] = board[x] + 1
            #dist[nx] = True
print(board[k])

 

μ£Όμ„μ²˜λ¦¬μ˜ μ˜λ―ΈλŠ” , dist 리슀트λ₯Ό λ§Œλ“€μ–΄ 이게 방문을 ν–ˆμ—ˆλŠ”μ§€ μ•ˆν–ˆμ—ˆλŠ”μ§€λ₯Ό νŒλ‹¨ν•˜λŠ” λ¦¬μŠ€νŠΈμ΄λ‹€.

근데 생각을 λ‹€μ‹œ ν•΄λ³΄λ‹ˆ, ꡳ이 distκ°€ ν•„μš” μ—†κ³ , 초기 섀정을 ν•΄λ…Ό board의 값이 만일 λ°”λ€Œμ—ˆμœΌλ©΄ μ§€λ‚˜κ°„ κ²ƒμ΄λ‹ˆ, κ·Έ κ°’μœΌλ‘œ dist의 역할을 λŒ€μ²΄ν–ˆλ‹€. 

 

μ½”λ“œλ₯Ό 보면, λ¨Όμ € 인덱슀λ₯Ό λ½‘μ•„μ„œ 2λ₯Ό κ³±ν•΄μ£Όκ³ , κ·Έλ‹€μŒμ— for문을 λŒμ•„κ°€λŠ” ν˜•μ‹μœΌλ‘œ κΎΈλ©°μ‘Œλ‹€.

 

μ•„λž˜μ˜ λ§žμ•˜μŠ΅λ‹ˆλ‹€λŠ” dist 리슀트λ₯Ό ν™œμš©ν•œ 것, μœ„μ— κΊΌλŠ” 없앀것이닀. (μ†λ„μ°¨μ΄λŠ” λ³„λ‘œ μ—†μ—ˆλ‹€..)

728x90

λŒ“κΈ€

IT_learning's Commit