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: 반복 횟수보다 종료 조건이 중요한 경우 사용
'GDGoC > Python' 카테고리의 다른 글
| [Python] Basic #07: 시간복잡도 (0) | 2026.08.12 |
|---|---|
| [Python] Basic #06: 자료구조 (0) | 2026.08.12 |
| [Python] Algorithm #04: 완전탐색과 백트래킹 (0) | 2026.05.11 |
| [Python] Basic #04: 딕셔너리 (Dictionary) (0) | 2026.05.11 |
| [Python] Algorithm #03: 이분 탐색 (Binary Search) (0) | 2026.05.06 |