본문 바로가기

파이썬(문제풀이)

파이썬 1에서 1000까지의 자연수중 3의 배수의 합

더보기

파이썬에서 1부터 1000까지의 자연수 중 3의 배수의 합을 구하는 방법을 파이썬으로 구현하기

#1. 반복문(for loop)을 이용한 방법

가장 직관적인 방법으로, for 반복문을 사용하여 1부터 1000까지 숫자를 하나씩 확인하며 3의 배수일 경우에만 합계에 더해주는 방식입니다.

total_sum = 0
for number in range(1, 1001):
    if number % 3 == 0:
        total_sum += number
print(total_sum)

코드 분석

  • total_sum = 0
    • total_sum이라는 변수를 선언하고 초기값을 0으로 설정합니다. 이 변수는 앞으로 3의 배수들을 누적하여 더할 합계를 저장하는 역할을 합니다.
  • for number in range(1, 1001):
    • for 반복문을 시작합니다. range(1, 1001)은 1부터 1000까지의 연속적인 정수(1, 2, 3, ..., 1000)를 순서대로 생성합니다.
    • 반복문은 이 숫자들을 하나씩 number 변수에 할당하며 1000번 반복됩니다.
  • if number % 3 == 0:
    • 각 number가 3의 배수인지 확인하는 조건문입니다.
    • %는 나머지 연산자입니다. number % 3은 number를 3으로 나눈 나머지 값을 반환합니다.
    • == 0은 나머지가 0인지 확인하는 비교 연산자입니다.
    • 만약 number가 3으로 나누어떨어지면(예: 3, 6, 9 등), 이 조건은 **참(True)**이 되어 다음 줄의 코드가 실행됩니다. 그렇지 않으면(예: 1, 2, 4 등), 이 조건은 **거짓(False)**이 되어 다음 줄의 코드는 건너뛰게 됩니다.
  • total_sum += number
    • total_sum = total_sum + number와 같은 의미의 축약 연산자입니다.
    • 앞서의 if 조건이 참일 때만 이 코드가 실행됩니다. 현재 number가 3의 배수이므로, 이 숫자를 현재 total_sum에 더하여 다시 total_sum에 할당합니다. 이 과정을 통해 3의 배수들이 total_sum 변수에 계속 누적됩니다.
  • print(total_sum)
    • for 반복문이 모두 끝난 후(1000까지의 모든 숫자를 확인한 후), 최종적으로 계산된 total_sum 값을 화면에 출력합니다.

이 코드는 단순 반복과 조건문을 사용해 문제를 해결하는 가장 기본적인 접근 방식입니다. 결과적으로 이 코드는 1부터 1000까지 3의 배수인 3, 6, 9, ..., 999를 모두 더한 값인 166833을 출력합니다.


#2. 리스트 컴프리헨션(list comprehension)을 이용한 방법

리스트 컴프리헨션은 파이썬의 강력한 기능으로, 반복문과 조건문을 한 줄로 작성하여 리스트를 만들고, sum() 함수로 합계를 계산합니다.

total_sum = sum([number for number in range(1, 1001) if number % 3 == 0])
print(total_sum)

코드 분석

  • [number for number in range(1, 1001) if number % 3 == 0]
    • 이 부분이 바로 리스트 컴프리헨션입니다.
    • for number in range(1, 1001): 1부터 1000까지의 모든 정수를 하나씩 가져와 number에 할당합니다.
    • if number % 3 == 0: 각 number가 3으로 나누어 떨어지는지(즉, 3의 배수인지) 확인하는 조건입니다. 조건이 참인 경우에만 number가 리스트에 포함됩니다.
    • [... ]: 위 두 과정을 거쳐 최종적으로 [3, 6, 9, ..., 999]와 같이 1부터 1000 사이의 모든 3의 배수만을 담은 새로운 리스트를 생성합니다.

  • sum(...)
    • 파이썬의 내장 함수인 sum()은 괄호 안의 모든 요소의 합을 계산합니다.
    • 앞서 리스트 컴프리헨션으로 생성된 [3, 6, 9, ..., 999] 리스트를 sum() 함수가 받아서 모든 숫자를 더합니다.

  • total_sum = ...
    • sum() 함수가 반환한 최종 합계 값을 total_sum이라는 변수에 저장합니다.

  • print(total_sum)
    • 최종적으로 계산된 합계 값인 total_sum을 화면에 출력합니다. 이 코드의 실행 결과는 166833입니다.

이 코드는 반복문을 여러 줄에 걸쳐 작성하는 대신, 한 줄에 압축적으로 표현하여 간결하고 가독성이 높다는 장점이 있습니다.

 

#3. 제너레이터(Generator)와 sum() 함수를 이용한 방법

리스트 컴프리헨션과 비슷하지만, 대괄호([]) 대신 소괄호(())를 사용하면 제너레이터 표현식이 됩니다. 제너레이터는 모든 값을 한꺼번에 메모리에 저장하지 않고, 필요할 때마다 값을 하나씩 생성해냅니다.

total_sum = sum(number for number in range(1, 1001) if number % 3 == 0)
print(total_sum)

코드 분석

  • sum(...): 파이썬의 내장 함수로, 괄호 안의 모든 요소의 합을 계산합니다.
  • (number for number in range(1, 1001) if number % 3 == 0): 이 부분이 제너레이터 표현식입니다. 리스트 컴프리헨션과 문법은 유사하지만, 대괄호([]) 대신 소괄호(())를 사용한다는 차이가 있습니다.
    • range(1, 1001)은 1부터 1000까지의 숫자를 순서대로 생성합니다.
    • if number % 3 == 0은 각 숫자가 3의 배수인지 확인하는 조건입니다. 이 조건이 참일 때만 해당 숫자가 다음 단계로 전달됩니다.
    • 제너레이터는 모든 숫자를 한 번에 메모리에 저장하는 리스트와 달리, 요청이 있을 때마다 값을 하나씩 생성합니다. sum() 함수는 제너레이터로부터 3의 배수들을 하나씩 받아서 더합니다. 이 방식은 메모리 사용량이 매우 적어 대량의 데이터를 처리할 때 효율적입니다.

따라서 이 코드는 range(1, 1001)에서 3의 배수만 걸러내고, sum() 함수가 이 값들을 모두 더해 최종 합계인 166833을 total_sum 변수에 저장한 후 출력합니다.


#4. filter() 함수를 이용한 방법

filter() 함수는 주어진 함수반복 가능한 객체를 사용하여 특정 조건에 맞는 요소만 걸러내는 기능을 합니다. 3의 배수를 판별하는 함수를 lambda 표현식으로 간단하게 만들 수 있습니다.

total_sum = sum(filter(lambda x: x % 3 == 0, range(1, 1001)))
print(total_sum)

코드 분석

  • range(1, 1001): 1부터 1000까지의 연속된 정수(1, 2, 3, ..., 1000)를 생성합니다.
  • lambda x: x % 3 == 0: filter() 함수에 사용되는 **익명 함수(lambda function)**입니다. x라는 매개변수를 받아서 x를 3으로 나눈 나머지가 0인지(즉, 3의 배수인지)를 확인하여 True 또는 False를 반환합니다.
  • filter(lambda x: x % 3 == 0, range(1, 1001)): filter() 함수는 첫 번째 인자로 주어진 함수(lambda 함수)를 두 번째 인자인 range() 객체의 모든 요소에 적용하여, True를 반환하는 요소들만 걸러내는 **이터레이터(iterator)**를 반환합니다. 이 이터레이터는 3, 6, 9, ..., 999와 같은 3의 배수들을 포함합니다.
  • sum(...): 파이썬의 내장 함수로, filter() 함수가 반환한 이터레이터의 모든 요소들의 합을 계산합니다.
  • total_sum = ...: sum() 함수의 결과값을 total_sum 변수에 저장합니다.
  • print(total_sum): 최종적으로 계산된 값인 166833을 출력합니다.

이 코드는 반복문을 명시적으로 사용하지 않고, 함수형 프로그래밍의 개념을 적용하여 문제를 해결하는 방식입니다. filter() 함수는 필요한 요소만 효율적으로 걸러내기 때문에, 전체 리스트를 메모리에 생성하는 리스트 컴프리헨션보다 메모리 사용 측면에서 유리할 수 있습니다.