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

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

by IT learning 2021. 6. 20.
728x90

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

문제

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

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

μž…λ ₯

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

좜λ ₯

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

λ‘˜μ§Έ 쀄에 μ–΄λ–»κ²Œ 이동해야 ν•˜λŠ”μ§€ 곡백으둜 ꡬ뢄해 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯ 1

5 17

예제 좜λ ₯ 1

4

5 4 8 16 17

 

λŒ€μΆ© μ΄λ ‡κ²Œ λ‚˜μ™€μ•Ό ν•˜λŠ”λ° μ•žμ— κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ€ μ›λž˜ ν•˜λ˜λŒ€λ‘œ ν•˜λ©΄ λœλ‹€. 근데, 뒀에 μ–΄λ–»κ²Œ μ΄λ™ν•˜λŠ”κ²Œ λ§‰λ§‰ν–ˆλ‹€. κ·Έλž˜μ„œ 일단 리슀트 νŒŒμ„œ λ¬΄μž‘μ • λ„£μ–΄λ΄€λ‹€.

음,,,이건 μ•„λ‹ˆλΌκ³  μƒκ°ν–ˆλ‹€..

 

κ·Έλ ‡λ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ,,? μ΄λ²ˆμ—λ„ λ‘œμ§μ„ μ°Ύμ•„λ³΄μ•˜λ‹€..γ… γ… γ… γ… γ…  (μ–Έμ œ λ‚΄ 머리둜 찾을지..μŠ¬ν”„λ‹€..)

μ°Έ λŒ€λ‹¨ν•˜μ‹ κ²ƒ κ°™λ‹€.. λ”°λ‘œ MAX 리슀트λ₯Ό λ§Œλ“€μ–΄μ„œ x값을 λ„£κ³ , μž¬κ·€λ₯Ό 돌리며 μ›λž˜ μ‹œμž‘ν–ˆλ˜ 값이 λ‚˜μ˜¬λ•ŒκΉŒμ§€ 좜λ ₯ν•˜λ©΄ λ˜λŠ”κ±°μ˜€λ‹€.

 

말이 이해가 잘 μ•ˆκ°ˆμˆ˜λ„ μžˆλŠ”λ°,

 

일단 제일 빨리 κ°€λŠ” μ‹œκ°„μ„ κ΅¬ν• λ•Œ, κ±°κΈ°λ‹€κ°€ move_to 라고 λ”°λ‘œ λ§Œλ“  λ¦¬μŠ€νŠΈμ— (μ΄ˆκΈ°ν™”λ₯Ό 0으둜 MAX_INDEX + 1 λ§ŒνΌν•΄μ€¬λ‹€) 같이 본래의 값을 λ„£μ–΄μ€€λ‹€.

for nx in (x-1, x+1, x*2):
        if 0 <= nx <= MAX_INDEX and board[nx] == MAX_INDEX:
            q.append(nx)
            board[nx] = board[x] + 1 
            move_to[nx] = x # 이거닀

κ·ΈλŸ¬λ‹ˆκΉŒ μ΄λ™ν•œ 곳에 ν˜„μž¬μ˜ 인덱슀 수λ₯Ό 넣어쀀것이닀. μ΄λ ‡κ²Œ 차곑차곑 λ„£μ–΄μ£Όκ³ ,

 

def move(n,m):
    if n != m:
        move(n,move_to[m])
    print(m, end=' ')

μ΄λ ‡κ²Œ n,k값을 λ§€κ°œλ³€μˆ˜λ‘œ λ„£μ–΄μ£Όκ³  λ‚œ 뒀에, λ’€μ—μ„œλΆ€ν„° μ­‰μ­‰ κ°€λŠ”κ±°λ‹€. 근데 μž¬κ·€λΌ λ‹€μ‹œ μ•žμ—μ„œλΆ€ν„° 좜λ ₯λ˜λŠ”κ²ƒμ΄λ‹€. (사싀 이건 잘 λͺ¨λ₯΄κ² λ‹€) μ΄λ ‡κ²Œ ν’€μ–΄λ‚˜κ°”λ‹€. 

 

μ „μ²΄μ½”λ“œ

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

def move(n,m):
    if n != m:
        move(n,move_to[m])
    print(m, end=' ')

print(board[k])
move(n,k)

μ°Έ,,ν•˜λ©΄ ν•  수둝 벽이 λŠκ»΄μ§€λŠ” μ•Œκ³ λ¦¬μ¦˜μ˜ 세상이닀..

728x90

λŒ“κΈ€

IT_learning's Commit