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

kiteB·2022년 1월 4일
1

Python

목록 보기
4/6
post-thumbnail

⚠️

해당 글 작성 시 완벽히 이해하지 못했던 것 같아 다시 정리해보았습니다🥲
더 자세한 설명을 원하신다면 아래 사이트를 방문하는 것을 추천합니다!

👩🏻‍💻 2023.06.27 수정 버전 - https://coji.tistory.com/36


📌 hminn님의 댓글을 참고하여 내용을 수정하였습니다.

평소에 리스트에서 최솟값과 최댓값을 구해야할 때 파이썬의 내장 함수인 min(), max() 함수를 사용하였다.

오늘 알고리즘 문제를 풀던 중 2차원 리스트에서 최솟값과 최댓값을 구해야해서 별 생각없이 min(), max()을 사용했는데 내 생각과는 다른 결과가 나왔다.😭

다음과 같이 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)

의도한 결과는

min_val: 2
max_val: 9

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

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

알고보니

  • 1차원 리스트에서 min()은 가장 작은 원소, max()는 가장 큰 원소를 반환한다.
  • 2차원 리스트에서 min()은 원소 합이 가장 작은 1차원 리스트, max()는 원소 합이 가장 큰 1차원 리스트였다. (원소 합과는 상관 없습니다! 잘못된 정보 죄송합니다😭)
    2차원 리스트의 경우, 원소들을 순차적으로 비교하여 결과값(1차원 리스트)을 반환한다.

다음 코드를 살펴보자.

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

리스트 원소 합과 원소의 개수와는 상관없이 리스트의 첫 번째 원소부터 대소 비교를 하여 결과값을 낸다는 것을 확인할 수 있다.

그러면 2차원 리스트에서 최솟값 하나, 최댓값 하나를 어떻게 구해야 할까?
물론 for문을 이용하여 이용할 수도 있겠지만, map을 이용한다면 min, max를 이용해 최솟값, 최댓값 하나를 구할 수 있다!

그 방법을 알아보기 전에 min(), max(), map을 제대로 정리해보자!


[ min(), max(), map() ]

1. 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]

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]

3. map()

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

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

예제

data = [1, 2, 3, 4]

print(list(map(str, data)))	# ['1', '2', '3', '4']

int형 데이터로 이루어져 있던 datamap을 이용하여 모두 str형으로 바꿨다.


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

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을 이용하면 minmax를 이용하여 2차원 리스트의 최솟값과 최댓값을 구할 수 있다.

단계별로 한 번 살펴보자!

a = list(map(min, data))
b = list(map(max, data))
print(a)	# [2, 2, 2, 2, 2]
print(b)	# [8, 6, 7, 7, 9]

map을 이용하여

  • a에는 datamin 값을 추출하여 저장하고.
  • b에는 datamax 값을 추출하여 저장한다.

그래서 ab를 각각 출력하면

  • a는 각 줄에서의 최솟값을 추출한 리스트인 [2, 2, 2, 2, 2]가 출력되고
  • b는 각 줄에서의 최댓값을 추출한 리스트인 [8, 6, 7, 7, 9]가 출력된다.
min_val = min(a)	# min(map(min, data))와 동일하다.
max_val = max(b)	# max(map(max, data))와 동일하다.
print(min_val)
print(max_val)

다시 minmax를 이용하여 그 중에서의 min 값과, max 값을 추출하면 된다!

  • min_val[2, 2, 2, 2, 2] 중 최솟값인 2가 출력된다.
  • max_val[8, 6, 7, 7, 9] 중 최댓값인 9가 출력된다.

[ 📘 Reference ]

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

profile
🚧 https://coji.tistory.com/ 🏠

2개의 댓글

comment-user-thumbnail
2022년 4월 22일

안녕하세요!
"2차원 리스트에서 min()은 원소 합이 가장 작은 1차원 리스트, max()는 원소 합이 가장 큰 1차원 리스트였다"
라고 말씀해주신 부분에 오류가 있어 댓글 남깁니다.

2차원 배열을 대상으로 max, min 함수를 호출했을 때,
'리스트 원소 합이 가장 크거나 혹은 작은' 리스트가 반환된다고 되어있는데
실제로 돌려보면 다른 결과가 나옵니다.

제가 실험해본 결과, '리스트 원소들을 순차적으로 비교' 하여 결과 값을 반환합니다.
다음과 같은 예를 통해 검증할 수 있습니다.

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

위의 예를 통해, max, min의 결과 값은 각 리스트 원소들의 합으로 결정되는 것이 아님을 확인할 수 있고,
각 리스트의 첫번째 원소부터 순차적으로 비교하여 결과 값이 결정됨을 알 수 있습니다.

결론적으로,
2차원 배열에 대한 max, min 함수는
'각 리스트의 첫번째 원소부터 순차적으로 대소 비교를 하여 결과 값을 낸다' 가 맞는 이야기입니다.

그렇기에, 2차원 배열의 각 리스트가 비교 가능한 값들로 이루어지기만 한다면,
max, min, sort 등 대소 비교를 기반으로 결과 값을 산출하는 메서드들이 모두 동작하게 됩니다.

data = [['b', 'a'], ['b', 'c'], ['a', 'b']]
max(data) # ['b', 'c']
min(data) # ['a', 'b']

감사합니다.

1개의 답글