알쓸코지
article thumbnail

https://velog.io/@mmy789/Python-2%EC%B0%A8%EC%9B%90-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EC%9D%98-%EC%B5%9C%EC%86%9F%EA%B0%92-%EC%B5%9C%EB%8C%93%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0

 

[Python] 2차원 리스트의 최솟값, 최댓값 구하기

map과 min, max를 이용하여 2차원 리스트의 최솟값과 최댓값을 구해보자!

velog.io

⬆️ 내가 과거에 작성했던 글인데, 완벽히 이해하지 못하고 작성한 글이라서 이번에 다시 정리해보려고 한다.

 

리스트에서 최댓값, 최솟값 구하기

 

리스트의 최댓값과 최솟값을 구하는 가장 간단한 방법은 바로 max(), min()을 이용하는 방법이다.

 

알고리즘 문제를 풀 때 이 내장 함수들을 아주 유용하게 사용해 왔는데, '2차원 리스트에서 최댓값과 최솟값을 구할 때도 똑같이 동작하겠지~'라고 별생각 없이 max(), min()을 사용했다가 된통 당해버렸다🥲

 

다음과 같이 2차원 리스트가 있을 때, min_val = min(data), max_val = max(data)로 최솟값과 최댓값을 구하려고 했다.

data = [[6, 8, 2, 6, 2], 
        [3, 2, 3, 4, 6], 
        [6, 7, 3, 3, 2],
        [7, 2, 5, 3, 6], 
        [8, 9, 5, 2, 7]]

min_val = min(data)
max_val = max(data)

의도한 결과는 다음과 같이, 모든 리스트를 통틀어서 가장 큰 값인 9, 가장 작은 값인 2를 얻는 것이었다.

min_val: 2
max_val: 9

하지만 실행 결과는 다음과 같았다.

min_val: [3, 2, 3, 4, 6]
max_val: [8, 9, 5, 2, 7]

알고 보니 min()max()은 다음과 같이 동작해서 1차원 리스트일 때 적용했던 코드로는 원하는 결과를 얻어낼 수 없는 것이었다.

  • 1차원 리스트에서 min()은 가장 작은 원소, max()는 가장 큰 원소를 반환한다.
  • 2차원 리스트의 경우, 원소들을 순차적으로 비교하여 결괏값(1차원 리스트)을 반환한다.

 

다음 코드를 통해 2차원 리스트에서의 동작 원리를 더 자세히 살펴보자!

data = [[1, 2, 3], [5], [0, 1, 100]]
print(min(data))    # [0, 1, 100]
print(max(data))    # [5]

리스트의 첫 번째 원소부터 대소 비교를 하여 결괏값을 낸다는 것을 확인할 수 있다.

 

그러면 2차원 리스트에서 최솟값 하나, 최댓값 하나를 어떻게 구해야 할까?

가장 간단한 방법은 for문을 이용하여 직접 구현하는 것이다.

 

for문을 이용하는 방법

def find_min_max_2d(data):
    if not data:
        return None, None

    min_val = data[0][0]
    max_val = data[0][0]

    for row in data:
        for num in row:
            min_val = min(min_val, num)
            max_val = max(max_val, num)
    return min_val, max_val


data = [[6, 8, 2, 6, 2],
        [3, 2, 3, 4, 6],
        [6, 7, 3, 3, 2],
        [7, 2, 5, 3, 6],
        [8, 9, 5, 2, 7]]

min_val, max_val = find_min_max_2d(data)
print(min_val)    # 2
print(max_val)    # 9

위와 같이 코드를 작성하면 전체 리스트 원소 중에서 가장 작은 값가장 큰 값 하나를 얻어낼 수 있다.

하지만 매번 이렇게 for문을 이용해서 구현하는 것은 너무 번거롭다.🥲


내가 원하는 것은 1차원 리스트에서처럼 코드 한 줄로 2차원 리스트의 최댓값과 최솟값을 얻어내는 것이다.

map()min(), max()를 이용하면 최솟값과 최댓값을 아주 쉽게 구할 수 있다!

 

map() 이용하기

data = [[6, 8, 2, 6, 2],
        [3, 2, 3, 4, 6],
        [6, 7, 3, 3, 2],
        [7, 2, 5, 3, 6],
        [8, 9, 5, 2, 7]]

min_val = min(map(min, data))    # 2
max_val = max(map(max, data))    # 9

이렇게 map()을 이용하면 1차원 리스트에서 사용했던 것처럼 간편하게 구할 수 있다.

 

코드를 간단하게 설명해 보면,

  • map(min, data)data의 각 하위 리스트에 min()을 적용하여 최솟값을 반환한다.
    • map 객체 형태로 반환하는데, 리스트로 변환하여 출력해 보면 [2, 2, 2, 2, 2]이다.
  • 이 map 객체에 다시 한번 min()을 적용하여 해당 리스트의 최솟값인 2를 반환한다.

 

📌 2차원 리스트에서 최솟값, 최댓값 구하기
- 최솟값: min(map(min, 2차원리스트))
- 최댓값: max(map(max, 2차원리스트))

📢 위의 코드만 사용하면 끝인데, 만약 위의 코드가 이해되지 않는다면 해당 글을 끝까지 읽는 것을 추천드립니다!

 

min(), max(), map()

사실 위의 코드가 단번에 이해가 되지 않아 내장 함수를 자세히 정리해 보았다🥲

min()

iterable에서 가장 작은 항목이나 두 개 이상의 인자 중 가장 작은 것을 돌려준다.

예제

data = [4, 2, 9, 3]
data2 = [1, 5, 4, 2]
data3 = [9, 7, 5, 8]

print(min(data))    # 2
print(min(7, 2))    # 2
print(max(data, data2, data3])    # [1, 5, 4, 2]

 

max()

iterable에서 가장 큰 항목이나 두 개 이상의 인자 중 가장 큰 것을 돌려준다.

예제

data = [4, 2, 9, 3]
data2 = [1, 5, 4, 2]
data3 = [9, 7, 5, 8]

print(max(data))    # 9
print(max(7, 2))    # 7
print(max(data, data2, data3))    # [9, 7, 5, 8]

 

map()

iterable을 받아서, 각 요소에 함수를 적용해 주는 함수이다.

map(적용시킬함수, 적용할 요소들))
  • 출력 결과는 iterator이기 때문에 보통 list 타입으로 형 변환해서 사용한다.

예제

data = [1, 2, 3, 4]

print(list(map(str, data)))    # ['1', '2', '3', '4']
  • int형 데이터로 이루어져 있던 datamap을 이용하여 모두 str형으로 바꿨다.

 

2차원 리스트에서 최댓값, 최솟값 구하는 방법 (step by step)

이제 내장 함수도 자세히 알아봤으니, 단계별로 코드를 분석해 보자!

data = [[6, 8, 2, 6, 2],
        [3, 2, 3, 4, 6],
        [6, 7, 3, 3, 2],
        [7, 2, 5, 3, 6],
        [8, 9, 5, 2, 7]]

min_val = min(map(min, data))    # 2
max_val = max(map(max, data))    # 9

최댓값과 최솟값 중 하나만 이해하면 되므로 최솟값을 기준으로 알아보도록 하겠다.

map(min, data)

min(map(min, data))에서 map(min, data))가 어떻게 동작하는지부터 알아보자.

a = list(map(min, data))
print(a)    # [2, 2, 2, 2, 2]

map()data의 각 하위 리스트에 min()을 적용하여 최솟값을 반환한다.
즉, data[0] 부터 data[4]까지 하위 리스트의 최솟값들을 반환하는 것을 의미한다.

  요소 최솟값
data[0] [6, 8, 2, 6, 2] 2
data[1] [3, 2, 3, 4, 6] 2
data[2] [6, 7, 3, 3, 2] 2
data[3] [7, 2, 5, 3, 6] 2
data[4] [8, 9, 5, 2, 7] 2

min(map(min, data))

위에서 map()을 사용한 결과인 [2, 2, 2, 2, 2] 중 최솟값 하나를 추출하기 위해서 다시 min()을 적용하겠다는 뜻이다.

min_val = min(a)    # min(map(min, data))와 동일
print(min_val) # 2

min_val[2, 2, 2, 2, 2] 중 최솟값인 2가 된다.

 

📚 Reference

https://devbull.xyz/python-2caweon-baeyeolyi-coedaegabs-coesogabs-cajgi/
https://docs.python.org/ko/3/library/functions.html
https://wikidocs.net/22803

profile

알쓸코지

@chocoji

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!