본문 바로가기
  • Staying curious, growing through questions
Python/코딩테스트

[이코테 3-4] 1이 될 때까지

by Evergreen Mind 2024. 6. 29.

문제

 

어떠한 수 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, k = map(int, input().split())
count = 0
while True:
  if n % k == 0:
    n = n // k # 몫 구하기
    count = count + 1
  else: 
    n = n- 1
    count = count + 1
  if n ==1 :
    break

print(count)

 

내가 푼 풀이는 단순하지만 n이 100억 이상의 큰 수가 되는 경우에는 느리게 동작한다.

그런 경우에도 빠르게 동작하기 위해서 아래 풀이처럼 n이 k의 배수가 되도록 효율적으로 한번에 빼는 방식을 사용하는 것이 좋다.

 

 

책의 풀이

n, k = map(int,input().split())
 
count = 0
while True:
  target = (n//k)*k # n이 k로 나누어 떨어질 수 있는 target 찾기
  count += (n - target) # n에서 target 까지 되도록 -1 해야하는 횟수 더함
  n = target # 한번에 빼주기
 
  if n < k: # n이 더이상 k로 나눠질 수 없다면 빠져나감
    break
    
  count += 1 # n을 k로 나누기
  n //= k
  
count += (n-1) # 남은 수에서 1이 될때까지 빼는 횟수 더함
print(count)