💡 파이썬에서 두 수 곱의 최댓값 구하기: 정렬 vs 루프 vs remove 방식 비교
문제 소개 🚀
리스트에 있는 숫자들 중, 두 수를 곱했을 때 가장 큰 값을 찾아야 한다면 어떤 방법이 가장 좋을까요? 저는 다음과 같은 세 가지 방법을 고민해봤습니다:
1. 정렬을 이용한 방법 📊
def highest_product(numbers):
s_numbers= sorted(numbers)
a = s_numbers[0] * s_numbers[1]
b = s_numbers[-2] * s_numbers[-1]
return max(a, b)
Time Complexity: sorted()
는 평균적으로 O(n log n)
입니다. 리스트 크기가 커질수록 느려지겠죠.
2. 루프를 이용한 최적화 방법 🏎️
def highest_product(numbers):
min1 = min2 = float('inf')
max1 = max2 = float('-inf')
for num in numbers:
if num <= min1:
min2 = min1
min1 = num
elif num <= min2:
min2 = num
if num >= max1:
max2 = max1
max1 = num
elif num >= max2:
max2 = num
return max(min1 * min2, max1 * max2)
한 번의 루프로 끝나는 O(n)
알고리즘입니다. 성능 면에서는 최고죠.
3. remove()를 이용한 방식 🤔
def highest_product(numbers):
a = min(numbers)
numbers.remove(a)
b = min(numbers)
numbers.append(a)
c = max(numbers)
numbers.remove(c)
d = max(numbers)
numbers.append(c)
return max(a * b, c * d)
이 방법은 min()
과 remove()
가 반복되며 리스트를 계속 수정하므로, 시간복잡도는 여전히 O(n)이지만 느릴 수 있습니다. remove()
는 내부에서 요소를 하나하나 찾아 제거하고, 이후 요소를 앞으로 당기기 때문입니다.
🔍 코드 비교와 평가
파이썬 철학 "Simple is better than complex."
에 충실한 방법은 바로 2번 루프 방식입니다. 이유는 다음과 같습니다:
- 정렬 방법은 간단하지만 느립니다.
O(n log n)
- remove()는 리스트 변형 위험과 복구 작업이 필요합니다.
- 루프 방식은 빠르고 안전하며, 원본 리스트도 건드리지 않아요.
한 줄 정리 🧾: 루프 방식이 가장 빠르고, 가장 깔끔하며, 가장 파이썬스럽다고 GPT가 알려주네요.
float('inf')와 float('-inf')란? ♾️
float('inf')
는 파이썬에서 양의 무한대를 의미하는 실수형 상수입니다. 마찬가지로 float('-inf')
는 음의 무한대죠.
이 값들은 비교 연산에 아주 유용합니다:
any_number < float('inf')
→ 항상True
any_number > float('-inf')
→ 항상True
그래서 최소값/최대값을 갱신할 때 기준값으로 사용하기 딱 좋습니다.
✅ 한 줄 요약 & 결론
핵심 요약 ✨: "정렬보다 루프가, remove보다 안전한 방식이 더 Pythonic하다."
문제 해결은 단순할수록 좋습니다. Simple is better than complex.
라는 파이썬 철학이 잘 반영된 예제였죠. 앞으로도 복잡한 정렬보다, 명확하고 빠른 루프를 먼저 떠올려 보세요!
'Python > Python 문제 풀이' 카테고리의 다른 글
⚡Pythonic하게 //, %, divmod() 처리하기: Simple is better than complex! (0) | 2025.04.30 |
---|---|
비트 토글 문제 해결기 - module 없이 얼마나 Pythonic하게 풀 수 있을까? (0) | 2025.04.24 |
📌 'return result if result else None'을 몰랐던 나에게 바칩니다 (0) | 2025.04.22 |