개발/알고리즘
[LeetCode | Python] 397. Integer Replacement
Grara
2025. 5. 4. 23:01
느낀점
약간의 수학적 트릭이 있는 경우 잘 감안해서 로직을 작성해야 한다.
문제
https://leetcode.com/problems/integer-replacement/description/
주어진 양의 정수 n에 대해 다음 연산 중 하나를 적용한다.
- n이 짝수면, n을 n / 2로 바꾼다.
- n이 홀수면, n을 n + 1 또는 n - 1로 바꿉니다.
목표는 n을 1로 만드는 데 필요한 최소 연산 횟수를 반환하는 것
풀이
문제를 보면 구현하는 것은 어렵지 않은데, 홀수일 때 언제 n+1, n-1을 해야하는지 고려해야 한다. 이 부분은 n = 3일 때, 그리고 n이 4의 배수보다 하나 더 클 때, n에서 1을 빼야 하고 나머지 홀수는 그냥 하나를 추가하는 것으로 구현했다. 중요한 것은 왜 3일 때, 그리고 4의 배수보다 1이 클 때 1을 빼는가이다.
1. 3인 경우
3에서 +1을 하게 되면 4가 되고 4 -> 2 -> 1 이 되어 2 -> 1보다 한 횟수 더 많다. 따라서 3인 경우에 -1이 맞다.
2. 4의 배수 + 1인 경우
2로 나눌 때 1로 가는 최소 연산 수는 2의 배수일 때일 것이다. 따라서, n이 4의 배수에서 1 차이나는 경우 1을 빼어 4의 배수를 맞춰준다.
class Solution:
def integerReplacement(self, n: int) -> int:
cnt = 0
while n > 1:
if n % 2 == 0:
n //= 2
elif n == 3 or n % 4 == 1:
n -= 1
else:
n += 1
cnt += 1
return cnt
결과
- 공간복잡도: $$ O(1) $$
- 시간복잡도: $$ O(LogN) $$