1강
중첩 반복문의 개념
공식
중첩 반복문이란?
반복문 안에 또 반복문이 들어간 구조입니다. 격자(표)를 훑거나, 모든 쌍을
검사하거나, 도형을 그릴 때 필수입니다.
1. 기본 모양
for (int i = 0; i < 3; i++) { // 바깥 반복 (행)
for (int j = 0; j < 3; j++) { // 안쪽 반복 (열)
cout << i << ',' << j << ' ';
}
cout << '\n';
}
출력:
0,0 0,1 0,2
1,0 1,1 1,2
2,0 2,1 2,2
바깥이 한 바퀴 돌 때마다 안쪽이 처음부터 끝까지 전부 돕니다. 즉 안쪽은
바깥 횟수만큼 반복됩니다.
for i in range(3):
for j in range(3):
print(f"{i},{j}", end=' ')
print()
2. 어떤 일에 쓰나
- 격자 순회 : 2차원 배열의 모든 칸을 방문 (i=행, j=열).
- 모든 쌍 검사 : N개 중 두 개를 고르는 모든 조합.
- 도형 출력 : 별 찍기 등(바깥=줄, 안쪽=그 줄의 글자).
// 모든 쌍 (i < j) 검사
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
if (a[i] + a[j] == target) ...
j를 i+1부터 시작하면 같은 쌍을 두 번 세지 않습니다.
3. 복잡도 — 곱해진다!
바깥 \(N\)번, 안쪽 \(M\)번이면 안쪽 본문은 \(N \times M\)번 실행됩니다.
| 구조 | 실행 횟수 |
|---|---|
| 2중 반복 (\(N \times N\)) | \(O(N^2)\) |
| 3중 반복 | \(O(N^3)\) |
\(N = 1000\)이면 \(N^2 = 10^6\)으로 괜찮지만, \(N = 100000\)이면 \(N^2 = 10^{10}\)으로
시간 초과입니다. 중첩 깊이가 늘수록 N의 한계가 급격히 작아진다는 점을 꼭
기억하세요.
정리
- 반복문 안의 반복문 — 바깥 한 바퀴마다 안쪽 전체 실행.
- 격자 순회, 모든 쌍, 도형 출력에 쓰인다.
- 복잡도는 곱해진다 — 2중이면 \(O(N^2)\).
- N이 크면 중첩 반복은 시간 초과 위험.