4. 반복문

header

반복문은 같은 작업을 여러 번 반복해야 할 때 사용하는 제어 구조입니다.
프로그래밍에서 반복문을 사용하면 코드를 간결하게 작성할 수 있고, 효율성을 높일 수 있습니다.
Python에서는 while문과 for문 두 가지 반복문을 제공하며, 각각 고유한 특징과 용도가 있습니다.

반복문 종류 예시
반복문 종류 예시

반복문 종류 🔄

반복문 종류 설명 사용 시기
while문 조건이 참인 동안 반복 실행 반복 횟수를 미리 알 수 없는 경우
for문 특정 범위나 컬렉션을 순회하며 반복 반복 횟수를 미리 알 수 있는 경우

1. while문 🔁

while문은 조건이 참인 동안 지속적으로 코드 블록을 반복 실행하는 구문입니다. 반복 횟수를 미리 알 수 없는 경우나 조건에 따라 반복을 수행해야 하는 경우에 유용합니다.

while문의 기본 구조

while 조건식:
    조건식이 참이면 실행되는 코드

💡 : while문은 조건문과 유사하지만, 조건이 참인 동안 계속 반복한다는 점이 다릅니다! 🔍

기본 while문 예제

# 예제 1: 0부터 2까지 출력
count = 0

while count < 3:
    print(count)
    count = count + 1

# 실행 결과:
# 0
# 1
# 2

문제 1 - while문 기본 사용하기 (기초) 🎯

아래 코드의 주석을 참고하여, while문을 사용해 1부터 5까지 출력해보세요.

# TODO: 아래 주석을 참고하여 코드를 완성해보세요
# 1. 변수 초기화
# num = 

# 2. while문으로 1부터 5까지 출력
# while 
#     print(num)
#     num += 1

print("완료!")
정답 보기

  # 1. 변수 초기화
  num = 1

  # 2. while문으로 1부터 5까지 출력
  while num <= 5:
      print(num)
      num += 1

  print("완료!")
  # 실행 결과:
  # 1
  # 2
  # 3
  # 4
  # 5
  # 완료!
  

while문 활용 예제

# 예제 2: 아이스크림 구매 시뮬레이션
money = 5000
count = 0

while money >= 3000:
    print("아이스크림을 사 먹었습니다.")
    money -= 1000
    count += 1
    print("아이스크림을", count, "번 사 먹었습니다.")

print("돈이 부족해서 더 이상 구매할 수 없습니다.")

무한 루프 ⚠️

while문에서 조건이 항상 참이 되면 무한 루프가 발생할 수 있습니다. 무한 루프는 프로그램이 계속 실행되어 시스템에 부담을 줄 수 있으므로 주의해야 합니다.

# 무한 루프 예제 (주의!)
count = 0

while count < 3:
    print(count)
    # count += 1  # 이 줄이 없으면 무한 루프 발생!

# 올바른 코드
count = 0

while count < 3:
    print(count)
    count += 1  # 반드시 조건을 변경하는 코드 필요!

⚠️ 주의: 무한 루프를 중단하려면 Ctrl + C를 누르거나 IDE의 중단 버튼을 사용하세요! 🛑

break와 continue 문

while문 내에서 반복을 제어할 수 있는 특별한 키워드들이 있습니다.

break 문

  • while문을 강제로 종료합니다.
  • break문을 만나면 즉시 while문을 벗어나 다음 코드로 이동합니다.
# break 예제
count = 0

while count < 10:
    print(count)
    count += 1
    
    if count == 5:
        break  # 5에서 루프 종료

print("루프 종료")
# 실행 결과: 0 1 2 3 4 루프 종료

continue 문

  • 현재 반복을 건너뛰고 다음 반복으로 이동합니다.
  • while문의 처음 조건문으로 돌아갑니다.
# continue 예제 (369 게임)
num = 0

while num < 20:
    num += 1
    
    if num % 3 == 0:  # 3의 배수인 경우
        print("짝", end=" ")
        continue  # 다음 반복으로 이동
    
    print(num, end=" ")

# 실행 결과: 1 2 짝 4 5 짝 7 8 짝 10 11 짝 13 14 짝 16 17 짝 19 20

문제 2 - break와 continue 사용하기 (중급) 🎯

아래 코드의 주석을 참고하여, break와 continue를 사용해보세요.

# TODO: 아래 주석을 참고하여 코드를 완성해보세요
# 1부터 20까지 출력하되, 3의 배수는 "짝"으로 출력하고, 17에서 중단

# num = 0
# while num < 20:
#     num += 1
#     
#     # 3의 배수인 경우 "짝" 출력하고 다음 반복으로
#     if num % 3 == 0:
#         print("짝", end=" ")
#         continue
#     
#     # 17인 경우 루프 중단
#     if num == 17:
#         break
#     
#     print(num, end=" ")
정답 보기

  num = 0
  while num < 20:
      num += 1
      
      # 3의 배수인 경우 "짝" 출력하고 다음 반복으로
      if num % 3 == 0:
          print("짝", end=" ")
          continue
      
      # 17인 경우 루프 중단
      if num == 17:
          break
      
      print(num, end=" ")

  # 실행 결과: 1 2 짝 4 5 짝 7 8 짝 10 11 짝 13 14 짝 16
  

중첩 while문

while문 안에 또 다른 while문을 사용할 수 있습니다. 이를 중첩 while문이라고 합니다.

# 중첩 while문 예제 (5일간 3시간씩 수업)
day = 1

while day <= 5:
    hour = 1
    print(f"{day}일차 시작")
    
    while hour <= 3:
        print(f"{day}일차 {hour}교시입니다")
        hour += 1
    
    day += 1
    print()

# 실행 결과:
# 1일차 시작
# 1일차 1교시입니다
# 1일차 2교시입니다
# 1일차 3교시입니다
# 
# 2일차 시작
# 2일차 1교시입니다
# ...

2. for문 🔄

for문은 반복 횟수를 미리 알 수 있는 경우에 사용하는 반복문입니다. 리스트, 문자열, range() 함수 등과 함께 사용하여 간결하고 효율적인 코드를 작성할 수 있습니다.

for문의 기본 구조

for 변수 in 리스트:
    코드1
    코드2
    ...

기본 for문 예제

# 예제 1: 리스트 순회
numbers = [1, 2, 3, 4, 5]

for n in numbers:
    print(n)

# 실행 결과:
# 1
# 2
# 3
# 4
# 5
# 예제 2: 문자열 순회
for ch in 'Hello':
    print(ch)

# 실행 결과:
# H
# e
# l
# l
# o
# 예제 3: 문자열 리스트 순회
names = ["jennie", "hani", "kelly"]

for name in names:
    print("안녕하세요, 제 이름은", name, "입니다.")
    print("만나서 반갑습니다.")

# 실행 결과:
# 안녕하세요, 제 이름은 jennie 입니다.
# 만나서 반갑습니다.
# 안녕하세요, 제 이름은 hani 입니다.
# 만나서 반갑습니다.
# 안녕하세요, 제 이름은 kelly 입니다.
# 만나서 반갑습니다.

range() 함수 📊

range() 함수는 연속된 정수 시퀀스를 생성하는 내장 함수입니다. for문과 함께 사용하면 반복 횟수를 쉽게 제어할 수 있습니다.

range() 함수의 기본 형태

range(시작, 종료)  # 시작부터 종료-1까지
range(종료)        # 0부터 종료-1까지 (시작값 생략 시 0)
range(시작, 종료, 간격)  # 시작부터 종료-1까지 간격만큼
# range() 함수 예제
print(list(range(1, 7)))  # [1, 2, 3, 4, 5, 6]
print(list(range(2, 5)))  # [2, 3, 4]
print(list(range(4, 8)))  # [4, 5, 6, 7]
print(list(range(5)))     # [0, 1, 2, 3, 4]

range() 함수를 활용한 for문

# 예제 1: 1부터 5까지의 합 구하기
sum = 0

for n in range(1, 6):
    sum += n

print(sum)  # 15

# 예제 2: 1부터 99까지의 합 구하기
sum = 0

for num in range(1, 100):
    sum += num

print(sum)  # 4950

문제 3 - range() 함수 사용하기 (기초) 🎯

아래 코드의 주석을 참고하여, range() 함수를 사용해보세요.

# TODO: 아래 주석을 참고하여 코드를 완성해보세요
# 1. 1부터 10까지 출력
# for i in range(1, 11):
#     print(i)

# 2. 0부터 9까지 출력
# for i in range(10):
#     print(i)

# 3. 2부터 20까지 짝수만 출력
# for i in range(2, 21, 2):
#     print(i)

# 4. 10부터 1까지 역순으로 출력
# for i in range(10, 0, -1):
#     print(i)
정답 보기

  # 1. 1부터 10까지 출력
  for i in range(1, 11):
      print(i)

  # 2. 0부터 9까지 출력
  for i in range(10):
      print(i)

  # 3. 2부터 20까지 짝수만 출력
  for i in range(2, 21, 2):
      print(i)

  # 4. 10부터 1까지 역순으로 출력
  for i in range(10, 0, -1):
      print(i)
  

중첩 for문 (구구단) 🧮

for문을 중첩하여 사용하면 2차원적인 반복 작업을 수행할 수 있습니다. 구구단 출력이 대표적인 예입니다.

# 구구단 2단 출력
for n in range(1, 10):
    print("2 X", n, "=", 2 * n)

# 실행 결과:
# 2 X 1 = 2
# 2 X 2 = 4
# 2 X 3 = 6
# 2 X 4 = 8
# 2 X 5 = 10
# 2 X 6 = 12
# 2 X 7 = 14
# 2 X 8 = 16
# 2 X 9 = 18
# 중첩 for문으로 전체 구구단 출력
for m in range(2, 10):        # 2단부터 9단까지
    for n in range(1, 10):    # 1부터 9까지
        print(m, "X", n, "=", m * n)
    print()  # 단 사이에 빈 줄 추가

# 실행 결과:
# 2 X 1 = 2
# 2 X 2 = 4
# ...
# 2 X 9 = 18
# 
# 3 X 1 = 3
# 3 X 2 = 6
# ...
# 9 X 9 = 81

문제 4 - 중첩 for문으로 구구단 만들기 (중급) 🎯

아래 코드의 주석을 참고하여, 중첩 for문을 사용해보세요.

# TODO: 아래 주석을 참고하여 코드를 완성해보세요
# 1. 3단만 출력하기
# for n in range(1, 10):
#     print("3 X", n, "=", 3 * n)

# 2. 5단부터 7단까지 출력하기
# for m in range(5, 8):
#     print(f"=== {m}단 ===")
#     for n in range(1, 10):
#         print(f"{m} X {n} = {m * n}")
#     print()

# 3. 역순 구구단 (9단부터 2단까지)
# for m in range(9, 1, -1):
#     print(f"=== {m}단 ===")
#     for n in range(1, 10):
#         print(f"{m} X {n} = {m * n}")
#     print()
정답 보기

  # 1. 3단만 출력하기
  for n in range(1, 10):
      print("3 X", n, "=", 3 * n)

  # 2. 5단부터 7단까지 출력하기
  for m in range(5, 8):
      print(f"=== {m}단 ===")
      for n in range(1, 10):
          print(f"{m} X {n} = {m * n}")
      print()

  # 3. 역순 구구단 (9단부터 2단까지)
  for m in range(9, 1, -1):
      print(f"=== {m}단 ===")
      for n in range(1, 10):
          print(f"{m} X {n} = {m * n}")
      print()
  

3. 반복문 비교 및 선택 가이드 🎯

상황 권장 반복문 이유
반복 횟수를 모를 때 while문 조건에 따라 반복 여부 결정
반복 횟수를 알 때 for문 간결하고 안전한 코드
리스트/문자열 순회 for문 Python의 관용적 표현
사용자 입력 처리 while문 입력 유효성 검사에 적합

반복문 선택 가이드

# while문이 적합한 경우
user_input = ""
while user_input != "quit":
    user_input = input("명령을 입력하세요 (quit로 종료): ")
    print(f"입력한 명령: {user_input}")

# for문이 적합한 경우
fruits = ["사과", "바나나", "오렌지"]
for fruit in fruits:
    print(f"과일: {fruit}")

# range()와 for문이 적합한 경우
for i in range(1, 11):
    print(f"숫자: {i}")

4. 실전 예제 🚀

예제 1: 숫자 맞추기 게임

import random

# 1부터 100까지의 랜덤한 숫자 생성
secret_number = random.randint(1, 100)
attempts = 0

print("1부터 100까지의 숫자를 맞춰보세요!")

while True:
    guess = int(input("숫자를 입력하세요: "))
    attempts += 1
    
    if guess == secret_number:
        print(f"축하합니다! {attempts}번 만에 맞췄습니다!")
        break
    elif guess < secret_number:
        print("더 큰 숫자입니다.")
    else:
        print("더 작은 숫자입니다.")

예제 2: 성적 관리 시스템

# 학생들의 성적 리스트
scores = [85, 92, 78, 96, 88, 73, 91, 87]

# 성적 통계 계산
total = 0
count = 0
high_scores = []

for score in scores:
    total += score
    count += 1
    
    if score >= 90:
        high_scores.append(score)

average = total / count

print(f"총 학생 수: {count}")
print(f"평균 점수: {average:.2f}")
print(f"90점 이상 학생 수: {len(high_scores)}")
print(f"90점 이상 점수들: {high_scores}")

예제 3: 피보나치 수열

# 피보나치 수열의 첫 10개 항 출력
a, b = 0, 1
count = 0

print("피보나치 수열 (첫 10개 항):")

while count < 10:
    print(a, end=" ")
    a, b = b, a + b
    count += 1

print()  # 줄바꿈

5. 주의사항 및 팁 ⚠️

반복문 사용 시 주의사항

  1. 무한 루프 방지: while문에서는 반드시 조건을 변경하는 코드를 포함해야 합니다.
  2. 인덴테이션: 반복문 내부의 코드는 반드시 들여쓰기를 해야 합니다.
  3. 변수 초기화: 반복문에서 사용하는 변수는 적절히 초기화해야 합니다.

성능 최적화 팁

# 비효율적인 코드
numbers = [1, 2, 3, 4, 5]
for i in range(len(numbers)):
    print(numbers[i])

# 효율적인 코드
numbers = [1, 2, 3, 4, 5]
for number in numbers:
    print(number)

디버깅 팁

# 반복문 디버깅을 위한 print문 활용
for i in range(5):
    print(f"반복 {i+1}번째")  # 현재 반복 횟수 확인
    # 실제 작업 코드
    result = i * 2
    print(f"결과: {result}")  # 중간 결과 확인

💡 : 반복문을 사용할 때는 코드의 가독성과 효율성을 고려하여 적절한 반복문을 선택하세요! 복잡한 로직은 작은 단위로 나누어 구현하는 것이 좋습니다! 🎯

6. 연습 문제 🎯

문제 1: 별 찍기 (기초)

다음과 같은 패턴을 출력하는 프로그램을 작성하세요.

*
**
***
****
*****

문제 2: 구구단 표 (중급)

전체 구구단을 표 형태로 예쁘게 출력하는 프로그램을 작성하세요.

문제 3: 소수 찾기 (고급)

1부터 100까지의 소수를 모두 찾아 출력하는 프로그램을 작성하세요.

정답 보기

  # 문제 1: 별 찍기
  for i in range(1, 6):
      print("*" * i)

  # 문제 2: 구구단 표
  for i in range(2, 10):
      print(f"=== {i}단 ===")
      for j in range(1, 10):
          print(f"{i} X {j} = {i*j:2d}")
      print()

  # 문제 3: 소수 찾기
  for num in range(2, 101):
      is_prime = True
      for i in range(2, int(num**0.5) + 1):
          if num % i == 0:
              is_prime = False
              break
      if is_prime:
          print(num, end=" ")
  print()
  

반복문은 프로그래밍의 핵심 개념 중 하나입니다. while문과 for문의 특징을 이해하고 적절히 활용하면, 복잡한 작업도 간단하고 효율적으로 처리할 수 있습니다. 다양한 예제를 통해 연습해보세요! 🚀