Published on

파이썬으로 1부터 100까지 합 구하기 sum과 range로 끝내는 가장 파이써닉한 방법

Authors

서론

코딩을 처음 배울 때 거의 반드시 마주치는 문제가 있습니다. 바로 1부터 100까지 더하기죠. 단순해 보이지만, 여기에는 반복문, 범위 처리, 내장 함수 활용 같은 핵심 개념이 한 번에 들어 있습니다.

특히 파이썬에서는 “반복문으로 하나씩 더하는 방식”도 가능하지만, 더 파이써닉(Pythonic)하게는 sumrange를 조합해 한 줄로 끝낼 수 있습니다. 이 글에서는 정답 코드만 던지고 끝내지 않고, 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까지”는 끝났습니다. 다음에는 홀수/짝수 합, 조건 필터링 합, 혹은 사용자 입력 기반 합으로 확장해보면 rangesum 감각이 빠르게 늘어날 겁니다.