C++ 프로그래밍: 반복문 심화와 응용
이번 장에서는 C++ 프로그래밍의 핵심 개념인 반복문을 한 단계 더 깊이 있게 배워봅니다. 반복문 안에 또 다른 반복문을 사용하는 이중 반복문의 구조를 이해하고, 이를 활용하여 구구단이나 2차원 배열과 같은 격자 형태의 데이터를 다루는 방법을 익힙니다. 또한, **나머지 연산자(%)**를 활용하여 숫자의 특성을 파악하고 조건에 맞는 데이터를 처리하는 실용적인 예제를 다룹니다.
1. 이중 반복문 (Nested Loops)
단순한 작업의 반복을 넘어, 복잡하고 다차원적인 작업을 수행해야 할 때 이중 반복문이 사용됩니다. 이중 반복문은 바깥쪽 반복문이 한 번 실행될 때, 안쪽 반복문은 처음부터 끝까지 모두 실행되는 구조를 가집니다.
시계의 분침과 초침을 생각하면 쉽습니다. 분침(바깥쪽 반복문)이 한 칸 움직일 때마다, 초침(안쪽 반복문)은 60번을 모두 돌아야 합니다.
기본 구조:
#include <iostream>
int main()
{
// 바깥쪽 for문: j는 0, 1, 2 총 3번 반복합니다.
for (int j = 0; j < 3; j++)
{
// 안쪽 for문: k는 0, 1, 2 총 3번 반복합니다.
for (int k = 0; k < 3; k++)
{
// 이 구문은 바깥쪽 반복 1번에 대해 안쪽 반복 3번씩, 총 3 * 3 = 9번 실행됩니다.
std::cout << "j: " << j << ", k: " << k << std::endl;
}
std::cout << "--- 바깥쪽 루프 1회 종료 ---" << std::endl;
}
return 0;
}
C++
복사
응용 1: 구구단 출력하기
이중 반복문의 가장 대표적인 활용 예제는 구구단입니다.
•
바깥쪽 반복문 (i): 2단부터 9단까지, 단(Dan)을 결정합니다.
•
안쪽 반복문 (j): 각 단에 곱해지는 수(1부터 9까지)를 결정합니다.
#include <iostream>int main()
{
// 2단부터 9단까지 반복
for (int i = 2; i < 10; i++)
{
// 새로운 단을 시작하기 전에 제목을 출력하고 한 줄 띄웁니다.
std::cout << "\n--- " << i << "단 ---" << std::endl;
// 각 단에 1부터 9까지 곱하기
for (int j = 1; j < 10; j++)
{
// "i * j = (결과)" 형식으로 출력합니다.
std::cout << i << " * " << j << " = " << i * j << std::endl;
}
}
return 0;
}
C++
복사
2. 2차원 배열과 이중 반복문
2차원 배열은 행(row)과 열(column)으로 구성된, 마치 엑셀 시트나 표와 같은 형태의 데이터를 저장하는 구조입니다. 이러한 2차원 배열의 모든 요소에 접근하고 값을 처리할 때 이중 반복문이 매우 유용하게 사용됩니다.
2.1. 2차원 배열 선언과 접근
2차원 배열은 대괄호 []를 두 번 사용하여 타입 이름[세로크기][가로크기] 형태로 선언합니다. 수학의 행렬처럼 [y][x] 좌표로 생각하면 다루기 편리합니다.
#include <iostream>int main()
{
// int형 2차원 배열 선언 (세로 2, 가로 4)
int arr[2][4] =
{
{1, 2, 3, 4}, // 첫 번째 행 (y=0)
{5, 6, 7, 8} // 두 번째 행 (y=1)
};
// 주석으로 인덱스를 표현하면 다음과 같습니다.
// int arr[y][x] = {
// {[0][0], [0][1], [0][2], [0][3]},
// {[1][0], [1][1], [1][2], [1][3]}
// }
// 특정 요소에 접근하기
int y = 1;
int x = 2;
int num = arr[y][x]; // arr[1][2]의 값인 7을 변수 num에 저장
std::cout << "arr[" << y << "][" << x << "]의 값은 " << num << "입니다." << std::endl; // 출력: 7
return 0;
}
C++
복사
2.2. 이중 반복문으로 2차원 배열 다루기
이중 반복문을 사용하면 2차원 배열의 모든 요소를 순차적으로 방문하여 값을 읽거나 변경할 수 있습니다.
•
바깥쪽 반복문: 세로(행, y)를 제어합니다.
•
안쪽 반복문: 가로(열, x)를 제어합니다.
#include <iostream>
int main()
{
int arr[2][5] =
{
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 }
};
// 이중 for문을 사용하여 배열의 모든 값을 1증가
for (int y = 0; y < 2; y++) // 세로 크기만큼 반복 (0, 1)
{
for (int x = 0; x < 5; x++) // 가로 크기만큼 반복 (0, 1, 2, 3, 4)
{
arr[y][x] += 1;
}
}
// 변경된 값을 확인하기 위해 다시 출력
for (int y = 0; y < 2; y++)
{
for (int x = 0; x < 5; x++)
{
std::cout << arr[y][x] << " ";
}
std::cout << std::endl; // 한 행 출력이 끝나면 줄바꿈
}
return 0;
}
C++
복사
3. 나머지 연산자(%)를 사용한 조건 판별
% 연산자는 나눗셈의 나머지를 구하는 연산자입니다. 이를 if 조건문과 함께 사용하면 숫자가 홀수인지, 짝수인지, 또는 특정 수의 배수인지 쉽게 구분할 수 있습니다.
•
num % 2 == 0 : 2로 나눈 나머지가 0인가? → 짝수 판별
•
num % 2 == 1 : 2로 나눈 나머지가 1인가? → 홀수 판별
•
num % 3 == 0 : 3로 나눈 나머지가 0인가? → 3의 배수 판별
#include <iostream>int main()
{
int num = 101;
std::cout << "숫자 " << num << "은(는) " << std::endl;
if ((num % 2) == 0)
{
std::cout << " - 짝수입니다." << std::endl;
}
else
{
std::cout << " - 홀수입니다." << std::endl;
}
if ((num % 3) == 0)
{
std::cout << " - 3의 배수입니다." << std::endl;
}
else
{
std::cout << " - 3의 배수가 아닙니다." << std::endl;
}
return 0;
}
C++
복사
4. 종합 응용: 배열 내 조건에 맞는 데이터 개수 세기 (카운팅)
지금까지 배운 반복문, 배열, 조건문을 모두 활용하여 실용적인 문제를 해결해 봅시다. 배열에 들어있는 수많은 데이터 중에서 특정 조건(예: 홀수)을 만족하는 요소가 총 몇 개인지 세어보겠습니다.
이러한 '카운팅' 기법은 데이터 분석의 가장 기초적인 단계입니다.
1.
개수를 셀 변수(count)를 0으로 초기화합니다.
2.
반복문을 통해 배열의 모든 요소를 하나씩 확인합니다.
3.
if 조건문을 사용하여 현재 요소가 원하는 조건에 맞는지 검사합니다.
4.
조건이 참이면 count 변수를 1 증가시킵니다.
5.
반복문이 끝나면 count 변수에는 조건에 맞는 요소의 총개수가 저장됩니다.
#include <iostream>
int main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
// 홀수의 개수를 저장할 변수를 선언하고 0으로 초기화합니다.
int count = 0;
// for문을 이용해 arr 배열의 모든 요소를 순회합니다.
for (int i = 0; i < 5; i++)
{
// arr[i] 의 값이 홀수인지 판별합니다.
if ((arr[i] % 2) == 1)
{
// 홀수가 맞다면 count를 1 증가시킵니다.
count++;
}
}
// 최종 결과를 출력합니다.
std::cout << "배열 {1, 2, 3, 4, 5}에 포함된 홀수의 개수는 " << count << "개 입니다." << std::endl;
return 0;
}
C++
복사
“강의는 많은데, 왜 나는 아직도 코드를 못 짤까?”
혼자 공부하다 보면 누구나 이런 고민을 하게 됩니다.
•
강의는 다 들었지만 막상 손이 안 움직이고,
•
복습을 하려 해도 무엇을 다시 봐야 할지 모르겠고,
•
질문할 곳도 없고,
•
유튜브는 결국 정답을 따라 치는 것밖에 안 되는 것 같고.
문제는 ‘연습’이 빠졌기 때문입니다.
단순히 강의를 듣는 것만으로는 실력이 늘지 않습니다.
실제 문제를 풀고, 고민하고, 직접 구현해보는 시간이 반드시 필요합니다.
그래서, 얌얌코딩 코칭은 다릅니다.
그냥 가르치지 않습니다.
스스로 설계하고, 코딩할 수 있게 만듭니다.
얌얌코딩 코칭에서는 단순한 예제가 아닌,
스스로 문제를 분석하고 구현해야 하는 연습문제를 제공합니다.
이 연습문제들은 다음과 같은 역량을 키우기 위해 설계되어 있습니다:
•
문제를 스스로 쪼개고 설계하는 힘
•
다양한 조건을 만족시키는 실제 구현 능력
•
기능 단위가 아닌, 프로그램 단위로 사고하는 습관
•
마침내 자신의 힘으로 코드를 끝까지 작성하는 경험
지금 필요한 건 더 많은 강의가 아닙니다.
코드를 스스로 완성해 나가는 훈련,
그것이 지금 실력을 끌어올릴 가장 현실적인 방법입니다.