1이 될 때까지

Polla·2023년 1월 6일
post-thumbnail

" 이것이 코딩테스트다 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)
이렇게 해주면, 굳이 일일히 빼지 않아도 뺀 값이 바로 들어가서 효율적이고,
         시간이 단축되는 코드가 되었다.
         짧으면 좋은 것이 코드라고 생각했는데, 반성을 하게 되었다. 
         
         
         좋은 코드를 짜자!👊👊👊
     
profile
트러블 슈팅 Blog => https://polla.palms.blog/home

0개의 댓글