파이선으로 백준을 푸시다 보면, 이런 거 한 번 쯤 복사 붙여넣기 하신 적이 있을 겁니다.

 

 

 이 포스트에서는 노란 부분 말고, 파이썬 map 함수만 알아보도록 하겠습니다.

 


 공식 문서에 보면, 이 함수는 다음과 같이 설명이 되어 있습니다.

 

 

 먼저, iterable부터 봅시다. 이터레이터. 어디에서 동작했나요? c++의 STL에서는 vector, map 등에서 동작했습니다. 즉, 순회 가능한 무언가라는 것입니다. 예를 들자면, python의 list는 동적 배열입니다.

 

 

 이것은 순회 가능한 자료구조 중 하나입니다. 여기서 next를 부르면, 이터는 현재 가리키고 있는 2 다음 원소인 3을 가르킵니다.

 

 

 그러면, 2번째 인자가 이해가 되실 겁니다. input().split()은 입력받은 문자열에 대해서, white 문자를 기준으로 분리해서 list로 돌려주는 함수입니다.

 

 

 예를 들어서, 1 2 3라고 입력을 했다고 합시다.

 

 

 그러면, input().split()는 '1', '2', '3'으로 이루어진 str list를 돌려줍니다. 1번째 인자로 int를 붙이면 어떻게 될까요? 그러면, 각 원소에 대해서 int 함수를 적용한 결과들을 적용한 iterator를 리턴해 줍니다. 그런데, 직관적으로 이해하기는 쉽지 않아 보입니다.

 


 예제 프로그램을 보겠습니다. isit는 map 메서드에서 부를 함수입니다.

 

  그리고 5번째 줄에서, 1번째 인자로 isit을 넣고 있습니다. 순회 가능한 ar을 돌면서, 뭔가 하겠다는 의미로 보입니다.

 

 

 여기서 중요한 것은 iter가 출력된 시점입니다. 여기까지만 보면, 배열에서 어떤 값을 순회를 하는데, 그 값을 1번째 인자에 명시된 함수로 넘겼고, 그것이 어떠한 변환을 통해서 리턴이 되었다. 정도만 정리할 수 있습니다. 순회를 한 번 할 때 마다. 이를 도식화 시키면 아래와 같습니다.

 

 

 

 즉, 1번째 인자는 변환기로의 역할을 한 셈입니다.

 


 다시 본론으로 돌아와 보겠습니다.

 

 우리가 배울 것은 1~2번째 줄입니다. 2 3 2를 입력했다면, ar에는 '2', '3', '2'가 들어갈 겁니다. 그리고 이들은 모두 iterable 가능한 원소입니다.

 

 

 그러니, 이들에 대해 int 함수를 적용하는, iterator가 반환됩니다. 중요한 것은 이 때 2번째 인자에 들어간 배열, 원본에는 영향을 미치지 않았다는 것입니다. 이는 디버그창을 보면 확인할 수 있습니다.

 

 

 1번째 인자를 출력하였습니다. 이것을 보면, ite가 가리키는 int 객체 2임을 알 수 있습니다. str '2'가 int로 변환이 된 셈입니다. 중요한 것은 ar에는 변화가 없었다는 것입니다. 그렇다면 map(int, input().split())는 무엇을 의미할까요? 입력을 받은 것에 대해서 white 문자로 구분된 배열의 원소들int 함수를 적용한 iterator를 반환합니다.