파이썬 교육 챕터 23 중첩 반복문

중첩 반복문(Nested Loop): 반복문 안에 반복문

1. 서론: 복잡한 패턴과 다차원 데이터의 처리

이전 챕터에서 우리는 for 문과 while 문을 사용하여 코드를 반복 실행하는 방법과 break, continue를 통해 반복의 흐름을 제어하는 방법을 배웠습니다. 이 기본적인 반복문들은 대부분의 반복 작업을 처리할 수 있지만, 때로는 하나의 반복문만으로는 해결하기 어려운 복잡한 상황에 직면하게 됩니다. 예를 들어, 2차원 배열(행렬)의 모든 요소를 순회하거나, 구구단처럼 특정 패턴을 가진 데이터를 생성하거나, 게임에서 격자 형태의 맵을 처리해야 할 때가 그렇습니다. 이때 필요한 것이 바로 ‘중첩 반복문(Nested Loop)’입니다. 중첩 반복문은 하나의 반복문 안에 또 다른 반복문이 포함된 형태로, 바깥쪽 반복문이 한 번 실행될 때마다 안쪽 반복문이 완전히 실행되는 방식으로 동작합니다. 이 챕터에서는 중첩 반복문의 기본 구조와 동작 원리, 그리고 다양한 활용 예시에 대해 깊이 있게 알아보겠습니다. 중첩 반복문을 마스터하는 것은 여러분의 파이썬 프로그램이 복잡한 패턴과 다차원 데이터를 효율적으로 처리할 수 있는 능력을 부여하는 핵심적인 단계가 될 것입니다.

2. 중첩 반복문의 기본 구조와 동작 원리

중첩 반복문은 말 그대로 반복문 안에 반복문이 들어있는 형태입니다. 가장 일반적인 형태는 for 문 안에 for 문이 들어가는 경우입니다.

for 바깥쪽_변수 in 바깥쪽_반복_가능한_객체:
    # 바깥쪽 반복문 코드 블록
    for 안쪽_변수 in 안쪽_반복_가능한_객체:
        # 안쪽 반복문 코드 블록
        # (바깥쪽 반복문이 한 번 실행될 때마다 안쪽 반복문은 완전히 실행됩니다)
    # 바깥쪽 반복문 코드 블록 (안쪽 반복문 종료 후 실행)

동작 원리:

  1. 바깥쪽 반복문이 시작됩니다.
  2. 바깥쪽 반복문이 첫 번째 요소를 가져와 처리합니다.
  3. 안쪽 반복문이 시작됩니다.
  4. 안쪽 반복문은 자신의 모든 요소를 순회하며 완전히 실행됩니다.
  5. 안쪽 반복문이 종료되면, 바깥쪽 반복문은 다음 요소를 가져와 처리합니다.
  6. 다시 안쪽 반복문이 시작되어 완전히 실행됩니다.
  7. 이 과정은 바깥쪽 반복문의 모든 요소가 처리될 때까지 반복됩니다.

예시:

# 중첩 for 문 예시
for i in range(1, 3): # 바깥쪽 루프: i는 1, 2
    print(f"바깥쪽 루프: i = {i}")
    for j in range(1, 4): # 안쪽 루프: j는 1, 2, 3
        print(f"  안쪽 루프: j = {j}")

# 출력:
# 바깥쪽 루프: i = 1
#   안쪽 루프: j = 1
#   안쪽 루프: j = 2
#   안쪽 루프: j = 3
# 바깥쪽 루프: i = 2
#   안쪽 루프: j = 1
#   안쪽 루프: j = 2
#   안쪽 루프: j = 3

위 예시에서 바깥쪽 루프가 두 번 반복되고, 바깥쪽 루프가 한 번 반복될 때마다 안쪽 루프는 세 번 반복됩니다. 따라서 안쪽 루프의 print() 문은 총 2 * 3 = 6번 실행됩니다.

3. 중첩 반복문 활용 예시

중첩 반복문은 다양한 상황에서 복잡한 패턴을 생성하거나 다차원 데이터를 처리하는 데 유용하게 사용됩니다.

3.1. 구구단 출력하기

range() 함수 챕터에서 간단히 다루었지만, 중첩 반복문의 대표적인 예시입니다.

print("--- 구구단 ---")
for dan in range(2, 10): # 2단부터 9단까지
    print(f"\n--- {dan}단 ---")
    for num in range(1, 10): # 1부터 9까지 곱하기
        print(f"{dan} x {num} = {dan * num}")

3.2. 2차원 리스트(행렬) 순회

2차원 리스트는 리스트 안에 리스트가 있는 형태로, 행과 열로 구성된 데이터를 표현할 때 사용됩니다. 중첩 반복문을 사용하여 모든 요소에 접근할 수 있습니다.

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

print("--- 행렬 요소 출력 ---")
for row in matrix: # 각 행(리스트)을 가져옵니다.
    for element in row: # 각 행의 요소들을 가져옵니다.
        print(element, end=" ")
    print() # 한 행의 출력이 끝나면 줄 바꿈

# 출력:
# --- 행렬 요소 출력 ---
# 1 2 3 
# 4 5 6 
# 7 8 9 

3.3. 별 찍기 패턴 (피라미드)

중첩 반복문은 다양한 패턴을 출력하는 데 자주 사용됩니다.

# 정삼각형 별 찍기
for i in range(1, 6): # 1부터 5까지 (줄 수)
    for j in range(i): # 현재 줄 수만큼 별 출력
        print("*", end="")
    print() # 줄 바꿈

# 출력:
# *
# **
# ***
# ****
# *****

3.4. 중첩 while

while 문도 중첩하여 사용할 수 있습니다. for 문과 마찬가지로 안쪽 while 문이 완전히 실행된 후에 바깥쪽 while 문이 다음 반복으로 넘어갑니다.

i = 0
while i < 3:
    j = 0
    while j < 2:
        print(f"i={i}, j={j}")
        j += 1
    i += 1

# 출력:
# i=0, j=0
# i=0, j=1
# i=1, j=0
# i=1, j=1
# i=2, j=0
# i=2, j=1

4. 중첩 반복문과 break, continue

breakcontinue 문은 중첩 반복문에서도 사용할 수 있지만, 주의할 점이 있습니다. 이들은 자신이 속한 가장 안쪽의 반복문에만 영향을 미칩니다.

4.1. 중첩 반복문에서 break

break는 자신이 속한 안쪽 반복문만 종료하고, 바깥쪽 반복문은 계속 실행됩니다.

for i in range(1, 4):
    for j in range(1, 4):
        if j == 2:
            print(f"안쪽 루프에서 break! (i={i}, j={j})")
            break # 안쪽 for 루프만 종료
        print(f"i={i}, j={j}")
    print(f"바깥쪽 루프 계속 진행 중: i={i}")

# 출력:
# i=1, j=1
# 안쪽 루프에서 break! (i=1, j=2)
# 바깥쪽 루프 계속 진행 중: i=1
# i=2, j=1
# 안쪽 루프에서 break! (i=2, j=2)
# 바깥쪽 루프 계속 진행 중: i=2
# i=3, j=1
# 안쪽 루프에서 break! (i=3, j=2)
# 바깥쪽 루프 계속 진행 중: i=3

만약 안쪽 루프에서 break가 발생했을 때 바깥쪽 루프까지 종료하고 싶다면, 추가적인 플래그 변수를 사용하거나 함수를 이용하는 등의 방법을 고려해야 합니다.

4.2. 중첩 반복문에서 continue

continue는 자신이 속한 안쪽 반복문의 현재 반복만 건너뛰고, 안쪽 반복문의 다음 반복으로 넘어갑니다.

for i in range(1, 4):
    for j in range(1, 4):
        if j == 2:
            print(f"안쪽 루프에서 continue! (i={i}, j={j})")
            continue # 안쪽 for 루프의 현재 반복만 건너뛰고 다음 j로
        print(f"i={i}, j={j}")

# 출력:
# i=1, j=1
# 안쪽 루프에서 continue! (i=1, j=2)
# i=1, j=3
# i=2, j=1
# 안쪽 루프에서 continue! (i=2, j=2)
# i=2, j=3
# i=3, j=1
# 안쪽 루프에서 continue! (i=3, j=2)
# i=3, j=3

5. 결론: 복잡한 문제 해결의 열쇠, 중첩 반복문

이 챕터를 통해 여러분은 파이썬 중첩 반복문의 기본 구조와 동작 원리, 그리고 다양한 활용 예시에 대해 깊이 있게 학습했습니다. 하나의 반복문 안에 또 다른 반복문이 포함된 형태로, 바깥쪽 반복문이 한 번 실행될 때마다 안쪽 반복문이 완전히 실행되는 방식을 이해했습니다. 구구단 출력, 2차원 리스트 순회, 별 찍기 패턴 등 다양한 예제를 통해 중첩 반복문의 강력함을 경험했습니다. 또한, 중첩 반복문에서 breakcontinue가 어떻게 동작하는지, 그리고 그 주의사항까지 살펴보았습니다.

중첩 반복문은 복잡한 패턴을 생성하거나, 행렬과 같은 다차원 데이터를 처리하거나, 게임 맵을 구현하는 등 다양한 실제 프로그래밍 문제에서 필수적으로 사용되는 기술입니다. 처음에는 다소 복잡하게 느껴질 수 있지만, 충분한 연습을 통해 그 논리적 흐름에 익숙해지는 것이 중요합니다.

이제 여러분은 파이썬의 핵심적인 제어문인 조건문과 반복문을 자유자재로 다룰 수 있게 되었습니다. 다음 챕터부터는 파이썬의 핵심 자료 구조인 ‘리스트(List)’에 대해 본격적으로 학습할 것입니다. 리스트는 여러 개의 데이터를 순서대로 저장하고 관리하는 데 사용되는 매우 강력하고 유연한 자료형이므로, 오늘 배운 중첩 반복문을 활용하여 다양한 패턴을 직접 구현해 보면서, 여러분의 파이썬 실력을 더욱 단단하게 다지세요!

파이썬 교육 챕터 23 중첩 반복문