문제
어떠한 수 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)'Python > 코딩테스트' 카테고리의 다른 글
| [이코테 4-3] 왕실의 나이트 (0) | 2024.06.30 |
|---|---|
| [이코테 4-1] 상하좌우 (내가 못 푼 문제)★ (0) | 2024.06.30 |
| [이코테 3-3] 숫자 카드 게임 (0) | 2024.06.29 |
| [이코테 3-2] 큰 수의 법칙 (0) | 2024.06.29 |
| [프로그래머스 / 파이썬] LV2. 기능개발(스택/ 큐) (0) | 2024.06.28 |