입력조건
첫째 줄에 N(2 <= N <= 100,000)과 K(2 <= K <= 100,000)가 공백으로 구분되며 각각 자연수로 주어진다. 이때 입력으로 주어지는 N은 항상 K보다 크거나 같다.
출력조건
첫째 줄에 N이 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 횟수의 최솟값을 출력한다.
n , k = map(int, input().split())
sum = 0
while n >= k :
while n % k != 0:
n -= 1
sum += 1
n //= k
sum += 1
while n > 1:
n -= 1
sum += 1
print(sum)
(2) 다음 방법은 N이 범위가 100억 이상의 큰 수가 되었을 때를 가정해서 빨리 푸는 방법을 나타낸다. 위 유형은 N이 K의 배수가 되어 나누는 연산을 한번에 하도록 한다. 즉, 1을 빼는 계산을 앞에서 다 수행하면서 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 //= k
result += (n -1)
print(result)
예전에 풀면서 재미있다고 생각했던
백준 다이나믹 프로그래밍 문제 1로 만들기랑 비슷한 것 같네요 :)
https://www.acmicpc.net/problem/1463