백준에서 python map 함수를 꽤 많이 썼습니다. 간단하게 알아봅시다.
이 함수에 대한 설명을 보면, iterator를 만든다고 되어 있어요. iterable한 무언가에 대해서 function을 적용한 결과를 리턴하는 이터레이터. 이터레이터는 __next__로 다음 원소를 불러오는 것이 주된 기능입니다. 당연하게도, 모든 원소를 불러왔는데 __next__를 호출했다면, StopIteration 에러가 발생하게 됩니다.
인자를 보면, 1번째 인자로 함수를, 2번째 인자로 iterable이 가능한 것, 예를 들자면 list를 넣어야 합니다. iterable이 가능하다면 순회를 할 수 있겠지요. 매번 순회를 하면서, 함수를 적용해서 새로운 결과를 돌려주게 됩니다.
[그림 2]는 iterable한 객체입니다. 이 객체에 대해서 각 원소에 대해서 계산된 결과를 가져오는 이터레이터를 돌려준다는 의미가 무엇일까요? 그림으로 이해해 보겠습니다.
먼저, 이터레이터가 1을 읽어요. function은 수를 문자열로 변환하는 것이라고 해 보겠습니다. 각 원소에 대해서 이터레이터를 돌릴 건데요. 1을 읽었어요. 1에 function을 적용하면 ‘1’이 됩니다. 이제 __next__를 호출해 보겠습니다.
다음에 읽은 것이 2입니다. 여기서, function을 적용하면 ‘2’가 됩니다. 왜냐하면 2가 문자열로 변환되면 ‘2’이기 때문입니다. 이렇게 각 원소들을 순회할 때 마다, func로 계산한 결과를 돌려주는 iterator를 map 함수가 돌려주게 됩니다.
먼저, 예제 프로그램 1을 보겠습니다. li는 1, 2, 3, 4, 5 순서대로 담고 있는 리스트입니다. 다음에, 우리는 map(str, li)로 li의 원소를 순회하는데, str 함수를 적용한 결과를 리턴하는 iterator를 반환하게 됩니다. 1을 읽을 때, ‘1’을 반환합니다. 그리고 2를 읽을 때 ‘2’를 반환합니다.
이 이터레이터를 list의 생성자의 인자로 받을 수 있습니다. 그러면 ‘1’, ‘2’, ‘3’, ‘4’, ‘5’ 순으로 돌면서 리스트에 추가될 겁니다.
실행 결과는 위와 같습니다. 사실 이 프로그램은 아래와 같이 단순화 시킬 수 있습니다.
위 코드는 li에 있는 k에 대해서 str(k)를 한 결과를 li_to_str에 넣는다는 의미입니다. 예제 1번 프로그램과 정확히 같은 일을 하는 코드입니다.
백준에서 정수 2개를 입력받을 때, 이렇게 많이 사용합니다. 이것도 간단하게 해석해 볼까요? 일단, 1번째 줄에서 map(int, input().split())인데요. split에 아무런 인자도 없으면 white space를 기준으로 분리하게 됩니다. 예를 들어, 3 5 입력으로 들어왔다면 input().split()은 아래와 같이 분리될 겁니다.
‘3’과 ‘5’로 분리됩니다. 이것을 가지고 순회를 할 것인데요. 순회할 때 각 원소에 대해, int 함수를 적용한 결과를 돌려줄 거에요. 이러한 이터레이터를 map 함수가 리턴하게 됩니다.
그러면 1번째 원소를 불러와서 int 함수를 적용했을 때 3, 2번째 원소를 불러와서 int 함수를 적용하면 5가 나올 겁니다. 이 두 값이 각각 a, b에 할당되었습니다. 이제 a와 b를 더하면 8이 나옵니다. 실행 결과를 볼까요?
정확하게 8이 나옴을 볼 수 있습니다.