
책 "
이것이 코딩테스트다 with 파이썬" 연습
💡 문제
어떠한 수 N이 1이 될때까지 다음의 두 과정 중 하나를 반복적으로 선택하여 수행하려고 한다. 단, 두번째 연산은 N이 K로 나누어 질때만 선택할 수 있다. 1. N에서 1을 뺀다. 2. N을 K로 나눈다.
📌 입력 조건
- 첫째 줄에 N(2 <= N <= 100,000)과 K(2 <= K <= 100,000)가 공백으로 구분되며 각각 자연수로 주어진다. 이때 입력으로 주어지는 N은 항상 K보다 크거나 같다.
🔐 출력 조건
- 첫째 줄에 N이 1이 될때까지 1번 혹은 2번의 과정을 수행해야 하는 최소 횟수를 구하는 프로그램을 작성하시오 ex) 25 5 출력: 2
우선 내가 해결한 방식은
if문을 사용해서 나누기 가능할땐 남은 값을 return해주고,
아닌 경우 n을 1씩 빼주는 것이였다.
n, k = map(int, input().split())
ans = 0
while n != 1:
if n % k == 0:
ans += 1
n /= k
else:
n -= 1
ans += 1
print(ans)
그렇지만 이렇게 하면 큰 수가 들어올 시,
시간이 오래걸리고 효율적이지 않다는것을 배웠다.
해결하면 그만이라고 생각했으나, 반성하게 되었다.😖😖
이 코드를
n, k = map(int, input().split())
result = 0
while True :
target = (n//k) * k
result += (n - target) #나누고 남은 1을 뺄 값
n = target#빼고 남은 값
if n < k:
break
result += 1 # 나눗셈을 했을때의 횟수 셈.
n //= k
result += (n-1) # k보다 작으면 1이 될때까지 빼기
print(result)
이렇게 해주면, 굳이 일일히 빼지 않아도 뺀 값이 바로 들어가서 효율적이고,
시간이 단축되는 코드가 되었다.
짧으면 좋은 것이 코드라고 생각했는데, 반성을 하게 되었다.
좋은 코드를 짜자!👊👊👊