λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/μ΄μ½”ν…Œ

[이것이 취업을 μœ„ν•œ μ½”λ”©ν…ŒμŠ€νŠΈλ‹€] 그리디 μ•Œκ³ λ¦¬μ¦˜ - 1이 될 λ•ŒκΉŒμ§€

 

 

문제

 

μ–΄λ– ν•œ 수 N이 1이 될 λ•Œ κΉŒμ§€ λ‹€μŒμ˜ 두 κ³Όμ • 쀑 ν•˜λ‚˜λ₯Ό 반볡적으둜 선택해 μˆ˜ν–‰ν•˜λ € 함

단, λ‘λ²ˆμ§Έ 연산은 N이 K둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§ˆ λ•Œλ§Œ 선택할 수 있음

  1. Nμ—μ„œ 1을 λΊ€λ‹€.
  2. N을 K둜 λ‚˜λˆˆλ‹€.

N이 1이 될 λ•Œ κΉŒμ§€ 1번 ν˜Ήμ€ 2번의 과정을 μˆ˜ν–‰ν•΄μ•Όν•˜λŠ” μ΅œμ†Œ 횟수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±

 

 

λ‚˜μ˜ μ½”λ“œ

# μ •μˆ˜ nκ³Ό kλ₯Ό μž…λ ₯λ°›λŠ”λ‹€.
n = int(input()) 
k = int(input()) 
count = 0

# n이 1보닀 클 λ•ŒκΉŒμ§€ μ•„λž˜ 쑰건문을 λ°˜λ³΅ν•œλ‹€.
while n > 1:
    # n이 ν™€μˆ˜μ΄λ©΄ λ‚˜λˆŒ 수 μ—†μœΌλ‹ˆ 1을 λΊ€λ‹€.
    if n % k != 0:
      n -= 1
      count += 1

    # n이 짝수이면 kλ₯Ό λ‚˜λˆˆλ‹€. 
    else: 
        n /= k
        count += 1

print(count)

# μ •λ‹Ήμ„± 뢄석: 아무리 큰 μˆ˜κ°€ μž…λ ₯λ˜μ–΄λ„ 1을 계속 λΉΌμ„œ 1을 λ§Œλ“œλŠ” 것보닀 λ‚˜λˆ„κΈ°λ₯Ό μ΄μš©ν•΄μ„œ 1을 λ§Œλ“œλŠ” 것이 λΉ λ₯΄κΈ°μ— μœ„ μ•Œκ³ λ¦¬μ¦˜μ€ μ •λ‹Ήν•˜λ‹€.

 

ν•΄μ„€ μ½”λ“œ

# N, K곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ μž…λ ₯ λ°›κΈ°
n, k = map(int, input().split())

result = 0

while True:
    # N이 K둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” μˆ˜κ°€ 될 λ•ŒκΉŒμ§€λ§Œ 1μ”© λΉΌκΈ°
    target = (n // k) * k
    result += (n - target)
    n = target
    # N이 K보닀 μž‘μ„ λ•Œ (더 이상 λ‚˜λˆŒ 수 없을 λ•Œ) 반볡문 νƒˆμΆœ
    if n < k:
        break
    # K둜 λ‚˜λˆ„κΈ°
    result += 1
    n //= k

# λ§ˆμ§€λ§‰μœΌλ‘œ 남은 μˆ˜μ— λŒ€ν•˜μ—¬ 1μ”© λΉΌκΈ°
result += (n - 1)
print(result)