이 글에서는 파이썬을 사용해 딕셔너리에서 두 번째로 큰 값을 찾는 다양한 방법을 알아보겠습니다.
문제 정의
주어진 딕셔너리(또는 리스트)에서 두 번째로 큰 값(second maximum)을 찾아 출력하는 것이 목표입니다. 예를 들어 값이 {3, 15, 9, 19}인 딕셔너리가 있다면, 가장 큰 값은 19이고 두 번째로 큰 값은 15입니다.
방법 1 — sorted() 함수와 음수 인덱스 활용
가장 간단한 방법은 sorted() 함수로 딕셔너리의 모든 값을 오름차순으로 정렬한 뒤, 음수 인덱스 [-2]를 사용해 뒤에서 두 번째 요소에 접근하는 것입니다.
예제
# 입력
example_dict = {"tutor": 3, "tutorials": 15,
"point": 9, "tutorialspoint": 19}
# 딕셔너리의 값들을 정렬한 뒤 뒤에서 두 번째 요소 출력
print(list(sorted(example_dict.values()))[-2])출력
15
방법 2 — sort() 메서드로 정렬 후 접근
리스트의 내장 sort() 메서드를 사용해 리스트 자체를 정렬한 다음, 마찬가지로 음수 인덱스를 이용해 두 번째로 큰 요소를 가져올 수 있습니다.
예제
list1 = [11, 22, 1, 2, 5, 67, 21, 32]
# 내장 sort 메서드 사용
list1.sort()
# 뒤에서 두 번째 요소 출력
print("리스트에서 두 번째로 큰 요소:", list1[-2])출력
리스트에서 두 번째로 큰 요소: 32
방법 3 — 내장 함수 없이 구현하는 브루트 포스 방식
내장 함수를 거의 사용하지 않고 반복문만으로 직접 구현할 수도 있습니다. 먼저 앞의 두 요소 중 큰 값을 max_, 작은 값을 secondmax로 초기화한 뒤, 나머지 요소를 하나씩 비교하며 두 변수를 갱신해 나갑니다.
예제
list1 = [11, 22, 1, 2, 5, 67, 21, 32]
# max_는 0번과 1번 인덱스 요소 중 최댓값,
# 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보다 크면 secondmax만 갱신
else:
if list1[i] > secondmax:
secondmax = list1[i]
print("리스트에서 두 번째로 큰 숫자:", str(secondmax))출력
리스트에서 두 번째로 큰 숫자: 32
마무리
이 글에서는 sorted() 함수, sort() 메서드, 그리고 반복문 기반의 브루트 포스 방식 등 세 가지 방법으로 딕셔너리와 리스트에서 두 번째로 큰 값을 찾는 방법을 살펴보았습니다. 데이터 양이 적고 코드를 간결하게 유지하고 싶다면 sorted() 방식이 편리하며, 성능이 중요하거나 내장 함수 사용이 제한된 환경이라면 반복문 방식이 유용합니다.