Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 리스트에서 두 번째로 큰 숫자 찾기 – 3가지 방법 완벽 정리

이 글에서는 리스트에 담긴 숫자 중 두 번째로 큰 값(두 번째 최댓값)을 찾는 다양한 파이썬 풀이 방법을 알아보겠습니다.

문제 정의 — 주어진 리스트에서 두 번째로 큰 숫자를 찾아 출력해야 합니다.

예를 들어 [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))로 해결하므로 성능 면에서 가장 효율적입니다.

상황에 맞는 방법을 선택하여 사용하시기 바랍니다. 추가 질문이 있다면 언제든지 문의해 주세요!