Status
Published
Category
Python
Tags
Python
알고리즘
Author
Published Date
Jul 14, 2025
Featured Image
동작 원리를 알아야 성장 할 수 있다.
www.acmicpc.net

n = input() mylist = map(int, (input().split())) mymax = max(mylist) sum = sum(mylist) print(sum * 100/ mymax / int(n))

처음 문제를 풀었을때 위와 같이 풀었지만 오답 처리가 됐다. 어떤걸 틀렸을까?
- max()는 정상 동작
- sum()은 항상 0
왜 이런 일이 발생 했을까?
map()은 이터레이터(iterator)이다.
이터레이터란?
이터레이터는 파이썬에서 반복 가능한 객체를 다루는 데 사용되는 개념이다. 이터레이터를 사용하면 반복 가능한 객체의 요소에 순차적으로 접근할 수 있다. 이터레이터는 'next()' 메서드를 통해 다음 요소로 이동하고, 요소가 없을 때 'StopIteration' 예외를 발생
즉 이터레이터는 한 번만 순회 가능한 데이터 스트림이다.
이터레이터의 동작 방식은 아래와 같다.
[10, 20, 30] → map(int, ...) ↓ [10] -> [20] -> [30] -> 끝 (StopIteration)
하지만 문제는 여기서 생긴다.
mymax = max(mylist) # 여기서 10, 20, 30을 다 꺼냄 mysum = sum(mylist) # 이미 다 꺼내서 남은 게 없음 → 0
먼저 max()의 동작 방식을 알아야한다.
max()는 반복 가능한 것 을 받으면 처음부터 끝까지 하나씩 꺼내서 가장 큰 값을 찾는다.
def max(iterable): iterator = iter(iterable) # 이터레이터로 만듦 // 집중! current_max = next(iterator) # 첫 번째 값을 초기값으로 for item in iterator: if item > current_max: current_max = item return current_max
여기서 왜 iterator = iter(iterable) 하는 것 일까?
반복 가능한 모든 객체를 받아야 한다.
다시말해 반복 가능한 모든 객체를 처리할 수 있도록 통일 해야한다.
반복…? 반복은 어떤 행위를 똑같이 여러번 다시 하는거 아닌가?
→ 프로그래밍 에서의 반복(iteration)은 데이터를 순서대로 하나씩 꺼내는 행위이다.!
파이썬의 반복은 크게 두 가지가 있다.
타입 | 설명 |
Iterable (반복 가능한 것) | 리스트, 튜플, 문자열, 세트, 딕셔너리 등 |
Iterator (반복자) | next()로 값을 꺼낼 수 있는 것 |
Iterable을 반복하려면 반드시 이터레이터로 바꿔야 한다.
for문, max(), sum() 모두
iter() 함수를 호출해서 이터레이터를 만든다.
iterator = iter(iterable) // 반복자(next()로 값을 꺼낼 수 있도록 만든다!
왜 이렇게 할까?
반복 한다는 것은 결국 next()를 사용한다는 것이고 next()를 사용 가능한 것은 이터레이터만이 가능하기 때문이다.
이터레이터가 들어오든
리스트가 들어오든
무조건 iter()를 쓰면 안전하고 유연하게 처리할 수 있다. 다시말해 반복 가능한 모든 것을 하나의 방식으로 다루기 위해서이다.
파이썬의 반복은 모두 iter()로 시작하고 next()로 끝난다.
그래서 나 왜틀림?
위에서 설명 했다시피 map() 객체는 이터레이터 라서 한 번 순회하면 끝나기 때문이다.
mylist = map(int, input().split()) // 이터레이터임 max(mylist) // 호출하면?
max(mylist) // 호출하면
- __iter__() 호출 → 자기 자신 반환
- next() 호출해서 처음부터 끝까지 다 꺼냄
- 최댓값 찾음
- 이 시점에서 mylist는 다 소비됨
mylist의 데이터값을 max()로 소비 했기 때문에. 다음으로 sum(mylist)를 해도 남은 값이 없으니 0을 반환해 틀린것이다.
그렇다면 어떻게?
n = int(input()) mylist = list(map(int, input().split())) # 리스트로 저장 mymax = max(mylist) mysum = sum(mylist) print(mysum * 100 / mymax / n)
바로 mylist를 list로 저장해야한다.
리스트는 소비해도 계속 사용할 수 있나?
리스트는 데이터를 메모리에 저장하는 구조이다.
mylist = list(map(int, input().split())) - 리스트가 메모리에 값을 다 저장 - max(), sum() 리스트를 여러 번 돌려도 상관없다.
정리하면..
pythontutor.com 사이트를 참고하여 마지막 정리를 하고 마무리 하겠다.
list 없이 할 경우

변수 | 값 |
mylist | map 객체 (이터레이터) |
mymax | 100 (max가 mylist를 다 순회해서 찾음+여기서 다 소비 해버림) |
sum | 0 (이터레이터가 이미 끝나서 더 꺼낼 게 없음) |
Input: 10 30 50 20 100 [map 객체] : (이터레이터, 내부 커서 있음) max(mylist) → 10, 30, 50, 20, 100 다 꺼냄 → 커서가 끝까지 감 sum(mylist) → 남은 게 없음 → 0 반환
리스트로 감쌀 경우

리스트로 메모리에 저장 된다. Index : 0 1 2 3 4 Value : 10 30 50 20 100
반복 시마다.(꺼낼때마다)
• iter(mylist)를 호출해서
• 새로운 list_iterator를 생성
리스트 자체는 변하지 않음
이터레이터는 흘러가는 데이터 스트림,
리스트는 기억하는 데이터 그릇이다.
![[Python]파이썬 이터레이터(Iterator) 이해](/_next/image?url=https%3A%2F%2Fi.postimg.cc%2FWzN4NCy2%2F2222.png&w=3840&q=75)