Type something to search...

4회차: 반복문

4회차: 반복문

선수 학습: 3회차 (조건문)


학습 목표

  • 반복문의 개념을 이해한다.
  • for 반복문을 사용할 수 있다.
  • while 반복문을 사용할 수 있다.
  • range() 함수를 다양하게 활용할 수 있다.
  • break / continue 로 반복을 제어할 수 있다.

4.1. 반복문이란?

4.1.1. 왜 반복문이 필요한가?

“안녕하세요”를 5번 출력하고 싶다면 아래처럼 5줄을 써야 한다.

1
print("안녕하세요")
2
print("안녕하세요")
3
print("안녕하세요")
4
print("안녕하세요")
5
print("안녕하세요")

만약 100번이라면 100줄을 써야 한다. 이것은 매우 비효율적이다. 반복문(Loop)을 사용하면 이런 반복 작업을 코드 몇 줄로 해결할 수 있다.

1
for i in range(5):
2
print("안녕하세요")

4.1.2. 반복문의 종류

파이썬에서는 두 가지 반복문을 사용한다.

  • for (포): 정해진 횟수나 목록의 끝까지 반복
  • while (와일): 조건이 참(True)인 동안 반복

4.2. for(포) 반복문

4.2.1. for 의 구조

1
for 변수 in 반복대상:
2
반복할 코드

반복대상 에서 값을 하나씩 꺼내어 변수 에 저장하고, 들여쓰기된 코드를 실행한다. 반복대상의 모든 값을 꺼낼 때까지 반복한다.

4.2.2. 리스트를 이용한 for 반복

1
fruits = ["사과", "바나나", "포도", "딸기"]
2
3
for f in fruits:
4
print(f)
설명
1과일 이름이 담긴 리스트를 선언한다.
3첫 번째 반복: f = "사과"
3두 번째 반복: f = "바나나"
3세 번째 반복: f = "포도"
3네 번째 반복: f = "딸기"
4각 반복마다 f 의 값을 출력한다.

실행 결과

1
사과
2
바나나
3
포도
4
딸기

4.2.3. 반복마다 번호 붙이기

enumerate(에뉴머레이트) 함수를 사용하면 반복할 때 순서 번호도 함께 얻을 수 있다.

1
fruits = ["사과", "바나나", "포도"]
2
3
for i, f in enumerate(fruits):
4
print(f"{i + 1}. {f}")
설명
3enumerate(fruits)(0, "사과"), (1, "바나나"), (2, "포도") 를 순서대로 반환한다. i 는 순서 번호, f 는 값이다.
4번호는 0부터 시작하므로 i + 1 을 출력하여 1번부터 표시한다.

실행 결과

1
1. 사과
2
2. 바나나
3
3. 포도

4.3. range(레인지) 함수

4.3.1. range 란?

range() 함수는 정해진 범위의 숫자들을 순서대로 만들어낸다. for 반복문과 함께 자주 사용한다.

4.3.2. range 사용 방법

사용 방법생성되는 숫자설명
range(5)0, 1, 2, 3, 40부터 4까지
range(1, 6)1, 2, 3, 4, 51부터 5까지
range(0, 10, 2)0, 2, 4, 6, 80부터 8까지 2씩 증가
range(10, 0, -1)10, 9, 8, …, 110부터 1까지 1씩 감소

참고

range(1, 6) 에서 마지막 숫자 6 은 포함되지 않는다. 1부터 시작하여 6 이 되기 직전5 에서 끝난다.

4.3.3. range 기본 예시

1
for i in range(5):
2
print(i)
설명
1range(5) 는 0, 1, 2, 3, 4 를 만든다.
2각 반복마다 i 의 값을 출력한다.

실행 결과

1
0
2
1
3
2
4
3
5
4

4.3.4. 1부터 시작하기

1
for i in range(1, 6):
2
print(f"{i}번째 반복")
설명
1range(1, 6) 은 1, 2, 3, 4, 5 를 만든다.
2각 반복마다 몇 번째인지 출력한다.

실행 결과

1
1번째 반복
2
2번째 반복
3
3번째 반복
4
4번째 반복
5
5번째 반복

4.3.5. 증가 폭 설정하기

1
print("짝수만 출력:")
2
for i in range(0, 11, 2):
3
print(i)
4
5
print("카운트다운:")
6
for i in range(5, 0, -1):
7
print(i)
8
print("발사!")
설명
2range(0, 11, 2) 는 0부터 10까지 2씩 증가하며 0, 2, 4, 6, 8, 10 을 만든다.
6range(5, 0, -1) 는 5부터 1까지 1씩 감소하며 5, 4, 3, 2, 1 을 만든다.

실행 결과

1
짝수만 출력:
2
0
3
2
4
4
5
6
6
8
7
10
8
카운트다운:
9
5
10
4
11
3
12
2
13
1
14
발사!

4.3.6. 예제: 구구단 출력

1
n = int(input("출력할 단을 입력하세요: "))
2
3
print(f"===== {n}단 =====")
4
for i in range(1, 10):
5
print(f"{n} × {i} = {n * i}")
설명
1사용자에게 단(n)을 입력받는다.
3구분선과 제목을 출력한다.
4i 가 1부터 9까지 반복된다.
5각 반복마다 곱셈 결과를 출력한다. {n * i} 에서 n * i 가 자동 계산된다.

4.4. for 반복문과 조건문 결합

for 반복문 안에 if 조건문을 넣으면 특정 조건을 만족하는 경우에만 실행할 수 있다.

1
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2
3
print("짝수 목록:")
4
for n in numbers:
5
if n % 2 == 0:
6
print(n)
설명
11부터 10까지의 숫자 리스트를 선언한다.
4리스트의 각 숫자를 차례대로 n 에 담는다.
5n % 2 == 0 이면 (짝수이면) 아래 코드를 실행한다.
6짝수인 경우에만 출력한다.

실행 결과

1
짝수 목록:
2
2
3
4
4
6
5
8
6
10

4.5. while(와일) 반복문

4.5.1. while 의 구조

while 은 조건이 True 인 동안 계속 반복한다. 조건이 False 가 되는 순간 반복을 멈춘다.

1
while 조건:
2
반복할 코드

4.5.2. while 기본 예시

1
count = 0
2
3
while count < 5:
4
print(f"count = {count}")
5
count += 1
6
7
print("반복 종료")
설명
1count0 으로 초기화한다.
3count < 5 이면 반복한다. 처음에는 0 < 5 이므로 True 이다.
4count 의 현재 값을 출력한다.
5count += 1count 를 1 증가시킨다. 이 줄이 없으면 count 가 영원히 0이어서 무한 반복이 된다.
6count 가 5가 되면 5 < 5False 이므로 반복이 종료된다.
8while 블록 밖이므로 반복이 끝난 뒤 실행된다.

실행 결과

1
count = 0
2
count = 1
3
count = 2
4
count = 3
5
count = 4
6
반복 종료

주의

while 을 사용할 때는 반드시 반복이 언젠가 끝날 수 있도록 조건을 바꾸는 코드를 작성해야 한다. 그렇지 않으면 프로그램이 영원히 실행되는 무한 루프(Infinite Loop) 가 발생한다. 무한 루프가 발생하면 터미널에서 Ctrl + C 를 눌러 강제 종료할 수 있다.

4.5.3. 예제: 몬스터 체력 감소

1
hp = 100
2
cnt = 0
3
4
while hp > 0:
5
hp -= 15
6
cnt += 1
7
print(f"공격 {cnt}회 | 남은 HP: {max(hp, 0)}")
8
9
print(f"총 {cnt}회 공격으로 몬스터 처치!")
설명
1~2체력과 공격 횟수를 초기화한다.
4hp > 0 이면 계속 반복한다.
5매 반복마다 체력을 15씩 감소시킨다.
6공격 횟수를 1씩 증가시킨다.
7max(hp, 0)hp0 중 큰 값을 반환하므로 체력이 음수로 표시되지 않는다.
9반복이 끝나면 총 공격 횟수를 출력한다.

실행 결과

1
공격 1회 | 남은 HP: 85
2
공격 2회 | 남은 HP: 70
3
공격 3회 | 남은 HP: 55
4
공격 4회 | 남은 HP: 40
5
공격 5회 | 남은 HP: 25
6
공격 6회 | 남은 HP: 10
7
공격 7회 | 남은 HP: 0
8
총 7회 공격으로 몬스터 처치!

4.5.4. while을 이용한 입력 반복

사용자가 올바른 값을 입력할 때까지 계속 요청할 수 있다.

1
while True:
2
age = int(input("나이를 입력하세요 (1~120): "))
3
if 1 <= age <= 120:
4
print(f"입력된 나이: {age}세")
5
break
6
else:
7
print("올바른 나이를 입력하세요.")
설명
1while True 는 조건이 항상 True 이므로 break 를 만날 때까지 무한 반복한다.
2나이를 입력받는다.
31 <= age <= 120 은 나이가 1 이상이고 120 이하인지 검사한다.
5조건이 충족되면 break 로 반복을 종료한다.
7조건이 충족되지 않으면 다시 입력을 요청한다.

4.6. break(브레이크) & continue(컨티뉴)

4.6.1. break — 반복 완전 종료

break 를 만나면 반복문 전체를 즉시 종료한다.

1
for i in range(1, 11):
2
if i == 5:
3
print("5에서 멈춤!")
4
break
5
print(i)
6
7
print("for문 종료")
설명
1i 가 1부터 10까지 반복한다.
2~4i 가 5가 되면 메시지를 출력하고 break 로 반복 전체를 즉시 종료한다.
5break 가 실행되면 이 줄은 실행되지 않는다.
7for 문이 종료된 후 실행된다.

실행 결과

1
1
2
2
3
3
4
4
5
5에서 멈춤!
6
for문 종료

4.6.2. continue — 이번 반복만 건너뜀

continue 를 만나면 이번 반복의 남은 코드를 건너뛰고 다음 반복으로 넘어간다. 반복 자체는 종료되지 않는다.

1
for i in range(1, 11):
2
if i % 2 == 0:
3
continue
4
print(i)
설명
2~3i 가 짝수이면 continueprint(i) 를 건너뛰고 다음 반복으로 간다.
4홀수인 경우에만 이 줄이 실행된다.

실행 결과

1
1
2
3
3
5
4
7
5
9

4.6.3. break 와 continue 비교

키워드동작
break반복문 전체 를 즉시 종료한다.
continue이번 반복 의 남은 코드만 건너뛰고, 다음 반복은 계속한다.

4.7. 중첩 반복문

반복문 안에 또 다른 반복문을 넣을 수 있다. 이를 중첩 반복문이라 한다.

1
for i in range(1, 4):
2
for j in range(1, 4):
3
print(f"({i}, {j})", end=" ")
4
print()
설명
1바깥쪽 for 문: i 가 1, 2, 3 을 순서대로 취한다.
2안쪽 for 문: i 하나마다 j 가 1, 2, 3 을 반복한다.
3end=" " 는 출력 후 줄바꿈 대신 공백을 넣는다.
4print() 는 빈 줄을 출력한다. 안쪽 반복이 끝날 때마다 줄을 바꾼다.

실행 결과

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

4.7.2. 예제: 전체 구구단 출력

1
for i in range(2, 10):
2
print(f"===== {i}단 =====")
3
for j in range(1, 10):
4
print(f"{i} × {j} = {i * j}")
5
print()
설명
1바깥 반복: i 가 2부터 9까지 반복한다. (2단~9단)
2각 단의 제목을 출력한다.
3~4안쪽 반복: j 가 1부터 9까지 반복하며 곱셈 결과를 출력한다.
5각 단이 끝날 때마다 빈 줄을 출력한다.

4.8. 실습 과제

과제 1. 별 피라미드 출력

아래와 같은 별 피라미드를 출력하는 코드를 작성한다.

1
*
2
**
3
***
4
****
5
*****
1
for i in range(1, 6):
2
print("*" * i)

과제 2. 로또 번호 합산기

1~45 사이의 로또 번호 6개를 input() 으로 입력받아 합계와 평균을 계산하여 출력한다.

1
total = 0
2
3
print("로또 번호 6개를 입력하세요.")
4
for i in range(1, 7):
5
n = int(input(f"{i}번째 번호: "))
6
total += n
7
8
avg = total / 6
9
print(f"\n합계: {total}")
10
print(f"평균: {avg:.1f}")

과제 3. 3의 배수의 합

1부터 100까지의 숫자 중 3의 배수의 합과 개수를 구하여 출력한다.

1
total = 0
2
cnt = 0
3
4
for i in range(1, 101):
5
if i % 3 == 0:
6
total += i
7
cnt += 1
8
9
print(f"3의 배수 개수: {cnt}개")
10
print(f"3의 배수의 합: {total}")