for문 별찍기

Jaemyeong Lee·2024년 8월 20일
0

어소트락2017

목록 보기
11/20

과제 코드 예제 및 for문 별찍기 문제 풀이 분석

이번 포스트에서는 구구단 출력, 별 출력 문제와 같은 다양한 for문 사용 예제를 분석하고, 코드의 동작 방식을 한 줄씩 설명하겠습니다. 이러한 문제들은 반복문을 이해하고 활용하는 데 매우 유용합니다.


1. 구구단 출력 (2단부터 9단까지)

for (int i = 2; i < 10; ++i)
{
    for(int j = 1; j < 10; ++j)
    {
        cout << i << "*" << j << " = " << i * j << "\n";
    }
    cout << endl;
}

코드 설명:

  • 외부 루프 (for (int i = 2; i < 10; ++i)):
    • i는 2에서 시작하여 9까지 증가합니다. 이 루프는 구구단의 단을 제어합니다.
    • i가 2일 때는 2단, i가 3일 때는 3단을 출력합니다.
  • 내부 루프 (for(int j = 1; j < 10; ++j)):
    • j는 1에서 시작하여 9까지 증가합니다. 이 루프는 각 단의 곱셈 결과를 출력합니다.
    • 예를 들어, i가 2일 때 j는 1에서 9까지 반복되며, 2 1, 2 2, ..., 2 * 9의 결과를 출력합니다.
  • cout << endl;:
    • 각 단이 끝날 때마다 줄바꿈을 추가하여 다음 단이 새로운 줄에서 시작하도록 합니다.

2. 구구단을 3단씩 묶어서 출력

for (int i = 2; i < 11; i += 3)
{
    for (int j = 1; j <= 9; ++j)
    {
        cout << i << "*" << j << " = " << i * j << "\t";
        cout << i + 1 << "*" << j << " = " << (i+1) * j << "\t";
        cout << i + 2 << "*" << j << " = " << (i + 2) * j << endl;
    }
    cout << endl;
}

코드 설명:

  • 외부 루프 (for (int i = 2; i < 11; i += 3)):
    • i는 2에서 시작하여 3씩 증가합니다. 각 반복에서 3개의 단(예: 2단, 3단, 4단)을 동시에 출력합니다.
  • 내부 루프 (for (int j = 1; j <= 9; ++j)):
    • j에 대해 3개의 단(예: 2단, 3단, 4단)이 한 줄에 출력됩니다.
  • cout << i << "*" << j << " = " << i * j << "\t";:
    • 첫 번째 단(i)에 대한 곱셈 결과를 출력하고 탭(\t)으로 정렬합니다.
  • cout << i + 1 << "*" << j << " = " << (i+1) * j << "\t";:
    • 두 번째 단(i+1)에 대한 곱셈 결과를 출력합니다.
  • cout << i + 2 << "*" << j << " = " << (i + 2) * j << endl;:
    • 세 번째 단(i+2)에 대한 곱셈 결과를 출력하고 줄바꿈을 추가합니다.
  • cout << endl;:
    • 각 단 세트를 출력한 후 빈 줄을 추가하여 가독성을 높입니다.

3. 별 찍기 1 - 왼쪽 정렬된 직각삼각형

for (int i = 0; i < 5; ++i)
{
    for (int j = 0; j < i+1; ++j)
    {
        cout << "*";
    }
    cout << endl;
}

코드 설명:

  • 외부 루프 (for (int i = 0; i < 5; ++i)):
    • i는 0에서 4까지 증가하며, 각 줄에서 출력할 별의 개수를 결정합니다.
  • 내부 루프 (for (int j = 0; j < i+1; ++j)):
    • j는 0에서 i까지 증가하며, 각 줄에서 i+1개의 별을 출력합니다.
    • 예를 들어, i = 0일 때 1개의 별, i = 1일 때 2개의 별이 출력됩니다.
  • cout << endl;:
    • 각 줄이 끝날 때마다 줄바꿈을 추가합니다.

출력 결과:

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

4. 별 찍기 2 - 오른쪽 정렬된 직각삼각형

for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 5 - i; ++j)
    {
        cout << "*";
    }
    cout << endl;
}

코드 설명:

  • 외부 루프 (for(int i = 0; i < 5; i++)):
    • i는 0에서 4까지 증가하며, 각 줄에서 출력할 별의 개수를 결정합니다.
  • 내부 루프 (for(int j = 0; j < 5 - i; ++j)):
    • j는 0에서 5 - i까지 증가하며, 각 줄에서 5 - i개의 별을 출력합니다.
    • 예를 들어, i = 0일 때 5개의 별, i = 1일 때 4개의 별이 출력됩니다.
  • cout << endl;:
    • 각 줄이 끝날 때마다 줄바꿈을 추가합니다.

출력 결과:

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

5. 별 찍기 3 - 피라미드

for (int i = 0; i < 4; ++i)
{
    // 공백을 출력하기 위한 for문
    for (int j = 0; j < 3-i; ++j)
    {
        cout << " ";
    }
    // *을 출력하기 위한 for문
    for (int j = 0; j <2 * i + 1; ++j)
    {
        cout << "*";
    }
    cout << endl;
}

코드 설명:

  • 외부 루프 (for (int i = 0; i < 4; ++i)):
    • i는 0에서 3까지 증가하며, 각 줄에서 출력할 공백과 별의 개수를 결정합니다.
  • 공백 출력 (for (int j = 0; j < 3-i; ++j)):
    • j는 0에서 3-i까지 증가하며, 줄의 시작 부분에 공백을 출력합니다.
    • 예를 들어, i = 0일 때 3개의 공백, i = 1일 때 2개의 공백이 출력됩니다.
  • 별 출력 (for (int j = 0; j <2 * i + 1; ++j)):
    • j는 0에서 2 * i + 1까지 증가하며, 각 줄에서 별을 출력합니다.
    • 예를 들어, i = 0일 때 1개의 별, i = 1일 때 3개의 별이 출력됩니다.
  • cout << endl;:
    • 각 줄이 끝날 때마다 줄바꿈을 추가합니다.

출력 결과:

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

6. 별 찍기 4 - 다이아몬드

int iLine = 7;  // 전체 줄 수를 나타내는 변수 (총 7줄)
int iCount = 0;  // 현재 줄에서 사용할 별의 개수를 결정하기 위한 변수

for(int i = 0; i< iLine; ++i)
{
    // 공백 : 3,2,1,0,1,2,3
    // 별   : 1,3,5,7,5,3,1
    iCount = i;

    // i 값이 7줄 기준 4,5,6 즉 밑의 삼각형을 구성할 때만 if문에 들어감
    if (i > iLine / 2)  // i가 3을 넘는 경우, 즉 아랫부분 삼각형을 그릴 때
    {
        iCount = iLine - 1 - i;  // iCount를 감소시키는 방식으로 역삼각형을 만듦
    }

    // 공백 출력하기 위한

 forfor (int j = 0; j < (iLine / 2) - iCount; ++j)
    {
        cout << " ";
    }

    // 별을 출력하기 위한 for문
    for (int j = 0; j < iCount * 2 + 1; ++j)
    {
        cout << "*";
    }
    cout << endl;
}

코드 설명:

  • 변수 초기화:
    • iLine은 전체 줄 수를 나타내며, 7로 설정되어 있습니다.
    • iCount는 현재 줄에서 출력할 별의 개수를 결정하는 변수입니다.
  • 외부 루프 (for(int i = 0; i< iLine; ++i)):
    • i는 0에서 6까지 증가하며, 각 줄에서 출력할 공백과 별의 개수를 결정합니다.
  • 별 개수 조정:
    • if (i > iLine / 2) 조건문을 통해, 상단과 하단의 대칭을 구현합니다. i가 중간 줄(여기서는 3번째 줄)을 넘어가면 iCount가 감소하도록 설정됩니다.
  • 공백 출력 (for (int j = 0; j < (iLine / 2) - iCount; ++j))**:
    • j는 0에서 (iLine / 2) - iCount까지 증가하며, 현재 줄의 시작 부분에 공백을 출력합니다.
  • 별 출력 (for (int j = 0; j < iCount * 2 + 1; ++j))**:
    • j는 0에서 iCount * 2 + 1까지 증가하며, 현재 줄에서 별을 출력합니다.
  • cout << endl;:
    • 각 줄이 끝날 때마다 줄바꿈을 추가합니다.

출력 결과:

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

do-while 문 코드 분석

do-while 문은 반복문의 한 종류로, C++에서 사용됩니다. 이 반복문은 while 문과 유사하지만, 최소한 한 번은 코드 블록이 실행된다는 점에서 차이가 있습니다. 이번 포스트에서는 do-while 문을 예제로 사용하여 동작 방식을 자세히 분석하겠습니다.


/*
 * do while 문 : 반복문의 한 종류
 * do {} while(조건식); 의 형태로 구성된다.
 * while문은 처음 진입 부터 조건식을 체크하지만 do while문은 처음 한번은 무조건 동작이 되고 
 * 그 후에 조건식을 체크하여 true일 경우 동작되는 반복문이다.
 */

int iNumber = 0;
do
{
	cout << iNumber << endl;
} while (iNumber > 0);

코드 설명:

  1. do-while 문 기본 구조:

    • do-while 문은 다음과 같은 형태로 구성됩니다:
      do {
          // 반복할 코드 블록
      } while (조건식);
    • 동작 방식:
      • 처음 한 번은 코드 블록을 무조건 실행합니다. 조건식을 확인하지 않고 바로 실행됩니다.
      • 이후 조건식을 평가합니다. 조건식이 true라면 코드 블록을 반복 실행하고, 조건식이 false라면 반복을 종료합니다.
  2. 변수 초기화:

    • int iNumber = 0;
    • 변수 iNumber0으로 초기화합니다. 이 변수는 반복문에서 조건식을 평가하는 데 사용됩니다.
  3. do 블록:

    • do 블록 안의 코드가 첫 번째로 실행됩니다:
      cout << iNumber << endl;
    • 현재 iNumber의 값인 0이 출력됩니다.
    • 중요한 점은, 조건식이 평가되기 전에 이 코드가 실행된다는 것입니다. 따라서 do 블록 안의 코드는 iNumber의 값에 관계없이 한 번은 실행됩니다.
  4. while 조건식:

    • while (iNumber > 0);
    • 블록이 실행된 후, 조건식이 평가됩니다. 현재 iNumber0이므로 iNumber > 0false가 됩니다.
    • 조건식이 false이므로 반복문이 종료됩니다.

동작 요약:

  • 초기 실행: do 블록 내의 코드는 조건식과 관계없이 무조건 한 번 실행됩니다.
  • 조건 평가: 첫 번째 실행 후, 조건식 iNumber > 0이 평가됩니다.
  • 반복 종료: 조건식이 false이면 반복문이 종료됩니다.

실행 결과:

  • 코드가 실행되면 콘솔에 0이 출력되고, 반복문이 종료됩니다. 이는 do-while 문이 조건과 상관없이 첫 번째 실행을 보장하기 때문입니다.

do-while 문 vs while 문:

  • while 문: 조건식이 처음부터 false이면, 코드 블록이 한 번도 실행되지 않습니다.
    while (iNumber > 0) {
        cout << iNumber << endl;  // 이 코드는 실행되지 않음
    }
  • do-while 문: 조건식이 처음부터 false이어도, 코드 블록이 최소 한 번은 실행됩니다.
    do {
        cout << iNumber << endl;  // 이 코드는 한 번 실행됨
    } while (iNumber > 0);

결론:

do-while 문은 조건에 상관없이 반복문이 최소한 한 번은 실행되어야 하는 상황에서 매우 유용합니다. 이와 같은 반복문을 잘 이해하면, 다양한 프로그래밍 시나리오에서 적절하게 활용할 수 있습니다. 이번 예제에서는 iNumber0으로 초기화된 상태에서 do-while 문이 어떻게 동작하는지 살펴보았으며, 이를 통해 do-while 문이 일반적인 while 문과 어떤 점에서 다른지를 명확히 이해할 수 있습니다.

결론

이 포스트에서는 for문을 활용하여 다양한 형태의 구구단과 별 패턴을 출력하는 방법을 살펴보았습니다. 반복문을 사용한 이러한 문제들은 프로그래밍에서 자주 접하게 되는 기본적인 문제들로, 반복문과 조건문을 이해하고 연습하기에 매우 유용합니다. 각 코드의 설명을 통해 for문의 흐름과 패턴 출력 방법을 잘 이해하고 응용할 수 있기를 바랍니다.

profile
李家네_공부방

0개의 댓글