관리 메뉴

TEAM EDA

[엘리스] 두 번째 최대값 본문

EDA Study/알고리즘

[엘리스] 두 번째 최대값

김현우 2020. 3. 28. 13:18

두 번째 최대값

n x n의 행렬이 주어질 때, 1) 모든 원소의 합, 2) 원소의 최댓값, 3) 원소의 두 번째 최댓값을 구하는 getMax2(n, myMatrix)을 작성하세요. 여기서 두 번째 최댓값은, 최댓값보다 작은 숫자를 의미합니다.

[입력값]

  • 〔1〕 n
  • 〔2~〕 n x n 행렬의 원소
    모든 원소는 양수라고 가정합니다.

[결과값] 〔1〕 (a, b, c)

  • a: 모든 원소의 합
  • b: 원소의 최댓값
  • c: 원소의 두 번째 최댓값
    두 번째 최댓값은 항상 존재한다고 가정합니다.

[입력 예시 1]

3
1 2 3
2 3 4
4 4 2

[출력 예시 1]

(25, 4, 3)

[입력 예시 2]

5
7 2 3 4 5
2 3 4 1 2
2 3 2 5 2
3 3 4 2 1
3 5 2 1 1

[출력 예시 2]

(72, 7, 5)

풀이

  • 2중 리스트를 단일 리스트로 변경하여 sum(), max() 함수 적용
  • 2중 리스트를 단일 리스트로 변경하는 방법
    • itertools의 chain method 사용
      • list(chain(*myMatrix))
      • list(chain.from_iterable(myMatrix))
    • reduce 사용 방법
      • list(reduce(lambda x, y: x+y, myMatrix))
    • list comprehension 이용
      • [element for myArray in myMatrix for element in myArray]
from itertools import chain

def getMax2(n, myMatrix):
    '''
    크기 n x n 의 행렬 myMatrix내의 원소의 합, 최댓값, 두 번째 최댓값을 반환하는 함수.

    만약 myMatrix = [[1, 2, 3], [2, 3, 4], [3, 3, 4]]라면 (25, 4, 3) 을 반환한다.
    '''
    A = sorted(list(chain.from_iterable(myMatrix)))
    mySum = sum(A)
    myMax = max(A)
    myMax2 = list(set(A))[-2]

    return (mySum, myMax, myMax2)

def main():
    '''
    이 부분은 수정하지 마세요.
    '''

    n = int(input())
    myMatrix = []

    for i in range(n):
        myMatrix.append([int(v) for v in input().split()])

    print(getMax2(n, myMatrix))

if __name__ == "__main__":
    main()

모범 답안

def getMax2(n, myMatrix):
    '''
    크기 n x n 의 행렬 myMatrix내의 원소의 합, 최댓값, 두 번째 최댓값을 반환하는 함수.

    만약 myMatrix = [[1, 2, 3], [2, 3, 4], [3, 3, 4]]라면 (25, 4, 3) 을 반환한다.
    '''

    mySum = 0
    myMax = 0
    myMax2 = 0

    for matrix in myMatrix :
        for num in matrix :
            mySum += num
            if myMax2 < num :
                if myMax < num :
                    myMax2,myMax = myMax,num
                elif myMax > num :
                    myMax2 = num

    return (mySum, myMax, myMax2)

def main():
    '''
    이 부분은 수정하지 마세요.
    '''

    n = int(input())
    myMatrix = []

    for i in range(n):
        myMatrix.append([int(v) for v in input().split()])

    print(getMax2(n, myMatrix))

if __name__ == "__main__":
    main()

 

출처 : 엘리스 아카데미, https://academy.elice.io/learn