Published on

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

Authors
  • avatar
    Name
    Indo Yoon
    Twitter
Table of Contents

처음 드는 생각

가끔 알고리즘 문제풀이를 하다보면 어떤 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