GDGoC/Python

[Python] Basic #05: 반복문 심화

Opal1031 2026. 8. 12. 17:07

Python의 반복문을 조금 더 다양하게 활용하는 방법을 다룹니다.

 

기본적인 for, while 사용법에서 한 단계 더 나아가 중첩 반복문, enumerate(), zip(), break, continue 등을 함께 살펴보겠습니다.

 

반복문 문제에서는 단순히 코드를 여러 번 실행하는 것보다, 무엇을 반복하고 언제 멈출지를 먼저 정하는 것이 중요합니다.


1. 중첩 반복문

반복문 안에 또 다른 반복문을 작성할 수 있습니다.

 

바깥 반복문이 한 번 실행될 때마다 안쪽 반복문은 처음부터 끝까지 실행됩니다.

for i in range(3):
    for j in range(2):
        print(i, j)

 

실행 결과는 다음과 같습니다.

0 0
0 1
1 0
1 1
2 0
2 1

 

중첩 반복문은 표, 행렬, 좌표처럼 두 개 이상의 기준을 함께 순회할 때 자주 사용합니다.

board = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

for row in board:
    for value in row:
        print(value, end = " ")

    print()

 

바깥 반복문은 각 행을, 안쪽 반복문은 행 안의 값을 순회합니다.


2. enumerate() 활용

리스트나 문자열을 순회할 때 값과 인덱스가 모두 필요할 수 있습니다.

 

이때 range(len(...))를 사용할 수도 있지만, enumerate()를 사용하면 더 간결하게 작성할 수 있습니다.

fruits = ["apple", "banana", "orange"]

for index, fruit in enumerate(fruits):
    print(index, fruit)
0 apple
1 banana
2 orange

 

시작 인덱스를 바꾸고 싶다면 start 값을 지정할 수 있습니다.

for index, fruit in enumerate(fruits, start = 1):
    print(index, fruit)
1 apple
2 banana
3 orange
  • 단순히 값만 필요하다면 일반 for문을 사용하고, 값의 위치도 필요하다면 enumerate()를 사용하는 것이 좋습니다.

3. zip() 활용

zip()은 여러 개의 리스트를 같은 위치끼리 묶어 순회할 때 사용합니다.

names = ["Alice", "Bob", "Charlie"]
scores = [90, 75, 85]

for name, score in zip(names, scores):
    print(name, score)
Alice 90
Bob 75
Charlie 85

 

두 리스트를 이용해 딕셔너리를 만들 수도 있습니다.

score_dict = dict(zip(names, scores))

print(score_dict)
# {'Alice': 90, 'Bob': 75, 'Charlie': 85}

 

zip()은 길이가 가장 짧은 데이터에 맞춰 반복을 종료합니다.

nums = [1, 2, 3]
chars = ["A", "B"]

for num, char in zip(nums, chars):
    print(num, char)
  • 위 코드는 두 번만 반복됩니다.

4. break와 continue

break

break는 반복문을 즉시 종료합니다.

numbers = [3, 7, 12, 5, 9]

for number in numbers:
    if (number % 2 == 0):
        print("첫 번째 짝수:", number)
        break
  • 짝수 12를 찾은 뒤에는 더 이상 반복할 필요가 없으므로 반복문을 종료합니다.

 

continue

continue는 현재 반복만 건너뛰고 다음 반복으로 이동합니다.

for number in range(1, 11):
    if (number % 2 == 0):
        continue

    print(number)
  • 위 코드는 짝수일 때 출력을 건너뛰므로 홀수만 출력합니다.

 

break는 반복문 전체를 끝내고, continue는 현재 차례만 건너뛴다는 차이가 있습니다.


5. 반복문의 else

Python에서는 if문뿐 아니라 for, while 반복문에도 else를 사용할 수 있습니다.

 

반복문이 break 없이 정상적으로 끝났을 때 else가 실행됩니다.

numbers = [1, 3, 5, 7]
target = 4

for number in numbers:
    if (number == target):
        print("찾았습니다.")
        break

else:
    print("찾지 못했습니다.")
  • target을 발견하면 break가 실행되므로 else는 실행되지 않습니다.
  • 값을 찾지 못하고 반복문이 끝나면 else가 실행됩니다.

6. while문 활용

반복 횟수가 정해져 있지 않고 특정 조건을 만족할 때까지 반복해야 한다면 while문이 적합합니다.

number = 12345
digit_sum = 0

while (number > 0):
    digit_sum += number % 10
    number //= 10

print(digit_sum)  # 15
  • 매 반복마다 마지막 자릿수를 더하고, 마지막 자릿수를 제거합니다.

 

입력값이 특정 값일 때 종료하는 구조에도 사용할 수 있습니다.

while True:
    command = input().strip()

    if (command == "exit"):
        break

    print("입력:", command)
  • while True를 사용할 때는 반복을 종료할 break 조건이 있는지 반드시 확인해야 합니다.

7. 종합 예제

학생별 점수 목록에서 80점 이상인 과목의 개수와 평균을 구해보겠습니다.

students = [
    ("Alice", [90, 70, 85]),
    ("Bob", [60, 75, 80]),
    ("Charlie", [95, 100, 90])
]

for name, scores in students:
    total = 0
    count = 0

    for score in scores:
        if (score < 80):
            continue

        total += score
        count += 1

    if (count == 0):
        print(name, "해당 점수 없음")

    else:
        print(name, total / count)

이 예제에서는 다음 내용을 함께 사용했습니다.

  • 튜플 언패킹으로 이름과 점수 목록 분리
  • 중첩 반복문으로 학생별 점수 순회
  • continue로 80점 미만의 점수 제외
  • 조건에 맞는 값의 합과 개수 누적

8. 자주 하는 실수/주의점

  • 중첩 반복문에서는 들여쓰기 위치에 따라 실행 결과가 크게 달라집니다.
  • break는 자신이 포함된 가장 가까운 반복문 하나만 종료합니다.
  • continue 아래에 작성한 코드는 해당 반복에서 실행되지 않습니다.
  • 반복 중에 리스트의 요소를 직접 삭제하면 일부 값을 건너뛸 수 있습니다.
  • while문의 조건이 계속 참이면 무한 반복이 발생할 수 있습니다.
  • 값만 필요할 때 불필요하게 range(len(list))를 사용하지 않아도 됩니다.

9. 종합 요약

  • 중첩 반복문: 행렬이나 두 가지 기준을 함께 순회
  • enumerate(): 인덱스와 값을 동시에 사용
  • zip(): 여러 데이터의 같은 위치를 함께 순회
  • break: 반복문 즉시 종료
  • continue: 현재 반복을 건너뛰고 다음 반복으로 이동
  • 반복문의 else: break 없이 반복을 마쳤을 때 실행
  • while: 반복 횟수보다 종료 조건이 중요한 경우 사용