이 글에서는 리스트에 담긴 숫자 중 두 번째로 큰 값(두 번째 최댓값)을 찾는 다양한 파이썬 풀이 방법을 알아보겠습니다.
문제 정의 — 주어진 리스트에서 두 번째로 큰 숫자를 찾아 출력해야 합니다.
예를 들어 [11, 22, 1, 2, 5, 67, 21, 32]라는 리스트가 있다면, 가장 큰 값은 67이고 두 번째로 큰 값은 32입니다.
이 문제는 크게 세 가지 접근 방식으로 해결할 수 있습니다. 각 방법의 장단점과 함께 살펴보겠습니다.
방법 1 — set()과 remove() 함수 활용하기
리스트를 set()으로 변환하면 중복된 요소가 자동으로 제거됩니다. 이후 가장 큰 값을 제거하면 남은 집합의 최댓값이 곧 두 번째로 큰 값이 됩니다.
예제 코드
list1 = [11, 22, 1, 2, 5, 67, 21, 32] # 고유한 요소만 남기기 위해 set으로 변환 new_list = set(list1) # 가장 큰 요소 제거 new_list.remove(max(new_list)) # 남은 요소 중 최댓값 = 두 번째로 큰 값 print(max(new_list))
실행 결과
32
방법 2 — sort() 메서드와 음수 인덱스 활용하기
리스트를 오름차순으로 정렬한 뒤 음수 인덱스 -2를 사용하면 뒤에서 두 번째 요소, 즉 두 번째로 큰 값을 바로 얻을 수 있습니다. 코드가 매우 간결하다는 것이 장점입니다.
예제 코드
list1 = [11, 22, 1, 2, 5, 67, 21, 32]
# 내장 sort() 메서드로 오름차순 정렬
list1.sort()
# 뒤에서 두 번째 요소 출력
print("리스트에서 두 번째로 큰 요소:", list1[-2])실행 결과
리스트에서 두 번째로 큰 요소: 32
참고: 만약 최댓값이 중복되어 있는 경우(예: [67, 67, 32])에는 정렬 후 중복을 제거하거나 set을 함께 사용하는 것이 안전합니다.
방법 3 — 브루트 포스(완전 탐색) 방식 활용하기
정렬이나 set 변환 없이 반복문 한 번만으로 해결하는 방법입니다. 최댓값(max_)과 두 번째 최댓값(secondmax) 변수를 유지하면서 리스트를 순회합니다. 시간 복잡도가 O(n)이므로 대용량 데이터에서도 효율적입니다.
예제 코드
list1 = [11, 22, 1, 2, 5, 67, 21, 32]
# max_는 첫 두 요소 중 큰 값, secondmax는 작은 값으로 초기화
max_ = max(list1[0], list1[1])
secondmax = min(list1[0], list1[1])
for i in range(2, len(list1)):
# 발견한 요소가 max_보다 크면 값 갱신
if list1[i] > max_:
secondmax = max_
max_ = list1[i]
# 발견한 요소가 secondmax보다 크면 갱신
elif list1[i] > secondmax:
secondmax = list1[i]
print("리스트에서 두 번째로 큰 수 : ", str(secondmax))실행 결과
리스트에서 두 번째로 큰 수 : 32
마무리
지금까지 파이썬에서 리스트의 두 번째로 큰 요소를 찾는 세 가지 방법을 살펴보았습니다.
- set() + remove() — 중복 제거가 필요할 때 유용하며 직관적입니다.
- sort() + 음수 인덱스 — 코드가 가장 짧고 간단하지만 정렬 비용(O(n log n))이 듭니다.
- 브루트 포스 순회 — 단 한 번의 순회(O(n))로 해결하므로 성능 면에서 가장 효율적입니다.
상황에 맞는 방법을 선택하여 사용하시기 바랍니다. 추가 질문이 있다면 언제든지 문의해 주세요!