We will find a way, we always have.

-interstellar

Problem Solving/λ°±μ€€

[λ°±μ€€] 1697번: μˆ¨λ°”κΌ­μ§ˆ - 파이썬

Redddy 2022. 6. 2. 23:26

🧩문제 해석

μˆ˜λΉˆμ΄μ™€ 동생은 일직선 상에 μœ„μΉ˜ν•˜κ³  μˆ˜λΉˆμ΄λŠ” 1μ΄ˆμ— x-1, x+1, 2*x 둜 이동할 수 μžˆλ‹€. μˆ˜λΉˆμ΄μ™€ λ™μƒμ˜ μœ„μΉ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μˆ˜λΉˆμ΄κ°€ 동생을 찾을 수 μžˆλŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μ΄ λͺ‡ 초 후인지 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ©΄ λœλ‹€.

 

πŸ“šν’€μ΄

BFSλ₯Ό μ‚¬μš©ν•˜μ—¬ ν’€μ—ˆλ‹€.
방문을 μ²΄ν¬ν•˜κΈ° μœ„ν•œ visited 리슀트λ₯Ό μƒμ„±ν•˜μ˜€λ‹€.
큐에 ν˜„μž¬ μœ„μΉ˜μ™€ ν˜„μž¬ λˆ„μ  초λ₯Ό 같이 μ €μž₯ν•˜μ—¬, 이동 ν•  λ•Œλ§ˆλ‹€ 초λ₯Ό λˆ„μ  μ‹œμΌœμ£Όμ—ˆλ‹€.
이동 κ°€λŠ₯ μœ„μΉ˜λŠ” arr 리슀트둜 λ§Œλ“€μ–΄μ£Όμ—ˆκ³ , arr μš”μ†Œ 쀑 아직 λ°©λ¬Έ ν•˜μ§€ μ•Šμ•˜κ³ , 0~100000 사이 값이라면 λ°©λ¬Έν•˜κ³  큐에 μ‚½μž… ν•˜μ˜€λ‹€.
κ·Έλ ‡κ²Œ ν•˜μ—¬ k와 같은 값을 찾으면 ν˜„μž¬ λˆ„μ  초λ₯Ό 좜λ ₯ν•˜μ˜€λ‹€.

λ§Œμ•½ μ‹œμž‘λΆ€ν„° 동생과 μˆ˜λΉˆμ΄κ°€ 같이 μžˆλ‹€λ©΄ 이동할 ν•„μš” 없기에 0을 좜λ ₯ν•œλ‹€. 그리고 동생이 μˆ˜λΉˆμ΄λ³΄λ‹€ 뒀에 μœ„μΉ˜ν•œλ‹€λ©΄ λ’€λ‘œ 1μΉΈμ”© μ΄λ™ν•˜λŠ” 방법 밖에 μ—†κ³  μ΄λ™μ‹œκ°„μ€ n-k이기에 BFS λŒλ¦¬μ§€ μ•Šκ³  λ°”λ‘œ n-kλ₯Ό 좜λ ₯ν•˜μ˜€λ‹€.

μœ„ 과정을 λ†“μ³μ„œ μ²˜μŒμ— ν‹€λ ΈμŠ΅λ‹ˆλ‹€ νŒμ •μ„ λ°›μ•˜λ‹€.

 

πŸ’» μ½”λ“œ

from collections import deque

def bfs(): # BFS μ •μ˜
    queue = deque()
    queue.append((n, 0)) # 처음 수빈이 μœ„μΉ˜μ™€ λˆ„μ  초λ₯Ό μ‚½μž…
    visited[n] = True # 처음 수빈이 μœ„μΉ˜ λ°©λ¬Έ 처리
    while queue: # 큐가 λΉŒλ•ŒκΉŒμ§€
        c, cnt = queue.popleft()
        if c == k: # λ§Œμ•½ 이동 μœ„μΉ˜μ™€ λ™μƒμœ„μΉ˜κ°€ κ°™λ‹€λ©΄ 카운트 좜λ ₯
            print(cnt)
            break
        else: # λ‹€λ₯΄λ‹€λ©΄ 이제 이동함
            arr = [c-1, c+1, 2*c] # μ•žμœΌλ‘œ ν•œμΉΈ, λ’€λ‘œ ν•œμΉΈ, μˆœκ°„μ΄λ™
            for i in arr:
                if 0 <= i <= 100000: # μ΄λ™λ²”μœ„, ν•„μš”μ—†λŠ” κ°’μœΌλ‘œ νƒμƒ‰κ°€λŠ” 것을 쀄이기 μœ„ν•œ ꡬ문
                    if not visited[i]: # λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄
                        visited[i] = True # λ°©λ¬Έ μ²˜λ¦¬ν•˜κ³ 
                        queue.append((i, cnt+1)) # 큐에 μ‚½μž…, 1초 κ²½κ³Ό


n, k = map(int, input().split()) # 수빈이 μœ„μΉ˜μ™€ λ™μƒμœ„μΉ˜μž…λ ₯ λ°›μŒ
visited = [False for i in range(100001)] # 방문체크
if n == k: # μ‹œμž‘λΆ€ν„° μˆ˜λΉˆμ΄μ™€ 동생이 같은 μœ„μΉ˜μ— μžˆλ‹€λ©΄ 움직이지 μ•ŠμŒ
    print(0)
elif n > k: # 동생이 μˆ˜λΉˆμ΄λ³΄λ‹€ 뒀에 μœ„μΉ˜ν•œλ‹€λ©΄ νƒμƒ‰ν•„μš”μ—†κ³  κ·Έλƒ₯ λ’€λ‘œ ν•œμΉΈμ”© μ΄λ™ν•˜λ©΄ λœλ‹€. μˆœκ°„μ΄λ™μ„ λͺ»ν•œλ‹€λŠ” 뜻
    print(n-k)
else: # BFS ν•¨μˆ˜ 호좜
    bfs()

 

πŸ”— 문제 링크 : μˆ¨λ°”κΌ­μ§ˆ

 

1697번: μˆ¨λ°”κΌ­μ§ˆ

μˆ˜λΉˆμ΄λŠ” 동생과 μˆ¨λ°”κΌ­μ§ˆμ„ ν•˜κ³  μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” ν˜„μž¬ 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” κ±·κ±°λ‚˜ μˆœκ°„μ΄λ™μ„ ν•  수 μžˆλ‹€. λ§Œμ•½, 수빈이의 μœ„μΉ˜κ°€ X일

www.acmicpc.net

 

700