(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 | 별 개수 |
|---|---|
| 0 | 1 |
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
| 4 | 5 |
개수는 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
