[λ°±μ€€/python] 12851번 : μˆ¨λ°”κΌ­μ§ˆ 2

2021. 8. 25. 16:05

문제

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

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

 

μž…λ ₯

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

 

좜λ ₯

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

λ‘˜μ§Έ μ€„μ—λŠ” κ°€μž₯ λΉ λ₯Έ μ‹œκ°„μœΌλ‘œ μˆ˜λΉˆμ΄κ°€ 동생을 μ°ΎλŠ” λ°©λ²•μ˜ 수λ₯Ό 좜λ ₯ν•œλ‹€.

 

μ •λ‹΅

import sys
input = sys.stdin.readline

N, K = map(int, input().split())

if K == N:      # λ‘˜μ΄ 같은 μœ„μΉ˜μ— μžˆμ„ λ•Œ
    print(0)
    print(1)
elif K < N :    # 동생이 뒀에 μžˆμ„ λ•Œ
    print(N-K)
    print(1)

else:
    visited = [0 for _ in range(100001)]
    queue = [N]
    time = 0

    while queue:
        time += 1
        next_queue = []
        for n in queue:
            if (n >= 0 and n <= 100000) and (visited[n] == 0 or visited[n] == time):
                next_queue.extend([n*2, n-1, n+1])
                visited[n] = time

        if next_queue.count(K) > 0:
            print(time) 
            print(next_queue.count(K))
            break
        
        queue = next_queue

  • visited : visited에 κ°€λŠ₯ν•œ μœ„μΉ˜μ˜ λͺ¨λ“  숫자λ₯Ό 0으둜 μ…‹νŒ…ν•œλ‹€.
  • queue : queueμ—λŠ” 같은 λ ˆλ²¨μ— μžˆλŠ” μˆ«μžλ“€μ΄ λ“€μ–΄κ°ˆ μ˜ˆμ •μ΄κ³  레벨이 λ°”λ€” λ•Œλ§ˆλ‹€ queue의 값도 바뀐닀.
  • time : bfs 기반이기 λ•Œλ¬Έμ— time은 μ‹œκ°„ 즉, λ ˆλ²¨μ„ μ˜λ―Έν•œλ‹€.
  • next_queue : next_queueλŠ” λ‹€μŒ 레벨의 μˆ«μžλ“€μ΄ μ €μž₯λ˜μ–΄ μžˆλ‹€κ°€ ν˜„μž¬ 레벨의 μˆ«μžλ“€μ„ λ‹€ νƒμƒ‰ν•œ 후에 queue에 μ €μž₯λœλ‹€.

queue에 μžˆλŠ” λͺ¨λ“  숫자λ₯Ό ν•˜λ‚˜μ”© λŒλ©΄μ„œ

μœ„μΉ˜μ˜ λ²”μœ„ μ•ˆμ— ν•΄λ‹Ήν•˜λ©΄μ„œ, ν•œλ²ˆλ„ λ°©λ¬Έν•œ 적이 μ—†κ±°λ‚˜ ν˜„μž¬ λ ˆλ²¨μ—μ„œ λ°©λ¬Έν–ˆλ‹€λ©΄

next_queue에 ν˜„μž¬ μœ„μΉ˜μ—μ„œ 갈 수 μžˆλŠ” μœ„μΉ˜μ˜ μˆ«μžλ“€μ„ μΆ”κ°€ν•˜κ³ 

ν˜„μž¬ λ ˆλ²¨μ—μ„œ λ°©λ¬Έν–ˆμŒμ„ ν‘œμ‹œν•˜κΈ° μœ„ν•΄ visited[n]에 ν˜„μž¬ 레벨 time을 μ €μž₯ν•œλ‹€.

 

queueλ₯Ό λ‹€ 돈 ν›„ next_queue에 λ‚΄κ°€ κ°€μ•Όν•  Kκ°€ 1개 이상 μžˆλ‹€λ©΄

timeκ³Ό next_queue에 μžˆλŠ” K의 개수λ₯Ό 좜λ ₯ν•˜κ³  λ©ˆμΆ˜λ‹€.

728x90

BELATED ARTICLES

more