개발하는 일상

python map으로 알고리즘 문제 풀 때 조심할 부분 본문

개발 간단 팁

python map으로 알고리즘 문제 풀 때 조심할 부분

롯데빙빙바 2021. 2. 2. 17:03

python의 map이 예상과 다르게 동작한다면?

입출력으로 문제를 풀어야 하는 플랫폼(백준, SWEA 등)에서 정수형 입력은 보통 다음과 같이 주어집니다.

1 2 3 4 5 6 7 8 9 10

input은 문자열을 return 하므로 숫자로 관리하기 위해 다음 코드를 사용하죠.

numbers = map(int, input().split())

만약 입력에 숫자 [3,6,9] 가 들어있는지 아닌지를 검사하기 위한 코드를 작성한다면?

for i in [3, 6, 9]:
    if i in numbers:
        print('{} 들어있음'.format(i))
3 들어있음
6 들어있음
9 들어있음

을 기대하고 작성했지만 실제로는

3 들어있음

밖에 출력되지 않습니다.

Iterator와 map

map 인스턴스(위 코드에서 numbers 객체)는 Iterator입니다. Iterator는 빌트인 함수 next 혹은 __next__ 메소드를 통해 다음 값을 하나씩 꺼내올 수 있습니다. Iterator로 반복문(for)을 돌리면 내부적으로 next를 통해 값을 하나씩 꺼내오고(소비한다고도 합니다), 더이상 꺼내올 값이 없을 때 반복문을 종료합니다.

Iterator는 한 번 다 꺼내왔다면 다시 처음으로 돌아가지 않습니다. 즉, 모두 소비되고 나면 그 때부터는 반복문을 돌지 않는다는 말이죠.

위의 코드의 if i in numbers: 에서 in 연산자도 똑같이 next를 호출하며 iterator를 소비합니다. 그러면 i가 처음 3일 때는 원하는 동작을 수행하다가, 두 번째 i가 6일 때는 이미 numbers가 다 소비되었으므로 i(6)이 numbers안에 없다고 판단됩니다.

결론

map과 같은 Iterator를 반복적으로 소비하는 코드를 작성하면 원하는대로 동작하지 않겠죠?

만약 그래야 한다면, 다음과 같이 list로 만들어 두면 문제가 발생하지 않습니다.

numbers = list(map(int, input().split()))

list는 반복문을 돌 때마다 내부적으로 Iterator를 새로 생성해서 돌리기 때문에 여러번 반복하는 것이 가능해집니다.

Comments