Python/알고리즘 연습

1. 1부터 n까지의 합 구하기

김아다만티움 2024. 7. 9. 11:33
* 책: 모두의 알고리즘 with 파이썬 

 

1. 1부터 n까지의 합을 구하는 방법

  • 머릿속에 무의식 중으로 떠오르는 방법은 아래 코드의 방법 1
  • 가우스처럼 똑똑하게 천재처럼 구하려면 방법 2 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1부터 n까지의 합 구하기 방법1
# 냅다 1부터 더하는 방법
 
def sum_n(n):
    s = 0 # 초기화
    for i in range(1, n+1):
        s = s + i
    
    return s
    
print(sum_n(10)) # 55
 
 
 
# 1부터 n까지의 합 구하기 방법2
# 가우스처럼 똑똑하게 구하기 (난 안됨 ㅠ)
 
def gaus(n):
    return n*(n+1)//2
 
gaus(10# 55
 
# n*(n+1)에서 '*' 이거 안해주면 TypeError: 'int' object is not callable 오류남
# // 나누기: int return, / 나누기: float return
cs

 

2. 입력 크기와 계산 횟수 

  • 방법 1: 반복문을 사용하는 것이므로 덧셈이 n번 반복되어 사용되는 셈 (총 n번)
  • 방법2: n이 아무리 크더라도 덧셈 한번, 곱셈 한번, 나눗셈 한번이면 끝남 (총 3번)

보통 컴퓨터에서 사용하는 연산은 매우매우매우매우 큰 수를 다루므로 방법2처럼 간단하게 짜는 것이 중요

 

3. 대문자 O 표기법: 계산 복잡도(complexity) 표현 '빅 오'

  • 방법 1: 사칙 연산을 총 n번 하므로 O(n)으로 표현
  • 방법 2: 마치 O(3)일 것 같으나 O(1);
  • 입력 크기가 커져도 계산 시간이 더 늘어나지 않는 경우에는 모두 O(1)로 표현 
##################결론#####################
O(n): 필요 계산 횟수가 입력 크기 n과 비례할 때 표기
O(1): 필요 계산횟수가 입력 크기 n과 무관할 때 표기

 

 

<연습 문제>

1부터 n까지 연속한 숫자의 제곱의 합 구하기 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1부터 n까지의 제곱의 합 구하기 방법 1
# 덧셈과 비슷, O(n)의 방법
 
def sqr_sum(n):
    s = 0
    for i in range(1, n+1):
        s = s + i**2
    
    return s
    
 
# 방법2: {n(n+1)(2n+1)}/6 사용
 
def gaus2(n):
    return n*(n+1)*(2*n+1)//6
cs