- Published on
파이썬으로 1부터 100까지 합 구하기 sum과 range로 끝내는 가장 파이써닉한 방법
- Authors
- Name
- 스타차일드
- https://x.com/ETFBITX
서론
코딩을 처음 배울 때 거의 반드시 마주치는 문제가 있습니다. 바로 1부터 100까지 더하기죠. 단순해 보이지만, 여기에는 반복문, 범위 처리, 내장 함수 활용 같은 핵심 개념이 한 번에 들어 있습니다.
특히 파이썬에서는 “반복문으로 하나씩 더하는 방식”도 가능하지만, 더 파이써닉(Pythonic)하게는 sum과 range를 조합해 한 줄로 끝낼 수 있습니다. 이 글에서는 정답 코드만 던지고 끝내지 않고, range의 동작 원리(끝값 포함 여부), 흔한 오프바이원(off-by-one) 실수, 디버깅/트러블슈팅 포인트, 그리고 실무에서 응용할 수 있는 패턴까지 정리해보겠습니다.
가장 간단한 정답: sum과 range
파이썬에서 1부터 100까지의 합은 아래 한 줄로 구할 수 있습니다.
result = sum(range(1, 101))
print(result) # 5050
핵심은 range(1, 101)입니다.
range(start, stop)는 start부터 stop-1까지 생성합니다.- 즉
range(1, 101)은 1~100을 의미합니다.
이 한 줄은 읽기도 쉽고, 파이썬 내장 함수(sum)가 C 레벨에서 최적화되어 있어 일반적으로 빠릅니다.
range 이해하기: 왜 101까지 넣어야 할까
range는 많은 초보자가 실수하는 지점입니다. 이유는 간단합니다. 끝값이 포함되지 않기 때문이죠.
print(list(range(1, 5)))
# [1, 2, 3, 4]
따라서 “1부터 100까지”를 만들려면 stop을 100이 아니라 101로 지정해야 합니다.
자주 하는 실수: range(1, 100)
result = sum(range(1, 100))
print(result) # 4950
이 코드는 1~99까지만 더합니다. 결과가 5050이 아니라 4950이 나오면, 가장 먼저 range의 stop 값을 의심하세요.
step까지 포함한 range
range(start, stop, step) 형태도 자주 쓰입니다.
# 1부터 100까지 홀수 합
odd_sum = sum(range(1, 101, 2))
print(odd_sum)
이 패턴은 “특정 간격으로 수를 선택해 합산”할 때 유용합니다.
반복문으로 푸는 전통적인 방법과 비교
물론 아래처럼 for 문으로도 구할 수 있습니다.
total = 0
for i in range(1, 101):
total += i
print(total) # 5050
이 방식의 장점은 다음과 같습니다.
- 로직이 눈에 보이므로 디버깅이 쉽다
- 합산하면서 다른 작업(예: 조건 체크, 로그 출력)을 같이 수행하기 편하다
하지만 “단순 합”만 필요하다면 sum(range(...))가 더 간결하고 의도가 명확합니다.
while로도 가능하지만 주의할 점
while로도 구현할 수 있지만, 종료 조건을 잘못 주면 무한 루프가 되기 쉽습니다.
total = 0
i = 1
while i <= 100:
total += i
i += 1
print(total)
i += 1을 빼먹는 순간 루프가 끝나지 않습니다. 이 주제는 별도로 정리한 글인 파이썬 while문 무한 루프 제대로 다루기 break와 continue로 안전하게 제어하는 법에서도 다뤘으니, while을 자주 쓰는 분이라면 함께 읽어보는 걸 권합니다.
트러블슈팅: 결과가 이상할 때 체크리스트
1) stop 값이 101인지 확인
가장 흔한 오류입니다.
- 올바름:
range(1, 101) - 틀림:
range(1, 100)(1~99)
2) range 인자가 뒤집히지 않았는지 확인
print(sum(range(101, 1)))
# 0
range(101, 1)은 기본 step이 +1이라 진행할 수 없어서 비어 있는 range가 됩니다. 역순이면 step을 음수로 줘야 합니다.
print(sum(range(100, 0, -1)))
# 5050
3) 타입이 섞이지 않았는지 확인
입력값을 받아서 합산하는 코드로 확장하다 보면 문자열이 섞이는 경우가 있습니다.
n = "100"
# sum(range(1, n + 1)) # TypeError
n = int(n)
print(sum(range(1, n + 1)))
Best Practice: 가독성과 확장성을 동시에 잡는 패턴
단순히 1~100 합이라면 한 줄이면 끝이지만, 코드가 커지면 “의도를 드러내는 함수화”가 도움이 됩니다.
def sum_1_to_n(n: int) -> int:
if n < 1:
return 0
return sum(range(1, n + 1))
print(sum_1_to_n(100)) # 5050
이렇게 해두면 아래처럼 재사용이 쉬워집니다.
- 1~365 합
- 1~사용자 입력값 합
- 특정 범위 합(추후
sum(range(a, b+1))로 일반화)
더 일반화: a부터 b까지 합
def sum_a_to_b(a: int, b: int) -> int:
if a > b:
a, b = b, a
return sum(range(a, b + 1))
print(sum_a_to_b(1, 100))
print(sum_a_to_b(100, 1)) # 순서가 뒤집혀도 동작
실무에서는 입력이 항상 “정상 범위”라고 가정하기 어렵기 때문에, 이런 방어 코드는 생각보다 큰 차이를 만듭니다.
성능 관점에서의 짧은 메모
range는 리스트를 미리 만들지 않는 lazy sequence라 메모리를 아낍니다.sum(range(...))는 파이썬에서 가장 표준적인 합산 방식 중 하나입니다.
참고로 수학 공식(가우스 공식)으로도 구할 수 있습니다.
n = 100
print(n * (n + 1) // 2) # 5050
이 방식은 O(1)이라 매우 빠르지만, “범위 합”이 조금만 복잡해지면 다시 코드가 늘어납니다. 단순한 1..n 합이면 공식도 좋고, 일반적인 개발 코드에서는 sum(range(...))가 읽기 쉬운 경우가 많습니다.
결론
- 1부터 100까지의 합은
sum(range(1, 101))로 가장 간결하게 해결할 수 있습니다. range(start, stop)에서 stop은 포함되지 않는다는 규칙 때문에 101을 넣어야 합니다.- 결과가 다르면 먼저 오프바이원 실수(
range(1, 100))를 의심하세요. - 단순 합을 넘어 재사용하려면
sum_1_to_n,sum_a_to_b처럼 함수로 감싸는 것이 유지보수에 유리합니다.
이제 “1부터 100까지”는 끝났습니다. 다음에는 홀수/짝수 합, 조건 필터링 합, 혹은 사용자 입력 기반 합으로 확장해보면 range와 sum 감각이 빠르게 늘어날 겁니다.