백준 2566번을 풀면서 오랜만에 최댓값/최솟값 찾기에 대해서 복습했다.
python은 최댓값과 최솟값을 매우 쉽게 찾을 수 있는데,python에 max, min 내장 함수가 있어서 이걸 이용하면 된다.
arr = [1,2,3]
max_value = max(arr)
min_value = min(arr)
이다. 이렇게 하면 max, min 값을 바로 구할 수 있다. (물론 for문을 통해 직접 비교해서 구할 수도 있을 것이다.) 다만 2차원 리스트의 경우에는 다음과 같은 방법을 사용하면 된다.
arr=[[1,2,3],[2,3,4]]
max_value=max(map(max,arr))
min_value=min(map(min,arr))
map 함수를 사용하면 2차원 리스트에서도 쉽게 max, min 값을 구할 수 있다.
map 함수는 입력값을 받을 때 자주 사용하게 되는데, 이에 대해서 이번에 한 번 가볍게 정리해보고자 한다.
map 함수는 map(function, iterable) 형식의 함수로, 해당 함수의 반환값은 map 객체이다. 예컨대 입력을 받을때 arr = list(map(int,input().split())와 같은 방식을 사용하는 것도 반환이 map 객체이기 때문이다.
map 함수의 동작은 다음과 같다. 두 번째 인자로 들어온 iterable을 첫 번째 인자로 들어온 함수에 하나씩 집어 넣어서 함수를 수행하는 것이다. 따라서 max(map(max,arr))이면 2차원 리스트의 arr에 있는 각 리스트에 대해서 max 값을 찾게 되고, 각 행의 max 값이 모인 map 객체에서 다시 한 번 max 함수를 수행하여 전체 2차원 리스트에서의 max값을 찾게 되는 것이다.
max_values=[]
for i in range(n):
max_values.append(max(arr[i])
max_value = max(max_values)
행의 크기가 n인 경우에 이와 같은 동작을 한 줄로 실행한다고 생각하면 될 것이다.
이렇게 최댓값, 최솟값을 찾을 수 있고, python에서는 리스트 내의 특정 값의 인덱스 값 또한 쉽게 찾을 수 있다.
arr = [1,2,3,4,5]
loc = arr.index(3)
3의 위치를 찾기 위해 위와 같은 명령어를 실행할 수 있다. 그러나 2차원 리스트의 경우에는 그냥 index는 실행되지 않는다. for문을 이용하거나, list comprehension을 사용할 수 있다. 최댓값의 위치를 찾으려면 다음과 같다.
arr=[[1,2,3],[2,3,4]]
indices = [(i,j) for i in range(m) for j in range(n) if arr[i][j]==max_value)]
이렇게 하면 indices 리스트에 최대값의 index가 저장된다. 이는 for문으로 풀어서 쓰면 다음과 같은 동작을 할 것이다.
indices=[]
for i in range(m):
for j in range(n):
if arr[i][j] == max_value:
indices.append((i,j))