Python 2차원 배열의 최대값, 최소값 찾기
Programming

Python 2차원 배열의 최대값, 최소값 찾기

일시불

(update: 2022-04-22) HM Kim 님 덕분에 잘못된 정보를 찾았습니다. 감사합니다.

처음 드는 생각

가끔 알고리즘 문제풀이를 하다보면 어떤 iterable의 최대값 또는 최소값을 찾아야 하는 경우가 발생한다. 이럴 경우 maxmin 함수를 사용하면 최대값 혹은 최소값을 찾을 수 있다.

그런데 만일 2차원 리스트 전체 범위에서 최대, 최소값을 찾아야 하는 경우에는 조금 다른 방법을 사용해야 한다. 기존 방법대로 2차원 배열에 max, min을 사용하면 다음과 같은 결과가 나타난다.

nums = [[1, 2, 3], [1, 4, 5], [4, 5, 6], [0, 1, 2], [0, 1, 1]]

print(min(nums))

결과가 다음과 같다.

[0, 1, 1]

파이썬의 경우는 리스트 조작이 간단하다보니 2차원 배열에도 바로 max, min을 사용 가능할 거라고 생각이 들었는데, 리스트의 원소(원소 역시 리스트)중에서 첫 번째 원소의 값이 가장 작은 원소가 나와버린다.

아래에 소개할 내용이 생각나지 않는 경우에는 for문을 사용해 각 리스트를 돌면서 원소를 새로 선언하는 1차원 리스트에 추가한 다음, 1차원 리스트에서 최대 혹은 최소를 구해도 되지만 시간도 낭비되고 메모리도 낭비되니 별로 추천하지 않는다.

크기 1의 추가 메모리만 사용하는 방법

vertices = [
    [1, 7, 12],
    [4, 7, 13],
    [1, 5, 17],
    [3, 5, 20],
    [2, 4, 24],
    [1, 4, 28],
    [3, 6, 37],
    [5, 6, 45],
    [2, 5, 62],
    [1, 2, 67],
    [5, 7, 73],
]

min_value = float('inf')
for vertice in vertices:
    min_value = min(min(vertice), min_value)

print(min_value)

최소값을 저장할 변수 하나만 추가로 선언한 다음, 최소값을 갱신하면서 최소값을 구할 수 있다.

map함수를 이용하자

이럴 경우에는 map함수를 사용하면 바로 2차원 배열 전체 범위에서 답을 구할 수 있다. map은 여러모로 쓰임새가 다양하니 꼭 공부해 두는게 좋다.

최대값 찾기

vertices = [
    [1, 7, 12],
    [4, 7, 13],
    [1, 5, 17],
    [3, 5, 20],
    [2, 4, 24],
    [1, 4, 28],
    [3, 6, 37],
    [5, 6, 45],
    [2, 5, 62],
    [1, 2, 67],
    [5, 7, 73],
]

min_value = max(map(max, vertices))

print(min_value)

결과

73

최소값 찾기

vertices = [
    [1, 7, 12],
    [4, 7, 13],
    [1, 5, 17],
    [3, 5, 20],
    [2, 4, 24],
    [1, 4, 28],
    [3, 6, 37],
    [5, 6, 45],
    [2, 5, 62],
    [1, 2, 67],
    [5, 7, 73],
]

min_value = min(map(min, vertices))

print(min_value)

결과

1