본문 바로가기

파이썬(문제풀이)

파이썬 일렬로 나열된 숫자의 자릿수 합

더보기

1부터 50까지의 모든 숫자를 나열했을 때, 각 숫자의 자릿수를 더하는 파이썬 코드

#1: 반복문(for)을 이용한 일반적인 방법

total_sum = 0
for num in range(1, 51):
    num_str = str(num)
    for digit in num_str:
        total_sum += int(digit)
print(f"1부터 50까지 모든 자릿수의 총합: {total_sum}")
# 출력: 330

코드 분석

이 코드는 크게 두 부분으로 나눌 수 있습니다: 초기화반복 계산.

1. 변수 초기화

total_sum = 0

  • total_sum이라는 변수를 선언하고 0으로 초기화합니다. 이 변수는 1부터 50까지의 모든 숫자의 자릿수를 더한 최종 합계를 저장하는 역할을 합니다.

2. 반복 계산 (For 루프)

for num in range(1, 51):
    num_str = str(num)
    for digit in num_str:
        total_sum += int(digit)
  • 바깥쪽 for 루프: for num in range(1, 51)는 1부터 50까지의 정수를 순서대로 num 변수에 할당하며 반복합니다. 즉, num은 1, 2, 3, ..., 50 순으로 변합니다.
  • 숫자를 문자열로 변환: num_str = str(num)는 현재 num에 할당된 정수를 문자열로 변환합니다. 예를 들어, num이 12이면 num_str은 "12"가 됩니다.
  • 안쪽 for 루프: for digit in num_str는 변환된 문자열 num_str의 각 문자를 순서대로 digit 변수에 할당하며 반복합니다. 예를 들어, num_str이 "12"일 때, 이 루프는 두 번 실행됩니다. 첫 번째에는 digit에 "1"이, 두 번째에는 "2"가 할당됩니다.
  • 자릿수 더하기: total_sum += int(digit)는 digit 변수의 문자(예: "1")를 int() 함수를 사용하여 정수(예: 1)로 변환한 후, 이를 total_sum에 더합니다. 이 과정이 모든 숫자의 모든 자릿수에 대해 반복됩니다.

최종적으로 모든 반복이 끝난 후, print(f"1부터 50까지 모든 자릿수의 총합: {total_sum}") 코드가 실행되어 total_sum에 저장된 최종 합계(330)를 출력하게 됩니다. 이 코드는 중첩 반복문을 사용하여 문제를 해결하는 전형적인 예시입니다.


#2: 리스트 컴프리헨션(List Comprehension)을 이용한 간결한 방법

total_sum = sum(int(digit) for num in range(1, 51) for digit in str(num))
print(f"1부터 50까지 모든 자릿수의 총합: {total_sum}")
# 출력: 330

코드 분석

이 코드는 한 줄이지만 내부적으로 여러 단계의 작업을 수행합니다.

  1. range(1, 51): 먼저, 1부터 50까지의 정수 시퀀스를 생성합니다. num 변수는 이 시퀀스(1, 2, 3, ..., 50)를 순서대로 하나씩 가져옵니다.
  2. for digit in str(num): 바깥쪽 for 루프에서 가져온 각 숫자(num)를 str() 함수를 사용해 문자열로 변환합니다. 그리고 이 변환된 문자열의 각 문자를 digit 변수에 할당합니다.
    • 예를 들어, num이 12일 때, str(12)는 "12"가 됩니다.
    • 안쪽 for 루프는 이 "12"를 순회하며 digit에 먼저 "1"을, 그다음 "2"를 할당합니다.
  3. int(digit): digit 변수에 할당된 각 문자("1", "2", "3", ...)를 int() 함수를 사용해 다시 정수(1, 2, 3, ...)로 변환합니다.
  4. sum(...): 마지막으로, sum() 함수가 앞서 변환된 모든 정수들을 합산하여 최종 결과를 계산합니다. 이 결과는 total_sum 변수에 할당됩니다.

이 코드는 여러 줄의 for 반복문을 한 줄로 압축하여 표현한 것으로, 코드가 훨씬 간결해진다는 장점이 있습니다. 최종적으로 계산된 값은 330입니다.


#3: 수학적 연산을 이용한 방법

total_sum = 0
for num in range(1, 51):
    temp_num = num
    while temp_num > 0:
        total_sum += temp_num % 10  # 10으로 나눈 나머지는 마지막 자릿수
        temp_num //= 10             # 10으로 나눈 몫은 마지막 자릿수를 제거한 나머지
print(f"1부터 50까지 모든 자릿수의 총합: {total_sum}")
# 출력: 330

코드 분석

이 코드는 크게 두 개의 반복문으로 구성되어 있습니다.

1. 변수 초기화 및 바깥쪽 for 루프

total_sum = 0
for num in range(1, 51):
    temp_num = num
  • total_sum = 0: 모든 자릿수의 총합을 저장할 변수를 0으로 초기화합니다.
  • for num in range(1, 51): 1부터 50까지의 모든 숫자에 대해 반복 작업을 수행합니다. num 변수는 1, 2, 3, ..., 50 순으로 할당됩니다.
  • temp_num = num: 안쪽 while 루프에서 num의 자릿수를 분해할 때 원본 num을 보존하기 위해, num의 값을 temp_num이라는 임시 변수에 복사합니다.

2. 안쪽 while 루프 (자릿수 분리 및 합산)

while temp_num > 0:
    total_sum += temp_num % 10
    temp_num //= 10
  • while temp_num > 0: temp_num이 0이 될 때까지 이 루프를 계속 실행합니다. temp_num이 0이 되면 모든 자릿수를 처리했다는 의미이므로 루프가 종료됩니다.
  • total_sum += temp_num % 10: 현재 temp_num을 10으로 나눈 나머지를 total_sum에 더합니다. 이 나머지가 바로 가장 오른쪽(1의 자리) 자릿수입니다.
    • 예를 들어, temp_num이 47일 때, 47 % 10은 7이므로, 7을 total_sum에 더합니다.
  • temp_num //= 10: 현재 temp_num을 10으로 나눈 을 다시 temp_num에 할당합니다. 이는 가장 오른쪽 자릿수를 제거하는 효과를 줍니다.
    • temp_num이 47일 때, 47 // 10은 4(정수 나눗셈)이므로, temp_num은 4로 바뀝니다.
    • 다음 while 루프에서 temp_num이 4가 되어 4 % 10 = 4가 total_sum에 더해지고, temp_num은 4 // 10 = 0이 되면서 루프가 종료됩니다.

이 과정이 num이 1부터 50까지 모든 값에 대해 반복되며, 최종적으로 total_sum에는 330이라는 올바른 값이 저장됩니다. 이 방법은 앞서 보여드린 문자열 변환 방식보다 성능이 더 우수한 경우가 많습니다.