본문 바로가기
Python

10. 중첩 반복문 - 별 찍기로 연습하기

by 샤나엘 2026. 2. 21.
반응형

중첩 반복문

10. 중첩 반복문 - 별 찍기로 연습하기

반복문 안에 반복문을 넣으면 어떤 일이 벌어질까? 이중 for문은 처음엔 헷갈리지만, 별 찍기 패턴으로 연습하면 금방 감이 온다. 구구단, 2차원 탐색까지 한번에 정복하자.


중첩 반복문이란?

반복문 안에 또 다른 반복문을 넣는 것이다. 바깥 반복문이 1번 실행될 때마다, 안쪽 반복문이 전체 반복된다.

for i in range(3):        # 바깥: 0, 1, 2
    for j in range(4):    # 안쪽: 0, 1, 2, 3
        print(f"({i},{j})", end=" ")
    print()   # 줄바꿈

출력:

(0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)

 

중첩 반복문의 실행 흐름

 

바깥 i가 0일 때 안쪽 j가 0

3까지 전부 실행된다. 그 다음 i가 1이 되면 다시 j가 0

3. 총 3 × 4 = 12번 실행된다.

💡 핵심: 바깥 반복 횟수 × 안쪽 반복 횟수 = 총 실행 횟수


별 찍기 - 기본 패턴

별 찍기는 중첩 반복문을 이해하는 최고의 연습이다. 바깥 for는 줄(행), 안쪽 for는 칸(열)을 담당한다.

패턴 1: 직각삼각형 (왼쪽 정렬)

for i in range(1, 6):
    for j in range(i):
        print("★", end="")
    print()
★
★★
★★★
★★★★
★★★★★

i=1일 때 별 1개, i=2일 때 별 2개, ... i=5일 때 별 5개.

패턴 2: 직각삼각형 (역순)

for i in range(5, 0, -1):
    for j in range(i):
        print("★", end="")
    print()
★★★★★
★★★★
★★★
★★
★

패턴 3: 직각삼각형 (오른쪽 정렬)

for i in range(1, 6):
    print(" " * (5 - i), end="")   # 공백 먼저
    for j in range(i):
        print("★", end="")
    print()
    ★
   ★★
  ★★★
 ★★★★
★★★★★

핵심: 공백의 개수를 잘 계산하는 것이 포인트다. i=1일 때 공백 4개, i=2일 때 공백 3개, ... 공백은 5 - i개.

패턴 4: 피라미드

for i in range(1, 6):
    print(" " * (5 - i), end="")
    print("★" * (2 * i - 1))
    ★
   ★★★
  ★★★★★
 ★★★★★★★
★★★★★★★★★

💡 팁: 별 찍기 문제를 풀 때는 각 줄에 공백 몇 개, 별 몇 개가 필요한지 표로 정리해보면 쉽다.

줄 (i) 공백 공식
1 4 1 공백: 5-i, 별: 2*i-1
2 3 3  
3 2 5  
4 1 7  
5 0 9  

구구단 출력

중첩 반복문의 대표적인 활용이다.

for dan in range(2, 10):
    print(f"--- {dan}단 ---")
    for i in range(1, 10):
        print(f"{dan} x {i} = {dan * i}")
    print()

가로 형태 구구단

for i in range(1, 10):
    for dan in range(2, 10):
        print(f"{dan}x{i}={dan*i:2d}", end="  ")
    print()
2x1= 2  3x1= 3  4x1= 4  5x1= 5  6x1= 6  7x1= 7  8x1= 8  9x1= 9
2x2= 4  3x2= 6  4x2= 8  5x2=10  6x2=12  7x2=14  8x2=16  9x2=18
...
2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81

💡 {dan*i:2d}에서 :2d2칸 너비로 정수를 맞추라는 뜻이다. 한 자리 수와 두 자리 수가 정렬된다.


2차원 탐색

2차원 데이터(표, 격자 등)를 처리할 때도 이중 반복문이 필요하다.

좌석 배치도

rows = ["A", "B", "C", "D"]
cols = 6

print("    ", end="")
for c in range(1, cols + 1):
    print(f" {c} ", end="")
print()
print("   " + "---" * cols)

for row in rows:
    print(f" {row} |", end="")
    for col in range(1, cols + 1):
        print(" O ", end="")
    print()
     1  2  3  4  5  6
   ------------------
 A | O  O  O  O  O  O
 B | O  O  O  O  O  O
 C | O  O  O  O  O  O
 D | O  O  O  O  O  O

리스트 안의 리스트 (2차원 리스트)

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

for row in matrix:
    for num in row:
        print(f"{num:3d}", end="")
    print()
  1  2  3
  4  5  6
  7  8  9

💡 2차원 리스트는 12편(리스트)에서 더 자세히 다룬다. 지금은 "이중 for문으로 행렬을 순회한다"는 것만 알아두자.


중첩 반복문 + break

중첩 반복문에서 break를 쓰면 가장 가까운(안쪽) 반복문만 중단된다.

for i in range(3):
    for j in range(5):
        if j == 3:
            break          # 안쪽 for만 중단
        print(f"({i},{j})", end=" ")
    print()    # 바깥 for는 계속 실행
(0,0) (0,1) (0,2)
(1,0) (1,1) (1,2)
(2,0) (2,1) (2,2)

바깥 반복문까지 한 번에 끝내고 싶다면? 플래그 변수를 사용한다.

found = False

for i in range(5):
    for j in range(5):
        if i * j == 12:
            print(f"찾았다! i={i}, j={j}")
            found = True
            break
    if found:
        break

실전 예시: 다이아몬드 패턴

n = 5

# 윗부분
for i in range(1, n + 1):
    print(" " * (n - i) + "★" * (2 * i - 1))

# 아랫부분
for i in range(n - 1, 0, -1):
    print(" " * (n - i) + "★" * (2 * i - 1))
    ★
   ★★★
  ★★★★★
 ★★★★★★★
★★★★★★★★★
 ★★★★★★★
  ★★★★★
   ★★★
    ★

직접 해보기

문제 1. 다음 패턴을 출력해보자.

12345
1234
123
12
1

문제 2. 구구단 중 결과가 짝수인 것만 출력해보자. (2~9단)

2 x 1 = 2
2 x 2 = 4
...

문제 3. 다음 숫자 피라미드를 출력해보자.

    1
   121
  12321
 1234321
123454321

문제 4. 5x5 격자에서 대각선(i==j)만 로 출력하고 나머지는 ·로 출력해보자.

★ · · · ·
· ★ · · ·
· · ★ · ·
· · · ★ ·
· · · · ★
정답 보기
# 문제 1
for i in range(5, 0, -1):
    for j in range(1, i + 1):
        print(j, end="")
    print()
‍
# 문제 2
for dan in range(2, 10):
    for i in range(1, 10):
        result = dan * i
        if result % 2 == 0:
            print(f"{dan} x {i} = {result}")
‍
# 문제 3
n = 5
for i in range(1, n + 1):
    print(" " * (n - i), end="")
    # 올라가는 부분
    for j in range(1, i + 1):
        print(j, end="")
    # 내려가는 부분
    for j in range(i - 1, 0, -1):
        print(j, end="")
    print()
‍
# 문제 4
for i in range(5):
    for j in range(5):
        if i == j:
            print("★", end=" ")
        else:
            print("·", end=" ")
    print()

오늘의 정리

항목 내용
중첩 반복문 반복문 안에 반복문. 바깥 1회 = 안쪽 전체 실행
총 실행 횟수 바깥 횟수 × 안쪽 횟수
별 찍기 핵심 바깥 for = 줄(행), 안쪽 for = 칸(열). 공백·별 개수를 표로 정리
break 주의 가장 가까운 반복문만 중단. 바깥까지 끝내려면 플래그 변수
활용 구구단, 좌석 배치, 2차원 리스트 순회, 패턴 출력

다음 편 예고: 실습 - 숫자 맞추기 게임 만들기

조건문과 반복문을 모두 배웠으니, 이제 이것들을 합쳐서 진짜 동작하는 게임을 만들어보자! random 모듈도 함께 소개한다.


태그: 파이썬 Python 파이썬독학 중첩반복문 이중for문 별찍기 구구단 패턴출력 파이썬기초 IT교육

반응형

댓글