4장: for 반복문 — 순서대로 하나씩¶
확정 반복 vs 비확정 반복¶
| while | for | |
|---|---|---|
| 종류 | 비확정 반복 | 확정 반복 |
| 언제 | 조건이 True인 동안 | 시퀀스의 끝까지 |
| 횟수 | 실행 전에 모를 수도 있음 | 시퀀스 길이만큼 정해짐 |
for는 시퀀스(리스트, 문자열, range 등)를 처음부터 끝까지 하나씩 순회합니다.
for 기본 구조¶
for 변수 in 시퀀스:
실행할 코드
for i in [1, 2, 3, 4, 5]:
print(i)
1
2
3
4
5
i에 리스트의 값이 하나씩 들어오면서 반복됩니다.
range() — 숫자 시퀀스 만들기¶
range(stop) # 0부터 stop-1까지
range(start, stop) # start부터 stop-1까지
range(start, stop, step) # start부터 stop-1까지 step 간격
list(range(3)) # [0, 1, 2]
list(range(1, 5)) # [1, 2, 3, 4]
list(range(1, 10, 2)) # [1, 3, 5, 7, 9]
list(range(5, 0, -1)) # [5, 4, 3, 2, 1]
for i in range(5):
print(i, end=" ")
0 1 2 3 4
리스트 (List)¶
리스트는 값을 순서대로 담는 자료형입니다.
animals = ["dog", "cat", "lion", "python", "fox", "wolf"]
print(animals[0]) # dog (첫 번째, 인덱스 0부터 시작)
print(animals[2]) # lion
print(animals[-1]) # wolf (마지막)
for animal in animals:
print("Hello,", animal)
Hello, dog
Hello, cat
Hello, lion
Hello, python
Hello, fox
Hello, wolf
문자열 순회¶
문자열도 시퀀스입니다. 한 글자씩 꺼낼 수 있습니다.
for ch in "PYTHON":
print(ch * 2, end="")
PPYYTTHHOONN
_ — 값을 쓰지 않을 때¶
반복 횟수만 중요하고 변수 값은 필요 없을 때 _를 씁니다.
for _ in range(3):
print("안녕!")
안녕!
안녕!
안녕!
중첩 for 문¶
for 문 안에 for 문을 넣을 수 있습니다.
for i in range(3): # 바깥: 3번
for j in range(4): # 안쪽: 4번
print("*", end="")
print()
****
****
****
바깥 루프가 1번 돌 때, 안쪽 루프는 처음부터 끝까지 다 돕니다.
# 구구단 전체 출력
for i in range(2, 10):
for j in range(1, 10):
print(f"{i} × {j} = {i*j}", end="\t")
print()
break와 continue¶
while과 동일하게 동작합니다.
# break: 조건 만족 시 루프 즉시 종료
for i in range(10):
if i == 5:
break
print(i, end=" ")
0 1 2 3 4
# continue: 이번 회 나머지 건너뛰기
for i in range(10):
if i % 2 == 0:
continue
print(i, end=" ")
1 3 5 7 9
len() — 길이 구하기¶
A = [10, 20, 30, 40, 50]
print(len(A)) # 5
for i in range(len(A)):
print(i, A[i])
0 10
1 20
2 30
3 40
4 50
인덱스와 값을 함께 쓸 때 range(len(A))를 씁니다.
in 연산자 — 포함 여부 확인¶
print(3 in [1, 2, 3, 4, 5]) # True
print(6 in [1, 2, 3, 4, 5]) # False
print("a" in "apple") # True
조건문과 함께 쓰면 편리합니다:
fruits = ["사과", "바나나", "포도"]
target = input("찾을 과일: ")
if target in fruits:
print(target, "있습니다!")
else:
print(target, "없습니다.")
알고리즘 맛보기¶
탐욕 알고리즘 (Greedy) — 거스름돈¶
가장 큰 단위부터 최대한 사용합니다.
amount = int(input("거스름돈(원): "))
coins = [500, 100, 50, 10, 1]
result = []
for coin in coins:
count = amount // coin
amount = amount % coin
result.append((coin, count))
for coin, count in result:
if count > 0:
print(f"{coin}원: {count}개")
거스름돈(원): 1234
500원: 2개
100원: 2개
50원: 0개
10원: 3개
1원: 4개
완전 탐색 (Brute Force)¶
가능한 모든 경우를 시도합니다.
# 두 자리 수 중 자릿수 합이 10인 수 찾기
for n in range(10, 100):
ones = n % 10
tens = n // 10
if ones + tens == 10:
print(n, end=" ")
19 28 37 46 55 64 73 82 91
실습 미션¶
미션 1: 별 피라미드 (for 버전)¶
*
**
***
****
*****
n = 5
for i in range(n):
# 여기에 코드 작성
pass
미션 2: 리스트 최솟값 찾기¶
min()을 쓰지 말고, for 문으로 리스트의 최솟값을 구하세요.
numbers = [34, 7, 23, 32, 5, 62]
# 여기에 코드 작성
# 최솟값: 5
미션 3: FizzBuzz¶
1부터 30까지 숫자를 출력하되: - 3의 배수는 "Fizz" - 5의 배수는 "Buzz" - 15의 배수는 "FizzBuzz"
for i in range(1, 31):
# 여기에 코드 작성
pass
# 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz ...
미션 4: 그리디 - 동전 개수 최소화¶
거스름돈을 동전으로 돌려줄 때 가장 적은 동전 개수를 구하세요.
amount = int(input("금액: "))
coins = [500, 100, 50, 10, 1]
total_count = 0
# 여기에 코드 작성
# 금액: 1730
# 최소 동전 개수: 7개 (500×3, 100×2, 10×3)
미션 5: 완전 탐색 - 암호 해독¶
4자리 PIN (0000~9999) 중에서 자릿수 합이 특정 값인 것을 모두 출력하세요.
target = int(input("자릿수 합: "))
# for 중첩 사용 또는 range(10000) 사용
# 자릿수 합: 5
# 0005 0014 0023 ... 5000
핵심 요약¶
| 개념 | 설명 |
|---|---|
for 변수 in 시퀀스: |
시퀀스를 처음부터 끝까지 하나씩 순회 |
range(n) |
0부터 n-1까지 숫자 시퀀스 |
range(a, b, step) |
a부터 b-1까지 step 간격 |
| 리스트 | [값1, 값2, ...] — 순서가 있는 자료형, 인덱스 0부터 |
| 문자열 순회 | 한 글자씩 꺼낼 수 있음 |
_ |
루프 변수가 필요 없을 때 |
| 중첩 for | for 안에 for — 2차원 반복 |
len() |
시퀀스 길이 |
in |
값이 시퀀스에 있는지 확인 → bool |
break |
루프 즉시 종료 |
continue |
이번 회 건너뛰고 다음으로 |
| 탐욕 알고리즘 | 현재 단계에서 가장 좋은 선택 |
| 완전 탐색 | 가능한 모든 경우 시도 |