일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 빠른 서버
- 개발자
- select css
- 구로 디지털 단지 사무실
- 구로 공유 오피스
- ai로 앱 만들기
- 테드스페이스
- turborepo
- 느린 서버
- css
- PM
- 2인 사무실
- select tag
- 리더
- Django
- python
- XFrameOptions
- React
- html
- iframe
- javascript
- 좋은 리더란
- typescript
- JS
- 동료리뷰
- 공유 오피스
- multiprocessing
- 스타트업
- Regexp
- Domination Game
- Today
- Total
개발하는 일상
python map으로 알고리즘 문제 풀 때 조심할 부분 본문
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를 새로 생성해서 돌리기 때문에 여러번 반복하는 것이 가능해집니다.
'개발 간단 팁' 카테고리의 다른 글
정규 표현식으로 연속된 공백을 제거하기(remove consecutive spaces) (0) | 2021.04.24 |
---|---|
프로그래머스 신규 아이디 추천 javascript 정규식(regex) 해설 (1) | 2021.03.28 |
이벤트리스너 한 번만 발동하게 하기(Remove Event Listener Function Itself) (0) | 2021.01.11 |
구글 폼 제출 자동화하기(Automate to Submit Google Form) (6) | 2020.12.31 |
css perspective가 이상하게 동작할 때 (0) | 2020.12.20 |