반복문
수업 목표
- 반복문의 필요성을 이해하고, 동일한 코드의 반복을
for와while문으로 구조화할 수 있다. range()함수의 3가지 형태(시작, 끝, 간격)를 활용하여 원하는 범위의 횟수 제어 루프를 작성할 수 있다.- 조건 기반 반복인
while문을 설계하고, 무한 루프에 빠지지 않도록 제어 변수를 안전하게 업데이트할 수 있다. break(즉시 탈출)와continue(이번 턴 건너뛰기)의 차이를 이해하고 알고리즘에 적용할 수 있다.- 반복문의 3대 기초 패턴(누적합, 카운팅, 최대·최솟값 탐색)과 2중 반복문을 구현할 수 있다.
생각해보기: 같은 행동을 1,000번 반복해야 한다면?
1부터 1000까지의 숫자를 출력하거나 합계를 구해야 할 때, print() 문을 1000번 복사해 붙여넣는 것은 비효율적입니다. 컴퓨터는 지치지 않고 정확하게 반복 작업을 수행하는 데 가장 특화되어 있습니다. 파이썬에서는 횟수가 정해진 반복(for)과 조건이 만족될 때까지 반복(while)이라는 두 가지 강력한 도구를 제공합니다.
1. for 문과 range() — 정해진 횟수만큼 반복하기
반복 횟수가 명확하거나 특정 수열 범위를 순회할 때는 for 문과 range() 함수를 함께 사용합니다.
# 1부터 5까지 출력 (5회 반복)
for i in range(1, 6):
print(i, end=" ")
# 출력 결과: 1 2 3 4 5
range(시작, 끝, 간격) 함수의 세 가지 호출 형태
| 호출 형태 | 예시 코드 | 생성되는 수열 |
|---|---|---|
range(n) |
range(5) |
0, 1, 2, 3, 4 (0부터 n-1까지 총 n개) |
range(start, end) |
range(2, 6) |
2, 3, 4, 5 (start부터 end-1까지) |
range(start, end, step) |
range(1, 10, 2)range(5, 0, -1) |
1, 3, 5, 7, 9 (2씩 증가)5, 4, 3, 2, 1 (역순 카운트다운) |
2. while 문 — 특정 조건이 참인 동안 반복하기
반복 횟수를 사전에 알 수 없고, 특정 상태나 조건을 달성할 때까지 반복해야 할 때는 while 문을 사용합니다.
# 배터리가 0%가 될 때까지 사용하는 시뮬레이션
battery = 100
while battery > 0:
print(f"현재 배터리: {battery}%")
battery -= 30 # 조건 변수를 반드시 변화시켜야 합니다!
print("배터리가 모두 방전되었습니다.")
무한 루프(Infinite Loop) 주의
while 문의 조건식이 영원히 True로 유지되면 프로그램이 멈추지 않는 무한 루프에 빠져 온라인 저지에서 시간 초과(TLE)를 받게 됩니다. 반드시 루프 본문 안에서 조건 변수가 탈출 방향으로 갱신되도록 설계해야 합니다.
3. break와 continue — 루프 흐름 강제 제어
반복문이 실행되는 도중 특정 조건에서 즉시 루프를 빠져나오거나, 특정 회차를 건너뛰어야 할 때 사용합니다.
| 키워드 | 동작 | 비유 |
|---|---|---|
break |
반복문을 즉시 종료하고 루프 밖으로 탈출 | 비상 정지 버튼을 눌러 공장 가동 중단 |
continue |
아래 코드를 실행하지 않고 다음 회차로 즉시 이동 | 불량품을 발견하고 이번 검사만 건너뜀 |
# break 예제: 0이 입력되면 즉시 종료
while True:
n = int(input())
if n == 0:
print("종료합니다.")
break
print(f"입력값: {n}")
# continue 예제: 3의 배수만 건너뛰고 출력
for i in range(1, 11):
if i % 3 == 0:
continue # 3, 6, 9는 건너뛰고 출력 생략
print(i, end=" ")
# 출력 결과: 1 2 4 5 7 8 10
4. 알고리즘의 3대 기초 패턴
가. 누적합 패턴 (Accumulation)
반복을 돌며 값을 차곡차곡 더하거나 곱해 나가는 패턴입니다. 누적 변수는 반드시 루프 바깥에서 초기화해야 합니다.
# 1부터 N까지의 합 구하기
n = int(input())
total = 0 # 덧셈 누적은 0으로 초기화
for i in range(1, n + 1):
total += i
print(f"1부터 {n}까지의 합: {total}")
나. 카운팅 패턴 (Counting)
데이터 중에서 특정 조건을 만족하는 대상의 개수를 집계하는 패턴입니다.
# 1부터 N까지 중 짝수의 개수 세기
n = int(input())
count = 0 # 카운팅 변수 초기화
for i in range(1, n + 1):
if i % 2 == 0:
count += 1
print(f"짝수의 개수: {count}")
다. 최대·최솟값 탐색 패턴 (Search)
연속된 데이터 중 가장 큰 값이나 가장 작은 값을 찾아내는 패턴입니다. 첫 번째 데이터를 기준점으로 잡는 선취 전략이 가장 안전합니다.
# N개의 정수 중 최댓값 찾기
n = int(input())
first = int(input())
max_val = first # 첫 번째 값을 기준 최댓값으로 설정
for _ in range(n - 1):
num = int(input())
if num > max_val:
max_val = num
print(f"최댓값: {max_val}")
5. 2중 반복문 (Nested Loop) — 루프 속의 루프
반복문 내부에 또 다른 반복문이 위치하는 제어 구조입니다. 바깥쪽 반복문이 1회 돌 때 안쪽 반복문은 전체를 회전합니다. 총 실행 횟수는 (바깥쪽 루프 횟수 × 안쪽 루프 횟수)입니다.
# 2단부터 9단까지 구구단 출력
for dan in range(2, 10): # 바깥 루프: 2 ~ 9단 제어 (8회)
for step in range(1, 10): # 안쪽 루프: 곱해지는 수 1 ~ 9 제어 (9회)
print(f"{dan} x {step} = {dan * step:2d}", end=" ")
print() # 한 단이 끝날 때마다 줄바꿈
모든 순서쌍 조합 탐색 (브루트포스)
두 주사위의 눈의 합처럼 모든 경우의 수를 하나씩 빠짐없이 조사할 때 2중 반복문을 사용합니다.
# 두 주사위의 합이 7이 되는 모든 경우의 수
count = 0
for i in range(1, 7): # 첫 번째 주사위
for j in range(1, 7): # 두 번째 주사위
if i + j == 7:
print(f"({i}, {j})")
count += 1
print(f"총 경우의 수: {count}가지")
자주 하는 실수 & 오류 예방
1. range() 경계 실수 (끝값 미포함)
range(1, 10)은 1부터 10까지가 아니라 1부터 9까지 생성됩니다. 10까지 포함하려면 range(1, 11) 또는 range(1, n + 1)을 선언해야 합니다.
# ❌ 10이 출력되지 않음:
for i in range(1, 10):
print(i)
# ✅ 1부터 10까지 정상 출력:
for i in range(1, 11):
print(i)
2. while 문 조건 변수 업데이트 누락
while count < 5: 루프 내부에서 count += 1과 같은 갱신 코드를 빼먹으면 조건이 영원히 참으로 남아 무한 루프(TLE)가 발생합니다.
# ❌ 무한 루프 발생
count = 0
while count < 5:
print(count) # count가 증가하지 않음!
# ✅ 정상 탈출
count = 0
while count < 5:
print(count)
count += 1
3. 누적 변수를 루프 내부에서 초기화하는 실수
total = 0을 for문 안쪽에 작성하면 매 회차마다 변수가 0으로 리셋되어 이전 합산 결과가 모두 사라집니다. 누적 변수는 반드시 루프 바깥에 선언해야 합니다.
4. 2중 루프에서 동일한 변수명 사용
바깥쪽 루프와 안쪽 루프에 둘 다 for i in ...: 처럼 같은 변수명을 사용하면, 안쪽 루프가 바깥 루프의 제어 변수 값을 덮어써서 의도치 않은 조기 종료나 무한 루프가 발생합니다. 반드시 i와 j, dan과 step처럼 서로 다른 변수명을 지정해야 합니다.
핵심 정리
| 체크 항목 | 작성 수칙 및 가이드라인 |
|---|---|
for + range() |
정해진 횟수나 수열을 순회할 때 사용 (끝값 미포함 주의) |
while 문 |
조건 만족 시까지 반복 (루프 내부에서 제어 변수 갱신 필수) |
break / continue |
루프 즉시 탈출 vs 남은 코드 건너뛰고 다음 턴 진행 |
| 누적합 / 카운팅 | 결과 변수(total, count)를 반드시 루프 바깥에서 초기화 |
| 2중 반복문 | 바깥 루프와 안쪽 루프의 변수명을 반드시 다르게 지정 |
이번 주 대회 바로가기
1반 | 2반 | 3반 | 4반 | 5반 | 6반 | 7반 | 8반 | 9반
※ 대회 링크는 선생님이 별도 공지합니다.