이것이 μ½”λ”©ν…ŒμŠ€νŠΈλ‹€/그리디 μ•Œκ³ λ¦¬μ¦˜

1이 될 λ•ŒκΉŒμ§€- 이것이 μ½”λ”©ν…ŒμŠ€νŠΈλ‹€

CheonD 2020. 9. 2. 18:45

1이 λ  λ•ŒκΉŒμ§€- μ΄κ²ƒμ΄ μ½”λ”©ν…ŒμŠ€νŠΈλ‹€

 

문제 :

μ–΄λ– ν•œ 수 N이 1이 될 λ•ŒκΉŒμ§€ λ‹€μŒμ˜ 두 κ³Όμ • 쀑 ν•˜λ‚˜λ₯Ό 반볡적으둜 μ„ νƒν•˜μ—¬ μˆ˜ν–‰ν•˜λ €κ³  ν•œλ‹€. 단, 두 번째 연산은 N이 K둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§ˆ λ•Œλ§Œ 선택할 수 μžˆλ‹€.

 

    1. Nμ—μ„œ 1을 λΊ€λ‹€.

    2. N을 K둜 λ‚˜λˆˆλ‹€.

 

예λ₯Ό λ“€μ–΄ N이 17, Kκ°€ 4라고 κ°€μ •ν•˜μž. μ΄λ•Œ 1번의 과정을 ν•œ 번 μˆ˜ν–‰ν•˜λ©΄ N은 16이 λœλ‹€. 이후에 2번의 과정을 두 번 μˆ˜ν–‰ν•˜λ©΄ N은 1이 λœλ‹€. 결과적으둜 이 경우 전체 과정을 μ‹€ν–‰ν•œ νšŸμˆ˜λŠ” 3이 λœλ‹€. μ΄λŠ” N을 1둜 λ§Œλ“œλŠ” μ΅œμ†Œ νšŸμˆ˜μ΄λ‹€. 

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

 

μž…λ ₯ 쑰건:

  • 첫째 쀄에 N(2<=N<=100,000)κ³Ό K(2<=K<=100,000)κ°€ 곡백으둜 κ΅¬λΆ„λ˜λ©° 각각 μžμ—°μˆ˜λ‘œ 주어진닀. μ΄λ•Œ μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” N은 항상 K보닀 ν¬κ±°λ‚˜ κ°™λ‹€.

좜λ ₯ 쑰건:

  • 첫째 쀄에 N이 1될 λ•ŒκΉŒμ§€ 1번 ν˜Ήμ€ 2번의 과정을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” 횟수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

문제 ν•΄μ„€:

1. N이 K둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§ˆ λ–„ or N이 K둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€μ§€ μ•Šμ„ λ•Œλ‘œ λ‚˜λˆˆλ‹€.

2. λ°˜λ³΅ν•œλ‹€.

 

n,k = map(int,input().split())

count =0
while n!=1:
  if n%k==0:
    n = n//k
    count+=1
  else :
    n = n-1
    count+=1


print(count)

 

λ‹€μŒμ€ N이 K의 λ°°μˆ˜κ°€ λ˜λ„λ‘ 효율적으둜 ν•œ λ²ˆμ— λΉΌλŠ” 방식이닀.

이λ₯Ό μ΅ν˜€λ‘λ©΄ μ’‹λ‹€.

 

n,k= map(int,input().split())
result =0

while True:
  target = (n//k)*k
  result += n-target
  n = target
  if n<k:
    break
  result+=1
  n = n//k
  
result += (n-1)
print(result)