🧩 Problem Solving/[λ°±μ€€]

[λ°±μ€€] 1697 μˆ¨λ°”κΌ­μ§ˆ (python 파이썬)

μ œλ΄‰μ•„ 2024. 3. 22. 20:00
 

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

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

www.acmicpc.net


BFSλ₯Ό ν™œμš©ν•œ μ΅œμ†Œ μ‹œκ°„μ„ κ΅¬ν•˜λŠ” 문제.


아이디어

ν˜„μž¬ μœ„μΉ˜(x)μ—μ„œ 갈 수 μžˆλŠ” κ±°λ¦¬λŠ” x - 1, x + 1, x * 2이닀.

각 κ²½μš°λ§ˆλ‹€ if문을 톡해 쑰건을 확인해쀀닀.

 

이전에 λ°©λ¬Έν•˜μ§€ μ•Šμ€ μœ„μΉ˜λΌλ©΄ κ·Έ μœ„μΉ˜κΉŒμ§€ κ±Έλ¦¬λŠ” μ‹œκ°„λ“€μ„ BFSλ°©μ‹μœΌλ‘œ μˆœνšŒν•˜λ©° μ‹œκ°„μ„ μ €μž₯ν•΄μ€€λ‹€.


전체 μ½”λ“œ

from collections import deque

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

deq = deque()

deq.append(N)
visited = [-1] * 100001
visited[N] = 0

while deq:

    x = deq.popleft()

    if x == K:
        print(visited[x])
        break

    for i in [x - 1, x + 1, x * 2]:
        if 0 <= i <= 100000 and visited[i] == -1:
            visited[i] = visited[x] + 1
            deq.append(i)

μ½”λ“œ μ„€λͺ…

while deq:

    x = deq.popleft()

    if x == K:
        print(visited[x])
        break

    for i in [x - 1, x + 1, x * 2]:
        if 0 <= i <= 100000 and visited[i] == -1:
            visited[i] = visited[x] + 1
            deq.append(i)

 

주어진 λ²”μœ„(0 ~ 100000)에 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  λ°©λ¬Έ 유무λ₯Ό 따진닀.

λ°©λ¬Έ κ°€λŠ₯ν•˜λ©΄ μ΄μ „κΉŒμ§€ μ†Œμš”λœ μ‹œκ°„μ—μ„œ + 1 ν•΄μ€€λ‹€.

 

λͺ©ν‘œ μœ„μΉ˜μ— λ„μ°©ν•˜λ©΄ μ΅œμ†Œμ‹œκ°„μ„ 좜λ ₯ν•΄μ€€λ‹€.

 

BFSμ΄λ―€λ‘œ 각 μœ„μΉ˜λ§ˆλ‹€ μžλ™μ μœΌλ‘œ μ΅œμ†Œμ‹œκ°„μ΄ μ €μž₯λœλ‹€.