Part 1: 수학 공부를 위한 파이썬 첫걸음
Chapter 4: 반복 작업을 시키자 (Let's Repeat Tasks - Loops)
학습 목표
- 반복적인 작업을 자동화하는 반복문의 필요성을 이해한다.
for
반복문과range()
함수를 사용하여 정해진 횟수만큼 코드를 반복 실행할 수 있다.while
반복문을 사용하여 특정 조건이 만족되는 동안 코드를 반복 실행할 수 있다.- 반복문을 이용하여 합계 계산, 카운팅, 패턴 출력 등 다양한 작업을 수행할 수 있다.
- (선택)
break
문을 사용하여 반복문을 중간에 빠져나오는 방법을 이해한다.
1. 지루한 반복은 컴퓨터에게! 반복문
"안녕하세요"를 100번 출력하거나, 1부터 1000까지 숫자를 모두 더하는 작업을 직접 손으로 하거나 print()
문을 1000번 쓰는 것은 매우 비효율적이고 지루한 일입니다. 프로그래밍에서는 이렇게 동일하거나 유사한 작업을 여러 번 반복해야 할 때 반복문(Loop)을 사용합니다. 반복문을 사용하면 몇 줄의 코드로 수백, 수천 번의 작업을 컴퓨터에게 시킬 수 있습니다.
파이썬에는 크게 두 가지 종류의 반복문이 있습니다.
for
반복문: 정해진 횟수만큼 또는 리스트나 문자열 같은 자료구조의 모든 항목에 대해 반복할 때 주로 사용됩니다. (예: "100번 반복해!", "리스트의 모든 학생 이름을 출력해!")while
반복문: 특정 조건이 참(True)인 동안 계속해서 반복할 때 사용됩니다. 반복 횟수가 미리 정해져 있지 않을 때 유용합니다. (예: "사용자가 '종료'를 입력할 때까지 계속 물어봐!")
2. 정해진 횟수만큼 반복: for
반복문과 range()
for
반복문은 특정 작업(코드 블록)을 정해진 범위 또는 컬렉션의 각 항목에 대해 실행합니다. 가장 흔하게는 range()
함수와 함께 사용하여 특정 횟수만큼 반복합니다.
for 변수 in 반복가능한객체:
# 반복 실행될 코드 (반드시 들여쓰기!)
반복가능한객체(iterable)
: 리스트, 튜플, 문자열,range()
객체 등 여러 개의 항목을 포함하는 객체입니다.변수
: 반복이 실행될 때마다반복가능한객체
의 항목을 하나씩 차례대로 받아 저장하는 변수입니다.- 콜론(
:
)과 들여쓰기는if
문과 동일하게 필수입니다.
range()
함수: 연속된 숫자 범위를 만들어주는 함수입니다. for
문과 함께 쓰여 특정 횟수 반복을 쉽게 구현합니다.
range(stop)
: 0부터stop - 1
까지의 정수를 생성합니다. (총stop
번 반복)range(start, stop)
:start
부터stop - 1
까지의 정수를 생성합니다.range(start, stop, step)
:start
부터stop - 1
까지step
간격으로 정수를 생성합니다.
# 1. 0부터 4까지 출력 (총 5번 반복)
print("range(5):")
for i in range(5):
print(i) # i는 0, 1, 2, 3, 4 순서로 변함
print("-" * 10)
# 2. 1부터 5까지 출력
print("range(1, 6):")
for num in range(1, 6):
print(num) # num은 1, 2, 3, 4, 5 순서로 변함
print("-" * 10)
# 3. 2부터 10까지 짝수만 출력 (2씩 증가)
print("range(2, 11, 2):")
for even_num in range(2, 11, 2):
print(even_num) # even_num은 2, 4, 6, 8, 10 순서로 변함
print("-" * 10)
# 4. "Python" 다섯 번 출력하기
for _ in range(5): # 반복 변수가 필요 없을 때는 밑줄(_)을 사용하기도 함
print("Python")
반복문을 이용한 계산: 합계 구하기
반복문을 사용하면 여러 숫자의 합계를 쉽게 계산할 수 있습니다. 합계를 저장할 변수를 0으로 초기화하고, 반복문 안에서 각 숫자를 더해주면 됩니다.
# 1부터 10까지의 합 계산하기 (Σ k, k=1 to 10)
total_sum = 0 # 합계를 저장할 변수 초기화
for k in range(1, 11): # k는 1, 2, ..., 10
total_sum = total_sum + k # 기존 합계에 현재 k 값을 더함
# print(f"k={k}, 현재 합계={total_sum}") # 중간 과정 확인용
print("1부터 10까지의 합:", total_sum) # 최종 결과: 55
3. 조건이 만족되는 동안 반복: while
반복문
while
반복문은 주어진 조건식이 참(True)인 동안 코드 블록을 계속해서 반복 실행합니다. 조건식이 거짓(False)이 되면 반복을 멈춥니다.
while 조건식:
# 조건식이 참인 동안 반복 실행될 코드 (반드시 들여쓰기!)
# 주의: 반복문 안에서 조건식이 언젠가 거짓이 되도록 상태를 변경해야 함!
만약 while
문 안에서 조건식이 계속 참이 되도록 내버려두면 프로그램이 끝나지 않는 무한 루프(Infinite Loop)에 빠질 수 있으니 주의해야 합니다.
# 1부터 5까지 출력하기 (while 문 사용)
count = 1 # 시작 값
while count <= 5: # count가 5보다 작거나 같은 동안 반복
print(count)
count = count + 1 # count 값을 1 증가시킴 (이 부분이 없으면 무한 루프!)
print("반복 종료")
print("-" * 10)
# 'q'를 입력할 때까지 사용자 입력 받기
user_input = ""
while user_input != "q": # 입력이 'q'가 아닌 동안 반복
user_input = input("계속하려면 아무 키나 누르고, 종료하려면 'q'를 입력하세요: ")
print(f"입력하신 내용: {user_input}")
print("프로그램을 종료합니다.")
4. 반복문 제어하기: break
(선택 사항)
때로는 반복문 실행 중에 특정 조건이 만족되면 즉시 반복을 중단하고 싶을 때가 있습니다. 이때 break
문을 사용합니다. break
문이 실행되면 가장 가까운 반복문(for
또는 while
)을 즉시 빠져나갑니다.
# 1부터 100까지 더하는 중 합계가 500을 넘으면 중단하기
total_sum = 0
for i in range(1, 101):
total_sum = total_sum + i
print(f"{i}까지 더한 합계: {total_sum}")
if total_sum > 500:
print("합계가 500을 넘었으므로 중단합니다.")
break # 반복문 즉시 종료
print(f"최종 합계: {total_sum}") # break 시점의 합계가 출력됨
# (참고) `continue` 문: 현재 반복만 건너뛰고 다음 반복으로 넘어감
# 1부터 10까지 숫자 중 짝수만 출력 (홀수는 건너뛰기)
for i in range(1, 11):
if i % 2 != 0: # 홀수이면
continue # 아래 print 문을 실행하지 않고 다음 반복으로 넘어감
print(i)
수학 문제에 적용하기
반복문은 다양한 수학적 계산과 시뮬레이션에 활용됩니다.
시그마(Σ) 계산: 특정 규칙을 가지는 수열의 합 계산 (등차/등비수열의 합 등).
# 예: Σ (k^2 + 1), k=1 to 5 sum_sigma = 0 for k in range(1, 6): term = k**2 + 1 sum_sigma += term # += 는 sum_sigma = sum_sigma + term 과 같음 print(f"Σ (k^2 + 1), k=1 to 5 = {sum_sigma}") # (2+5+10+17+26) = 60
팩토리얼(Factorial) 계산:
n! = n * (n-1) * ... * 2 * 1
n = 5 factorial = 1 for i in range(1, n + 1): factorial *= i # *= 는 factorial = factorial * i 와 같음 print(f"{n}! = {factorial}") # 5! = 120
약수(Divisor) 찾기: 어떤 수 N을 1부터 N까지의 수로 나누어 나머지가 0인 수를 찾기.
N = 12 divisors = [] # 약수를 저장할 리스트 (다음 장에서 배움) print(f"{N}의 약수:", end=" ") # end=" " 는 줄바꿈 대신 공백 출력 for i in range(1, N + 1): if N % i == 0: print(i, end=" ") # 약수 출력 # divisors.append(i) # 리스트에 추가 (다음 장) print() # 줄바꿈
소수(Prime Number) 판별: 1과 자기 자신 외에는 약수를 갖지 않는 수 판별 (2부터 N-1까지 나누어 떨어지는 수가 없는지 확인).
num_to_check = 13 is_prime = True # 일단 소수라고 가정 if num_to_check < 2: # 2 미만은 소수 아님 is_prime = False else: for i in range(2, num_to_check): # 2부터 num_to_check-1 까지 if num_to_check % i == 0: # 나누어 떨어지면 is_prime = False # 소수 아님 break # 더 검사할 필요 없음 if is_prime: print(f"{num_to_check}는 소수입니다.") else: print(f"{num_to_check}는 소수가 아닙니다.")
수열의 항 생성: 등차수열, 등비수열, 피보나치 수열 등 점화식으로 정의된 수열의 항들을 차례대로 계산. (Chapter 10에서 자세히)
직접 해보기 (Follow Along Exercise)
사용자로부터 양의 정수 N을 입력받아, 1부터 N까지의 모든 홀수의 합을 계산하여 출력하는 프로그램을 for
반복문을 사용하여 작성해보세요.
# 직접 코드를 작성하고 실행해보세요!
n_str = input("양의 정수 N을 입력하세요: ")
N = int(n_str)
odd_sum = 0
for i in range(1, N + 1):
if i % 2 != 0: # 홀수이면
odd_sum = odd_sum + i
print(f"1부터 {N}까지 홀수의 합: {odd_sum}")
# 다른 방법: range의 step 활용
# odd_sum_alt = 0
# for i in range(1, N + 1, 2): # 1부터 N까지 2씩 증가 (홀수만 선택)
# odd_sum_alt += i
# print(f"1부터 {N}까지 홀수의 합 (다른 방법): {odd_sum_alt}")
연습 문제
while
반복문을 사용하여, 10부터 1까지 숫자를 거꾸로 출력하는 프로그램을 작성하세요.- 구구단 중 7단을 출력하는 프로그램을
for
반복문을 사용하여 작성하세요. (예: "7 x 1 = 7", "7 x 2 = 14", ..., "7 x 9 = 63") - 사용자로부터 양의 정수 하나를 입력받아, 그 수의 팩토리얼(
n!
)을 계산하여 출력하는 프로그램을 작성하세요. - 1부터 100까지의 숫자 중에서 3의 배수이면서 동시에 5의 배수인 숫자들을 모두 출력하는 프로그램을 작성하세요.
COMMENTS