이중 for 반복문 사용하기

  • 11 minutes to read

for 반복문을 여러번 중첩해서 사용할 수 있습니다. 이러한 것을 중첩 루프 또는 다중 루프라고 합니다.

중첩된 for 반복문의 모양은 다음과 같습니다.

// (3 * 3)번 반복
for (int i = 0; i < 3; i++) // 높이(height) 반복
{
    for (int j = 0; j < 3; j++) // 너비(width) 반복
    {
        // 3 * 3번 반복되는 영역 
    }
}

중첩 루프 사용하기

여러 개의 for 반복문을 사용할 때에 인덱스 변수는 i, j, k 순서로 사용됩니다. 반드시 이 이름을 사용할 필요는 없지만, 프로그래밍 세계에서의 오래된 관례이므로 따라서 사용하면 이미 만들어져 있는 소스 코드를 볼 때 편합니다. 바깥쪽 for 반복문은 표준 출력 화면의 높이(세로)를 담당하고 안쪽 for 반복문은 너비(가로)를 담당하게 됩니다.

(3 * 3) 중첩 루프를 실행할 때의 인덱스 변수 i, j의 값을 출력해 보겠습니다.

코드: for_nested_loop.c

// for 루프를 사용하여 1부터 5까지 출력하기
#include <stdio.h>

int main(void)
{
    // (3 * 3)번 반복
    for (int i = 0; i < 3; i++) // 높이(height) 반복
    {
        printf("i: %d\n", i); // i 값 출력
        for (int j = 0; j < 3; j++) // 너비(width) 반복
        {
            printf("\tj: %d\t", j); // i 값에 해당하는 j 값 출력 
        }
        printf("\n"); // 줄 바꿈
    }

    return 0;
}
i: 0
        j: 0            j: 1            j: 2
i: 1
        j: 0            j: 1            j: 2
i: 2
        j: 0            j: 1            j: 2

바깥쪽 for 반복문이 한 번 실행될 때마다 안쪽 for 반복문이 3번씩 실행되는 구조입니다. i가 0번째 반복일 때 j는 0, 1, 2 반복되고, i가 1번째 반복일 때 j는 0, 1, 2 반복되고, i가 2번째 반복일 때 j는 0, 1, 2 반복됩니다.

이러한 중첩 루프는 2차원 형태의 데이터를 다룰 때 자주 사용됩니다.

사각형 모양으로 별표(*) 출력하기

다음 코드는 중첩 루프를 사용하여 (3 * 3) 형태의 정사각형 모양의 별표를 출력합니다.

코드: for_square.c

#include <stdio.h>

int main(void)
{
    // for 중첩 루프로 (3 * 3)번 반복하여 정사각형 모양 출력
    for (int i = 0; i < 3; i++) // 높이(height) 반복
    {
        for (int j = 0; j < 3; j++) // 너비(width) 반복
        {
            printf("*"); // 별표 출력
        }
        printf("\n"); // 줄 바꿈
    }

    return 0;
}
***
***
***

printf("*"); 코드를 사용하여 줄 바꿈없이 출력하면 가로 방향으로 안쪽 for 반복문의 반복 횟수에 맞게 출력됩니다. 그런 다음, 줄 바꿈을 하여 한 줄을 완성하는 식으로 i와 j가 같은 값으로 설정하면 정사각형 모양이 출력됩니다.

다음 코드는 중첩 루프를 사용하여 (3 * 5) 형태의 직사각형 모양의 별표를 출력합니다.

코드: for_rectangle.c

#include <stdio.h>

int main(void)
{
    // for 중첩 루프로 (3 * 5)번 반복하여 직사각형 모양 출력
    for (int i = 0; i < 3; i++) // 높이(height) 반복
    {
        for (int j = 0; j < 5; j++) // 너비(width) 반복
        {
            printf("*"); // 별표 출력
        }
        printf("\n"); // 줄 바꿈
    }

    return 0;
}
*****
*****
*****

바깥쪽 for 반복문을 3번 반복하면 높이가 3이 되고, 안쪽 for 반복문을 5번 반복하면 너비가 5가되어 직사각형 모양으로 출력이 됩니다. 인덱스 변수 i와 j를 서로 바꾸어 가면서 원하는 모양을 만들어보세요.

삼각형 모양으로 별표 출력하기

중첩 루프를 사용하면 삼각형 모양으로 별을 출력할 수 있습니다.

*
**
***

삼각형 모양은 중첩 루프에 추가적으로 하나 이상의 if 조건문을 사용해서 별표 또는 공백을 출력하도록 조건을 설정해야 합니다. 이때, 출력되는 모양을 잘 분석해서 패턴을 찾아 코드로 옮기는 과정이 중요합니다.

우선, 세로 방향으로 별표 개수가 증가하는 방식으로 삼각형 모양을 출력하겠습니다.

코드: for_nested_triangle.c

#include <stdio.h>

int main(void)
{
    // for 중첩 루프로 (5 * 5)번 반복하여 직삼각형 모양 출력
    for (int i = 0; i < 5; i++) // 높이(height) 반복
    {
        for (int j = 0; j < 5; j++) // 너비(width) 반복
        {
            if (j <= i) // 별표 출력 조건 처리: i 값만큼 j를 반복하면 하나씩 증가됨
            {
                printf("*"); // 별표 출력
            }
        }
        printf("\n"); // 줄 바꿈
    }

    return 0;
}
*
**
***
****
*****

출력 결과를 잘 살펴보면 세로 방향이 1씩 증가될 때마다 비례해서 가로 방향이 반복되는 형태입니다. if (j <= i) 조건문에 의해서 세로 출력 개수만큼 가로를 반복하면 1씩 증가되는 모양으로 직삼각형 모양을 만들 수 있습니다.

백슬래시(대각선) 모양으로 별표 출력하기

이번에는 백슬래시 기호 모양으로 별표를 출력하겠습니다.

코드: backslash.c

#include <stdio.h>

int main(void)
{
    // for 중첩 루프로 (5 * 5)번 반복하여 백슬래시(\) 모양 출력
    for (int i = 0; i < 5; i++) // 높이(height) 반복
    {
        for (int j = 0; j < 5; j++) // 너비(width) 반복
        {
            if (i == j) // i와 j가 같은 위치면 별표 출력 
            {
                printf("*"); // 별표 출력
            }
            else
            {
                printf(" "); // 공백 출력
            }
        }
        printf("\n"); // 줄 바꿈
    }

    return 0;
}
*
 *
  *
   *
    *

별표 대각선 출력의 핵심은 i와 j의 인덱스가 같을 때에 별표를 출력하고 그렇지 않으면 공백을 출력하는 것입니다.

별표 대신에 영문자 O, 공백 대신에 영문자 X를 사용하면 대각선 모양으로 O가 표시됩니다.

코드: backslash_ox.c

#include <stdio.h>

int main(void)
{
    // for 중첩 루프로 (5 * 5)번 반복하여 백슬래시(\) 모양 출력
    for (int i = 0; i < 5; i++) // 높이(height) 반복
    {
        for (int j = 0; j < 5; j++) // 너비(width) 반복
        {
            if (i == j) // i와 j가 같은 위치면 별표 출력 
            {
                printf("O"); // 영문자 O 출력
            }
            else
            {
                printf("X"); // 영문자 X 출력
            }
        }
        printf("\n"); // 줄 바꿈
    }

    return 0;
}
OXXXX
XOXXX
XXOXX
XXXOX
XXXXO

공백의 개수와 별표의 개수를 잘 계산하면 조금 더 복잡한 모양을 원하는대로 출력할 수 있습니다.

역삼각형 모양 별표 출력

역삼각형 모양을 만들어 보겠습니다. 기본적인 중첩 for 반복문은 건드리지 않고 if 조건문을 어떻게 사용하느냐에 따라서 여러가지 모양이 나올 수 있습니다.

코드: space_triangle.c

#include <stdio.h>

int main(void)
{
    // for 중첩 루프로 (5 * 5)번 반복하여 역삼각형 모양 출력
    for (int i = 0; i < 5; i++) // 높이(height) 반복
    {
        for (int j = 0; j < 5; j++) // 너비(width) 반복
        {
            if (i > j) // i가 j보다 크면(최소, i보다 j가 1 작을 때) 공백 출력 
            {
                printf(" "); // 공백 출력
            }
            else
            {
                printf("*"); // 별표 출력
            }
        }
        printf("\n"); // 줄 바꿈
    }

    return 0;
}
*****
 ****
  ***
   **
    *

실행 결과를 살펴보면 높이 반복인 인덱스 변수 i의 값만큼 별표 앞에 공백이 들어가는 것을 알 수 있습니다.

if (i > j) // i가 j보다 크면 공백 출력 
{
    printf(" "); // 공백 출력
}
else
{
    printf("*"); // 별표 출력
}

각 반복에서 i가 j보다 클 때에만 공백을 먼저 출력하고 나머지는 별표를 출력하면 역삼각형 모양이 출력됩니다.

*****
 ****
  ***
   **
    *

만약, 공백과 별표 출력을 바꿔보면 어떻게 될까요?

if (i > j) // i가 j보다 크면 
{
    printf("*"); // 별표 먼저 출력
}
else
{
    printf("_"); // 모양 확인을 위해서 밑줄 기호 출력
}
_____
*____
**___
***__
****_

i가 j보다 클 때 별표 기호를 출력하면 i가 0일때에는 출력되지 않고 1부터 4까지 반복하면서 별표가 출력됩니다.

피라미드 모양 만들기

다음과 같이 피라미드 모양의 삼각형을 그리려면 어떻게 해야할까요?

여러분들이 먼저 고민해보시고 만들기 도전해보세요.

    *
   ***
  *****
 *******
*********

제가 고민하고 만들어 본 내용은 다음에 있습니다

연습문제 - 피라미드 만들기

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com