Python/Algorithm

숫자 배열에서 두 번째로 큰 값 찾기

noodle-dev 2020. 3. 10. 23:47

1. 중복 포함/제거, sorting 활용

배열을 내림차순 정렬하고, 두 번째 값을 출력한다.

arr = [10,30,30,20]
sorted(arr, reverse=True)[1]
#30

만약 중복을 허용하지 않고 두 번째 큰 값을 출력하고 싶으면 set 함수를 이용한다.

arr = [10,30,30,20]
uniq = set(arr)
sorted(uniq, reverse=True)[1]
#20

set() 을 통해 정렬 전에 고유한 값만 남기는 작업을 추가하면 된다.

 

2. 중복 제거, for문

최대값과 두 번째 큰 값을 추적하는 변수를 두고, 배열의 각 값을 순회하며 두 변수를 갱신한다.

first는 가장 큰 값, second는 두 번째로 큰 값이 들어갈 변수다.

def findsecond(arr):
    second = first = -float('inf') 

    for n in arr:
        if n > first:
            second = first
            first = n
        elif second < n < first:
            second = n
    return second

findsecond([30,30,10])
#10

최대값과 두 번째 큰 값을 추적할 변수 first, second 변수를 음의 무한으로 초기화한다.

반복문은 각 case에 대하여 다음과 같이 작동한다.

  1. 현재 최대값(first)보다 클 경우:
    • firstsecond 모두 갱신한다. 먼저 두 번째 값을 이전 최대값으로 재설정하고, 최대값에 n을 둔다.
  2. second보다 크고 first보다 작은 경우:
    • second만 갱신한다.
  3. 그 외:
    • 무시한다.

 

3. 확장 - K번째 큰 값

다음글 참조