이 튜토리얼에서는 Python의 map() 함수를 사용하여 행렬(2차원 리스트)에서 1의 개수가 가장 많은 행을 찾는 프로그램을 작성해 보겠습니다.
문제 정의
예를 들어 다음과 같은 행렬이 있다고 가정해 봅시다.
matrix = [ [0, 0, 1], [1, 1, 1], [1, 1, 0] ]
위 행렬에서 두 번째 행인 [1, 1, 1]은 1이 세 개로 가장 많으므로, 결과적으로 해당 행의 인덱스인 1을 출력해야 합니다.
풀이 접근 방법
같은 문제를 여러 가지 방식으로 해결할 수 있지만, 이번에는 map() 함수를 활용하여 아래와 같은 순서로 진행합니다.
- 행렬을 초기화합니다.
- map() 함수를 이용해 각 행마다 1의 개수를 구하고, 결과를 리스트에 저장합니다.
- 리스트에서 최댓값의 위치(인덱스)를 출력합니다.
코드 예제
## 행렬 초기화
matrix = [
[0, 0, 1],
[1, 1, 1],
[1, 1, 0]
]
## 한 행에서 1의 개수를 세는 함수
def number_of_ones(row):
count = 0
for i in row:
if i == 1:
count += 1
return count
## 각 행의 1 개수를 구함
## map은 객체를 반환하므로 리스트로 변환
ones_count = list(map(number_of_ones, matrix))
## 리스트에서 최댓값의 인덱스 출력
print(ones_count.index(max(ones_count)))참고: 원본 코드의
i is 1은 Python에서 권장되지 않는 비교 방식입니다. 값 비교에는 항상==연산자를 사용하는 것이 올바르며, 위 예제 코드에서도 이를 반영했습니다. 또한sum(row)처럼 내장 함수를 활용하면 더 간결하게 작성할 수도 있습니다.
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
1
동작 원리 살펴보기
map(number_of_ones, matrix)는 matrix의 각 행을 number_of_ones 함수에 하나씩 전달합니다. 그 결과 [1, 3, 2]라는 리스트가 만들어지고, max()로 최댓값 3을 찾은 뒤 .index() 메서드로 해당 값이 위치한 인덱스 1을 얻게 됩니다.
프로그램에 대해 궁금한 점이 있다면 댓글로 남겨 주세요.