본문 바로가기

Algorithm/Greedy

1이 될 때까지

 

문제

N이 1이될 때까지 1을빼거나 K로 나눈다. 이 때, 최소한의 연산으로 1을 만들어라.

 

유형파악

다른 알고리즘 연결이 안된다.

그리디 알고리즘이다.

 

아이디어

직관적으로 최대한 K로 나누는게 숫자 1을 만드는데 더 빨리 가까워진다.

나누어 떨어지면 K로 나누고 아니면 1을 뺸다.

 

정당성

직관적으로 나누는게 항상 1을 빼는거 보단 숫자가 더 빨리 작아지므로 정당하다고 볼 수 있다.

 

구현

- K로 나눠지는지 확인

- 나눠지면 K로 나눈다. 아니면 1을 뺀다

- 1이 될때까지 반복한다.

 

코드

n = int(input("입력 : "))
k = int(input("입력 : "))

count = 0
while n != 1:
    if n % k == 0:
        n /= k
        count += 1
    else:
        n -= 1
        count += 1
    print(n)
print(n)
print(count)

 

 

공간 체크

- 저장하는 것이 n, k, count 정도 인데, 12바이트이므로 딱히 고려할 필요는 없다/

 

 

시간 체크

- 이 문제의 시간 제한은 1초이다. 파이썬은 평균적으로 1초에 5000만번정도의 연산이 가능하다.

최악의 경우 N=100000, K=2인데 21번의 연산으로 1을 만들 수 있다.

따라서, 충분하다

 

 

 

 

 

 

 

'Algorithm > Greedy' 카테고리의 다른 글

곱하기 혹은 더하기  (0) 2023.04.04
모험가 길드  (0) 2023.04.04
숫자 카드 게임  (0) 2023.04.03
큰 수의 법칙  (0) 2023.04.03
Greedy - Concept  (0) 2023.04.03