콘텐츠로 이동

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 이번 회 건너뛰고 다음으로
탐욕 알고리즘 현재 단계에서 가장 좋은 선택
완전 탐색 가능한 모든 경우 시도