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

Python – 정수 리스트에서 세 번째로 큰 숫자를 찾는 방법

정수 리스트가 주어졌을 때 세 번째로 큰 숫자를 찾는 것은 코딩 테스트나 실무에서 자주 마주치는 문제입니다. 이 글에서는 리스트를 매개변수로 받는 함수를 정의하고, 음의 무한대(-inf)로 초기화된 세 개의 부동소수점 값을 활용해 상위 세 개의 큰 숫자를 추적하는 방법을 소개합니다.

핵심 아이디어

리스트를 내림차순으로 정렬한 뒤 세 번째 값을 꺼내는 간단한 방법도 있지만, 여기서는 정렬 없이 한 번의 반복만으로 답을 구하는 방식을 사용합니다. 중복된 값은 하나로 취급하며, 서로 다른 숫자가 세 개 미만이라면 가장 큰 값을 대신 출력하도록 처리했습니다.

예제

아래는 전체 구현 예시입니다.

def third_max_num(my_num):
   my_result = [float('-inf'), float('-inf'), float('-inf')]
   for num in my_num:
      if num not in my_result:
         if num > my_result[0]: my_result = [num, my_result[0], my_result[1]]
         elif num > my_result[1]: my_result = [my_result[0], num, my_result[1]]
         elif num > my_result[2]: my_result = [my_result[0], my_result[1], num]
   if float('-inf') in my_result:
      print(max(my_num))
   else:
      print(my_result[2])

my_list = [45, 31, 78, 9, 0, 54, 12, 18]
print("The list is :")
print(my_list)
print("The third maximum number is :")
third_max_num(my_list)

실행 결과

The list is :
[45, 31, 78, 9, 0, 54, 12, 18]
The third maximum number is :
45

코드 설명

  • 'third_max_num'이라는 이름의 함수를 정의하고, 리스트를 매개변수로 받습니다.

  • 음의 무한대(float('-inf')) 값 세 개로 이루어진 리스트를 생성합니다. 이 리스트는 지금까지 발견된 상위 세 개의 큰 숫자를 저장하는 역할을 합니다.

  • 입력 리스트의 값을 하나씩 순회하면서, 해당 숫자가 이미 상위 세 개 리스트에 있는지 확인해 중복을 걸러냅니다.

  • 숫자가 첫 번째(가장 큰) 요소보다 크다면, 새 숫자를 맨 앞에 두고 기존 값들을 한 칸씩 뒤로 밀어냅니다.

  • 같은 방식으로 두 번째, 세 번째 위치도 비교하여 숫자를 적절한 자리에 삽입합니다.

  • 모든 순회가 끝난 후에도 음의 무한대 값이 남아 있다면, 서로 다른 숫자가 세 개 미만이라는 의미이므로 리스트의 최댓값을 출력합니다.

  • 함수 외부에서 예제용 리스트를 정의하고 콘솔에 출력합니다.

  • 정의한 함수를 호출하면서 이 리스트를 매개변수로 전달합니다.

  • 결과가 콘솔에 표시됩니다. 위 예제에서 세 번째로 큰 숫자는 45입니다.

마무리 및 개선 팁

이 방식은 정렬(O(n log n)) 대신 단일 순회(O(n))로 해결할 수 있어 효율적입니다. 다만 num not in my_result 검사가 리스트 길이에 비례해 시간이 걸릴 수 있으므로, 집합(set)으로 중복을 먼저 제거하거나 표준 라이브러리의 heapq.nlargest(3, set(my_num))를 활용하면 코드를 더 깔끔하고 안전하게 개선할 수 있습니다.