본문 바로가기
개발&코딩/Python

n까지의 합 - Python Algorithm loop_basic

by 우동이 2021. 1. 3.
300x250
 

[Python] - 제어문 - if,while,for 반복문과 조건문

코딩을 할때 여러 기능을 제어하는 함수들을 제어문이라 하며 제어문 중에서는 반복문과 조건문이 존재한다. 그 중에서도 if는 조건을 설정하는 조건제어문 while과 for문은 반복제어문으로 반복

hobbylists.tistory.com

for, while(반복문) 에 대해 모른다면 위 글을 먼저 읽어보고 오는 걸 추천한다.

 

최근 시작한 알고리즘 공부는 Python을 이용하기에 Python의 문법적 이해가

어느정도 동반되어야 한다.

 

먼저 while문을 이용한 n까지의 합 예제이다.

 

n까지의 합 (while)

print("1부터 n 까지의 정수의 합을 구하시오.")
n = int(input("n의 값을 입력하시오 >> ")) # n의 수를 입력받아 지정

sum=0 #합계를 담을 sum
i=1 #반복자는 1로 설정

while i<=n: #1부터 n까지
    sum+=i #i 는 1씩 증가하며 sum에 합
    i+=1
print(f'{sum}')

sum에는 값을 증가하는 i를 담을거고 (iterator)

i는 1씩 증가한다 증가하면서 sum에 합해지고

n은 1부터 더할 값을 제한 지정해준다.

 

while로 하면 반복의 기능을 충실히 사용할 수 있지만

사실 이런 n까지의 합이란 코드를 구현하려면

for 문이 조금 더 편할 것이다.

 

n까지의 합 (for)

n=int(input("n의 값을 입력하시오 >> "))
i=1
sum=0


for i in range(1,n+1): #range 함수는 1부터 n+1까지 범위를 지정해주는 함수 range()
    sum+=i
    

print(f'1부터 n 까지의 합은 {sum}입니다.')

time은 함수의 실행시간을 측정하기 위해 넣어놓은 함수가 작동된것이므로 신경쓸 필요 없다

for문을 이용하면 일일히 i의 값을 증가시켜야 할 필요도 없고 range()를 거치면 되기에 편하다.

 

할 일이라고는 sum에 i를 더해주기만 하면 된다.

 

 

하지만 사실 반복문을 사용하게 되면 판단횟수가 1회 증가하는 거나 다름없다

그러면 시간은 더 소모되고 알고리즘을 사용하는 기업이나 개발자 입장에서

대량의 정보를 처리해야 할 때 막대한 손실로 이어질 수 있다.

 

n까지의 합 (가우스의 덧셈)

n=int(input("n의 값을 입력하시오 >> "))
sum=0
i=1

sum=n*(n+1)/2

print(sum)

사실 작은 값으로의 연산을 하면 알고리즘의 여부와 상관없이

거의 차이를 느끼지 못한다 그래서 각각 다른 반복문과 방식으로 짜인 코드에

나름 큰 값을 넣어 연산시간을 측정해봤다.

 

 

while을 이용한 loop
for문을 이용한 loop
가우스의 덧셈을 이용한 loop

 

while문에는 1억 단위의 수를 넣어봤는데 몇 분을 기다려도 연산이 안되어서 포기했다.

그에 반해 가우스의 덧셈 식은 1억 이상 단위도 빠른 속도를 보여줬다.

위의 세 가지는 같은 값으로 비교하기 위해 캡처한 장면들이다

for문과 가우스의 덧셈 식의 연산 속도가 거의 차이가 없는 듯 하다

그래서  for문과 가우스의 덧셈 식 두개에는 100,000,000 즉 1억

의 연산값을 집어넣어 비교했다.

 

가우스의 덧셈을 이용한 loop
for문을 이용한 loop 시간 측정이 안될정도로 길다..

보잘것없는 사지방 컴퓨터와 웹 기반의 컴파일러 구름 ide는 1억의 연산을 감당하지 못하고 

멈춰버렸다 코드가 비효율적인 탓도 있겠지만 아무튼 연산 시간이 5분을 넘어가는 걸 보니

계산 결과를 보는 것은 포기해야 한다.

 

아무튼 연산 속도는 while<for<Gauss 이 순이라고 봐야할 듯 하다.

 

 

 

 

 

정리는 notion에 되어있다.

 

chapter01_basic

maximum + time

www.notion.so

 

 

 

 

 

 

 

 

300x250

댓글