본문 바로가기
Language/Python

[고등학생부터, 파이썬] 09. 중첩 반복문 (feat. 별찍기 예제)

by kellis 2026. 8. 19.
반응형
고등학생부터, 파이썬 · 9화

중첩 반복문과 별 찍기 — 반복문 안의 반복문

반복문 안에 또 다른 반복문을 넣는 중첩 반복문을 배웁니다.

행과 열로 이루어진 표구조(2차원 구조) 를 순회하는 원리를 이해하고, 이 원리를 그대로 활용해 다양한 모양의 별을 출력해봐요.

이 시리즈를 시작하며

요즘은 고등학교에서도 코딩을 정규 과목으로 가르치는 시대입니다. 전공자가 아니어도 바이브 코딩(Vibe Coding)이나 생성형 AI(Generative AI)를 활용하면 누구나 그럴듯한 코드 결과물을 만들어낼 수 있게 되었죠. 

개발 언어를 접하는, 전공자가 아닌 일반인 입문자가 많아진 것입니다.

이 시리즈는 글쓴이가 실제로 일반인, 고등학생 등 비전공자·입문자에게 파이썬을 가르치면서 정리한 내용들을 교재 형식으로 엮은 글입니다.최대한 쉽고 친절하게 설명하면서도, 컴퓨터와 프로그래밍 언어에 대한 기초 이론까지 함께 짚고 넘어가려 합니다.

 

고등학생, 비전공자, 완전 입문자도 따라올 수 있게끔 만든 시리즈이고, 실제 과외 수업 자료를 바탕으로 만들어서 학교 시험처럼 개념 확인 문제도 그대로 들어있어요.

중간중간 빈칸 채우기학교 시험 유형 문제가 나오는데, 정답은 바로 안 보이게 접어뒀습니다. 먼저 스스로 생각해본 다음 "보기"를 눌러서 확인해보세요.

 

Chapter 21
중첩 반복문 (Nested Loop)

중첩(Nested)이란 하나의 반복문 안에 또 다른 반복문이 들어있는 것을 말합니다.

학교에 1학년~3학년이 있고, 각 학년마다 1반~3반이 있다고 생각해봅시다. 학년이 하나 바뀔 때마다 반은 다시 처음(1반)부터 시작하죠. 이것이 중첩 반복문의 핵심입니다.

기본 문법
python
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
실행 순서

처음엔 i = 0입니다. 그러면 안쪽 반복문이 j = 0부터 j = 1까지 전부 실행된 뒤에야, 바깥쪽이 i = 1로 넘어갑니다. 그리고 안쪽 반복문은 다시 j = 0부터 시작해요. 즉 바깥쪽이 한 번 움직일 때마다 안쪽은 처음부터 끝까지 전부 실행됩니다.

중첩 for문 = 행과 열로 이루어진 구조

중첩 for문에서 바깥쪽 반복문은 행(row), 안쪽 반복문은 열(column)에 해당합니다. 이렇게 행과 열로 이루어진 구조를 2차원 배열(2D array) 또는 행렬(Matrix)이라고 불러요. 나중에 배울 "리스트 안에 리스트" 구조도 결국 이 중첩 반복문으로 순회하게 됩니다.

i \ j 0열 1열 2열
0행 (0,0) (0,1) (0,2)
1행 (1,0) (1,1) (1,2)
2행 (2,0) (2,1) (2,2)
예제 · 별 3개씩 3줄 출력
python
for i in range(3):
    for j in range(3):
        print("*", end="")
    print()
실행 결과
***
***
***
end="" 란?

기본적으로 print()는 내용을 출력한 후 줄바꿈을 수행합니다. 하지만 print("*", end="")처럼 쓰면 줄을 바꾸지 않고 한 줄에 이어서 출력해요. 그 뒤에 print()만 단독으로 쓰면 그때 비로소 다음 줄로 이동합니다. 줄바꿈용 print()는 반드시 바깥 for문 안, 안쪽 for문 밖에 두어야 해요.

예제 · 구구단 2단부터 3단까지
python
for dan in range(2, 4):
    print("======", dan, "단 ======")
    for num in range(1, 10):
        print(dan, "x", num, "=", dan * num)
    print()
실행 결과
====== 2 단 ======
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18

====== 3 단 ======
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27

바깥 반복문(dan)은 몇 단인지 결정하고, 안쪽 반복문(num)은 그 단의 1~9까지 계산을 담당합니다. 이렇게 range(2, 10)으로 범위를 늘리면 2단부터 9단까지 똑같은 방식으로 이어집니다.

예제 · 영화관 좌석 (행, 열)
python
rows = ["A", "B", "C"]

for row in rows:
    for seat in range(1, 5):
        print(row + str(seat), end=" ")
    print()
실행 결과
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4

row(행)가 바깥, seat(열)이 안쪽인 전형적인 2차원 좌석 배치예요.

["A", "B", "C"]처럼 대괄호로 값을 묶어놓은 것을 리스트(list)라고 하는데, for row in rows:는 리스트 안의 값을 앞에서부터 하나씩 꺼내 씁니다. 리스트는 다음 화에서 자세히 배워요.

row + str(seat)는 + 기호를 이용하여 문자열끼리 이어 붙여줄 텐데, seat는 숫자이므로 str()로 먼저 문자열로 바꿔줘야 합니다.

자주 하는 실수 · 바깥과 안쪽 변수 이름을 같게 쓰는 경우

중첩 반복문에서는 바깥과 안쪽 변수 이름을 다르게 지어야 헷갈리지 않습니다. 보통 i, j처럼 짝을 지어 사용해요.

빈칸 채우기
  1. 다음 코드가 각 줄에 "***"를 출력하도록 빈칸을 채우시오.
    python
    for i in range(2):
        for j in range(3):
            print("*", )
        print()
정답
end="" — end=""가 있어야 별이 줄바꿈 없이 한 줄로 이어서 출력됩니다.
학교 시험 유형
  1. 다음 코드의 실행 결과를 작성하시오.
    python
    for i in range(2):
        for j in range(2):
            print(i, j)
  2. 중첩 반복문에서 바깥 반복문과 안쪽 반복문의 관계를 서술하시오.
정답
1. 0 0
0 1
1 0
1 1

2. 바깥 반복문이 한 번 움직일 때마다, 안쪽 반복문은 처음부터 끝까지 전부 실행됩니다.

 

Chapter 22
중첩 반복문 응용 · 별 찍기

별 찍기는 반복문의 실행 순서를 연습하기 위한 가장 좋은 예제입니다.

실제로 별을 출력하는 게 목적이 아니라, 반복문이 어떻게 동작하는지 이해하는 것이 목적이에요.

벽돌을 한 줄에 5개씩 3줄 쌓는다고 생각해봅시다. 바깥 반복문은 줄(행), 안쪽 반복문은 그 줄에 놓일 별(열)을 담당합니다.

예제 · 별 5개를 3줄 출력하기
python
for i in range(3):
    for j in range(5):
        print("*", end="")
    print()
실행 결과
*****
*****
*****
예제 · 별이 한 개씩 늘어나기
python
for i in range(1, 6):
    for j in range(i):
        print("*", end="")
    print()
실행 결과
*
**
***
****
*****
핵심 · range()에 숫자 대신 변수 i를 넣기

i=1일 때 별 1개, i=2일 때 별 2개... 이렇게 안쪽 반복문의 반복 횟수가 바깥 반복문의 값(i)에 따라 달라집니다. range()의 숫자로 직접 상수를 쓰는 대신 바깥 변수 i를 넣은 것이 핵심이에요.

예제 · 별이 한 개씩 줄어들기 / 숫자 삼각형
python
for i in range(5, 0, -1):
    for j in range(i):
        print("*", end="")
    print()
실행 결과
*****
****
***
**
*
python
자주 하는 실수

end="" 없이 안쪽에서 print("*")만 쓰면 별이 한 줄에 하나씩, 세로로 출력됩니다. 그리고 range(i)range(i+1)은 결과가 다르니, 몇 번째 줄까지 포함해야 하는지 항상 확인해야 해요.

 

지금까지 배운 중첩 반복문을 조금 더 실전처럼 응용해볼게요. 예전에 배운 구구단은 한 단씩 세로로 출력했는데, 이번엔 2단부터 9단까지를 가로로 나란히, 표처럼 정리해서 출력해봅시다.

처음 보는 기능 두 가지

"\t" — 탭(tab) 문자입니다. 스페이스바4개에 해당하고 키보드 Tab키를 눌렀을때 동작과 동일해요. 넓은 공백을 넣어주는 역할입니다. 

sep="" — print()에서 ,를 이용해서 여러 개의 값을 넣으면 기본적으로 그 값들 사이 사이마다 공백이 하나씩 들어갑니다(sep=" "가 기본값). sep=""를 쓰면 그 공백을 없애서 값들을 딱 붙여 출력해요. 예를 들어 print(2, "x", 1, sep="")2x1을 출력합니다.

실전 응용 · 구구단 가로로 출력하기
python
print("\t", end="")
for dan in range(2, 10):
    print(dan, "단", end="\t")
print()

for num in range(1, 10):
    print(num, end="\t")
    for dan in range(2, 10):
        print(dan, "x", num, end="=", sep="")
        print(dan * num, end="\t")
    print()
실행 결과
2 단 3 단 4 단 5 단 6 단 7 단 8 단 9 단
1 2x1=2 3x1=3 4x1=4 5x1=5 6x1=6 7x1=7 8x1=8 9x1=9
2 2x2=4 3x2=6 4x2=8 5x2=10 6x2=12 7x2=14 8x2=16 9x2=18
3 2x3=6 3x3=9 4x3=12 5x3=15 6x3=18 7x3=21 8x3=24 9x3=27
4 2x4=8 3x4=12 4x4=16 5x4=20 6x4=24 7x4=28 8x4=32 9x4=36
5 2x5=10 3x5=15 4x5=20 5x5=25 6x5=30 7x5=35 8x5=40 9x5=45
6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 7x6=42 8x6=48 9x6=54
7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 8x7=56 9x7=63
8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 9x8=72
9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
코드 해설

맨 윗줄(제목 행)print("\t", end="")로 맨 앞에 빈 칸 하나를 만든 뒤(1~9 숫자가 들어갈 왼쪽 칸을 비워두기 위해), for dan in range(2, 10):으로 2단부터 9단까지 "2 단", "3 단"...을 탭으로 구분해 한 줄에 이어 출력합니다.

바깥 for문 (num) — num은 1부터 9까지, 곱셈에서 단 뒤에 곱해지는 수(행 번호)입니다. 각 행 맨 앞에 print(num, end="\t")로 행 번호를 출력해요.

안쪽 for문 (dan) — 한 행 안에서 2단부터 9단까지의 곱셈식을 만듭니다. print(dan, "x", num, end="=", sep="")"2x1="처럼 곱셈식과 등호까지 출력하고, 이어서 print(dan * num, end="\t")가 계산 결과와 탭을 출력해요. 이렇게 중첩 for문(바깥=행, 안쪽=열)end, sep 옵션을 함께 활용하면, 지금까지 배운 반복문 개념을 종합적으로 적용해볼 수 있습니다.

빈칸 채우기
  1. 별이 점점 많아지게 하려면 안쪽 반복문의 range()에 무엇을 넣어야 하는가?
정답
바깥 반복문의 변수(예: i) — range(i)처럼 바깥 변수를 넣으면 줄마다 반복 횟수가 달라집니다.
학교 시험 유형
  1. 다음 코드의 실행 결과를 작성하시오.
    python
    for i in range(2, 5):
        for j in range(i):
            print("*", end="")
        print()
정답
**
***
****
다음 화 예고 — 10화에서는 여러 값을 하나로 묶어서 관리하는 리스트(List)를 배우고, for 반복문으로 리스트의 값을 하나씩 꺼내 쓰는 법을 다뤄볼게요.

 

반응형

댓글