포스트

(C#) 14. 코드의 흐름 제어 (별 찍기 예제)

안쪽 루프의 횟수를 바깥 변수에 맞추면 삼각형이 나온다. 줄 번호와 개수의 관계를 어떻게 잡는지, 역삼각형과 피라미드로 확장하는 법, 루프 없이 한 줄로 쓰는 법까지 정리했다.

(C#) 14. 코드의 흐름 제어 (별 찍기 예제)

안쪽 루프 횟수를 고정하지 않으면

13편의 구구단은 안쪽 루프가 항상 9번 돌았다. 그 횟수를 바깥 변수에 연결하면 모양이 생긴다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;

namespace ex2
{
    class Program
    {
        static void Main(string[] args)
        {
            // 별 찍기
            for (int i = 0; i < 5; i++) 
            {
                for (int j = 0; j <= i; j++) 
                {
                    Console.Write("*");
                }
                Console.WriteLine();
            }
        }
    }
}

별 찍기 결과

j <= i가 전부다. i가 0일 때 j는 0 하나라 별 1개, i가 4일 때 j는 0부터 4까지라 5개다.

줄 번호와 개수의 관계를 먼저 적는다

처음엔 조건을 j < i로 쓸지 j <= i로 쓸지 매번 헷갈렸다. 표를 그려보니 정리가 됐다.

i별 개수
01
12
23
34
45

개수는 i + 1이다. 0부터 세는 루프로 i + 1번 돌게 하려면 j <= i 또는 j < i + 1이다.

i를 1부터 시작하면 개수가 그대로 i가 되어 더 직관적이다.

1
2
3
4
5
6
for (int i = 1; i <= 5; i++)
{
    for (int j = 0; j < i; j++)
        Console.Write("*");
    Console.WriteLine();
}

별 찍기 문제는 결국 “줄 번호에서 개수를 구하는 식” 하나를 찾는 일이었다. 그 식만 나오면 코드는 자동으로 따라온다.

모양 바꿔보기

역삼각형은 개수가 5 - i다.

1
2
3
4
5
6
for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 5 - i; j++)
        Console.Write("*");
    Console.WriteLine();
}

피라미드는 공백과 별 두 축이 필요하다. 줄마다 공백 4 - i개, 별 2 * i + 1개다.

1
2
3
4
5
6
for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < 4 - i; j++) Console.Write(" ");
    for (int j = 0; j < 2 * i + 1; j++) Console.Write("*");
    Console.WriteLine();
}
1
2
3
4
5
    *
   ***
  *****
 *******
*********

별 개수가 홀수(1, 3, 5, 7, 9)인 게 2 * i + 1이고, 공백은 전체 높이에서 줄어드는 만큼이다. 두 식을 따로 구하면 헷갈리지 않는다.

루프 없이 한 줄로

같은 문자를 여러 번 이어 붙이는 건 string 생성자에 있다.

1
2
for (int i = 1; i <= 5; i++)
    Console.WriteLine(new string('*', i));

피라미드도 두 줄이면 된다.

1
2
for (int i = 0; i < 5; i++)
    Console.WriteLine(new string(' ', 4 - i) + new string('*', 2 * i + 1));

new string(char, int)는 안쪽 루프를 통째로 대신한다. '*'가 큰따옴표가 아니라 작은따옴표인 건 문자열이 아니라 char이기 때문이다.

PadLeft를 쓰면 공백을 따로 만들 필요도 없다.

1
Console.WriteLine(new string('*', 2 * i + 1).PadLeft(4 + i + 1));

Write 와 WriteLine

Console.Write는 줄바꿈을 안 하고, WriteLine은 출력한 뒤 줄을 바꾼다. 별을 가로로 이어 찍어야 하니 안쪽에서는 Write를 쓰고, 한 줄이 끝나는 자리에서 WriteLine()을 부른다.

안쪽에서 WriteLine을 쓰면 별이 세로로 한 줄에 하나씩 나온다. 이중 루프를 처음 쓸 때 자주 하는 실수다.

정리하면

  • 안쪽 루프 횟수를 바깥 변수에 연결하면 모양이 만들어진다
  • 줄 번호와 개수의 관계를 표로 적어보면 조건식이 바로 나온다
  • i를 1부터 시작하면 개수가 그대로 i가 되어 식이 단순해진다
  • 피라미드처럼 두 요소가 있으면 각각의 식을 따로 구한다
  • 같은 문자 반복은 new string(char, int)PadLeft로 루프 없이 된다
  • 가로로 이어 찍을 때는 Write, 줄이 끝나는 자리에서만 WriteLine
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.