컴퓨터공학 💻 도서관📚

그리디 유형 문제 . 2 본문

✅🌲강의 복습 노트/이코테2021 알고리즘 훈련

그리디 유형 문제 . 2

들판속초록풀 2024. 4. 7. 20:11

문제 : 1이 될 때까지

어떤 수 N이 1이 될 때까지 다음 두 과정 하나를 반복적으로 수행하려고 한다.

단, 두 번째 연산은 N이 K로 나누어 떨어질 때만 선택할 수 있다.

1. N에서 1을 뺀다.

2. N을 K로 나눈다.

 

즉, 다시 말해 K로 나누어 떨어지는 수가 될때까지 1씩 빼는 거다.

 

N과 K가 주어질 때 N이 1이 될 때까지 1,2번 과정을 수행해야 하는 최소 횟수를 구하는 프로그램을 작성하시오.

 


문제 해결 아이디어

  • 주어진 N에 대하여 최대한 많이 나누기를 수행하면 최적의 해를 보장한다.
  • K가 2 이상이기만 하면, K로 나누는 것이 1을 빼는 것보다 항상 빠르게 N을 줄일 수 있다.

n, k = map(int, input().split())   # N, K를 공백을 기준으로 구분하여 입력 받기

result = 0

while True:
    target = (n // k) * k      # "테크닉" : n과 가장 가까운 K의 배수 찾는 스킬
    result += (n - target)     # 1을 빼는 횟수를 계산해서 result에 대입
    n = target
    
    if n < k:                # n이 나누는 수인 k보다 작으면 반복문 탈출
    	break
       
    result += 1
    n //= k
    
result += (n - 1)        # 마지막으로 남은 수를(k보다 작은 n)  1이 될때까지 뺀 횟수
print(result)

 

 

[ 문제 : target = (n // k) * k  이 코드의 의미를 설명하시오 ]

 

 

참고 : https://www.youtube.com/watch?v=2zjoKjt97vQ&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=3

'✅🌲강의 복습 노트 > 이코테2021 알고리즘 훈련' 카테고리의 다른 글

구현 유형 문제 . 2  (0) 2024.10.20
구현 유형 설명 . 1  (0) 2024.10.19
그리디 유형 문제 . 4  (0) 2024.10.19
그리디 유형 문제 . 3  (0) 2024.10.18
그리디 알고리즘 . 1  (0) 2024.04.03
Comments