Q6_Sum square difference

들어가기

오늘 살펴볼 문제는 Q6 입니다.
https://projecteuler.net/problem=6
6번 문제 답게 코드는 어렵지 않게 작성할 수 있을 것 같은데요. 자세히 살펴보면 위에서 구하는 값은
1부터 100까지 숫자의 배열에 대한 정보(?) 를 줍니다. 한번 시작해봅시다.


문항해설

1부터 10까지 자연수를 각각 제곱해 더하면 다음과 같습니다 (제곱의 합).

1부터 10을 먼저 더한 다음에 그 결과를 제곱하면 다음과 같습니다 (합의 제곱).

따라서 1부터 10까지 자연수에 대해 “합의 제곱”과 “제곱의 합” 의 차이는 $3025 - 385 = 2640$ 이 됩니다.

그러면 1부터 100까지 자연수에 대해 “합의 제곱”과 “제곱의 합”의 차이는 얼마입니까?


예시코드

제곱의 합, 합의 제곱 비슷하면서 다른 말입니다. 각각에 해당하는 함수를 작성해보도록 합시다.
항상 열심히 해주시는 김쌤의 코드를 소개합니다.

def mysum1(n):
    # 합의 제곱 함수 정의
    sum1 = 0
    for i in range(1,n+1):
        sum1 = sum1 + i
    result1 = sum1**2
    return result1
  • mysum1 : 합의 제곱을 반환하는 함수입니다.
  • sum1 : 1부터 n까지의 자연수의 합을 저장하는 변수입니다.
  • range가 1부터 n+1 미만(즉, n이하) 의 값을 의미하고 이를 sum1에 차곡차곡 담고 있군요.
  • result1은 이 값을 제곱한, 우리가 구하고자 하는 합의 제곱을 의미하죠.
def mysum2(n):
    # 제곱의 합 함수 정의
    sum2 = 0
    for j in range(1, n + 1):
        sum2 = sum2 + j ** 2
    result2 = sum2
    return result2

print(mysum1(100) - mysum2(100)) #25164150
  • mysum2 : 제곱의 합을 반환하는 함수입니다.
  • sum2 : 1부터 n까지의 자연수의 제곱의 합을 저장하는 변수입니다.
  • 실행결과 25164150 입니다.

위의 결과를 Listcomprehension을 사용하면 아래와 같이 간단하게 계산할 수도 있어요.

sqd_list = [j**2 for j in range(1,101)]
print(sum(list(range(1,101)))**2 - sum(sqd_list)) #25164150

마무리

확률변수 X에 대하여 분산은 다음과 같이 구합니다.

위의 문제는 1부터 100까지 자연수를 값을 가지고 각 값에 대응되는 확률이 $\frac{1}{100}$ 확률변수 X의 분산과 관련이 있습니다.

  • $E(X^2)$ : (자연수의 제곱의 합) /100
  • $E(X)^2$ : (자연수의 합의 제곱) /10000

위를 고려하면 다음과 같이 1부터 100까지 자연수의 분산을 구할 수도 있습니다.

sqd_list = [j**2 for j in range(1,101)]
print(abs((sum(list(range(1,101)))**2)/10000 - sum(sqd_list)/100)) ##833.25

Leave a Comment