콘솔로 별 찍기 (삼각형 편)
지금까지 배운 내용으로도 충분히 수행할 수 있는 별 찍기 편이다.

바로 만들어 보자.
1번
우선 2중 for문을 사용해서 만들어 볼 거다.
단순히 첫 반복문이 진행됨에 따라 별의 수를 1개씩 늘려주면 되기 때문에 가장 간단하다
우선 for문을 통해 라인을 5번 출력해야하니 5번 반복하는 반복문을 만들어 보자
for (int i = 1; i <= 5; i++)
{
// 이 반복문 안에서 i 가 1부터 5까지 증가함
// 이제 이 숫자만큼 별을 그리는 로직을 추가한 뒤에
}
// 여기서 줄바꿈을 해주기만 하면 됨
i를 0부터가 아니라 1부터 시작한 이유는 뒤에서 설명하고
이제 문제는 1부터 5까지 i가 증가함에 따라, 또 각 라인도 별의 수가 1부터 5까지 증가해야 한다.
그래서 반복문 안에 반복문을 하다 더 만들어 줄 거다.
using System;
namespace twinkleStar
{
internal class Program
{
static void Main()
{
for (int i = 1; i <= 5; i++)
{
for (int j = 1; j <= i; j++)
{
Console.Write("*");
}
Console.WriteLine();
}
}
}
}
이렇게 2중 반복문 안에 Write를 이용해 줄바꿈 되지 않고 *가 이어서 출력되게 만들어주면 된다.
잘 나오는지 한번 실행해보자.

수를 늘려도 잘 나온다.

자 이제 왜 i=0; 이 아니라 i=1;로 했는지에 대해서 이야기 해보자.
여기서 아직 배우지 않았지만 new string 이라는 기능을 이용해 더욱 효율적인 코드를 만들어 볼거다.
new string(여기의 문자를, 여기 횟수만큼 반복);
생긴 것 부터 아주 이 상황에서 써먹기 딱 좋게 생겼다.
new string을 활용하면 2중 for문 없이 구현할 수 있다.
using System;
namespace twinkleStar
{
internal class Program
{
static void Main()
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(new string('*', i));
}
}
}
}
훨씬 보기 편하고 간결하다.
결과 출력도 잘 나온다.
심지어 두 코드의 실행 시간을 비교하면
| 반복수 | 2중 for문 | new string |
| 5번 | 0.17ms | 0.05ms |
| 50번 | 12.14ms | 0.45ms |
| 500번 | 1181ms | 8ms |
상당한 성능 차이가 보인다.
나중에 코딩테스트나 실무에서는 성능 또한 중요하니 지금부터 챙겨두는 습관을 들여두면 좋다.
계속해서 다음 문제도 풀어보자
2번
이번에는 별이 오른쪽으로 정렬돼있다.
콘솔에 오른쪽 정렬 같은 기능은 없기 때문에 공백을 이용해서 별이 오른쪽으로 정렬된 것처럼 보이도록 해보자
그리고 총 몇개를 사용할지 변수로 따로 빼서 작성하여 수정에 용이하게 구성해보자.
우선 1번의 구현과정과 같이 라인을 출력할 첫 번째 for문을 만들어준다.
그리고 그 안에 별이 오른쪽으로 밀려 보이게 하기 위한 공백을 출력하는 반복문과
별을 출력하는 반복문을 각각 정의해주면 간단하다.
단지 라인별로 몇번 출력해야하는지에 대한 정의를 명확하게 하기만 하면 된다.
공백은 4 3 2 1 0 순으로 줄어드니
4에서 0까지 줄어드는 코드를 구현하면 된다.
별은 이전과 동일하게 증가하게 구성하면 된다.
using System;
namespace twinkleStar
{
internal class Program
{
static void Main()
{
int total = 5;
for (int i = 1; i <= total; i++)
{
for (int k = 0; k < total - i; k++)
{
Console.Write(" "); // Write를 이용해 줄바꿈 X
}
for (int j = 0; j < i; j++)
{
Console.Write("*");
}
Console.WriteLine(); // 줄바꿈 i의 루프가 1회 끝날 때 줄 바꿈
}
}
}
}
증가식으로 표현하는 게 더 통일성 있어 보여 조건식을 k < total - i 로 구성했지만 다른 방법을 사용해도 상관 없다.
이렇게 하면 i가 증가함에 따라 total (5) - i(1, 2, 3, 4, 5) = 4, 3, 2, 1 가 산출되니 의도하던대로 공백의 수를 출력할 수 있게 된다


잘 출력된다.
이번에도 new string을 사용해서 더 깔끔하게 구현해보자
using System;
namespace twinkleStar
{
internal class Program
{
static void Main()
{
int total = 5;
for (int i = 1; i <= total; i++)
{
Console.Write(new string(' ', total - i));
Console.WriteLine(new string('*', i));
}
}
}
}
너무 간결하고 좋다.
그리고 이번에도 성능 차이가 명확하게 난다.
| 반복수 | 2중 for문 | new string |
| 5번 | 0.25ms | 0.08ms |
| 50번 | 25.41ms | 0.96ms |
| 500번 | 2257.87ms | 16.52ms |
이쯤 되면 그냥 new string을 쓰는게 더 쉽고 더 좋다고 생각되지만
일단 이 문제는 반복문 활용에 대한 걸 주제로 시작했으니 계속해서 두 가지 방법으로 모두 구현해보자.
3번
이번에는 훨씬 간단하다.
*이 감소하게만 만들면 된다.
1번을 뒤집은 버전일 뿐인 간단하게 하면 되지만 이번엔 total-i 가 아니라 int j의 초기값을 i를 주는 방식으로 구현해보자.
using System;
namespace twinkleStar
{
internal class Program
{
static void Main()
{
int total = 5;
// 2중 for문
for (int i = 1; i <= total; i++)
{
for (int j = i; j <= total; j++)
{
Console.Write("*");
}
Console.WriteLine();
}
// new string
for (int i = 0; i < total; i++)
{
Console.WriteLine(new string('*', total - i));
}
}
}
}

잘 출력된다.
이번에도 공백이 필요 없는 구조였기 때문에 더 쉽게 구성할 수 있었다.
성능 차이도 1번의 결과와 유사하다.
4번
드디어 마지막이다.
앞에서 했던 것들을 조합하면 쉽게 구현할 수 있다.
공백은 0 1 2 3 4 로 증가하고, 별은 5 4 3 2 1 로 감소한다.
using System;
namespace twinkleStar
{
internal class Program
{
static void Main()
{
int total = 5;
// 2중 for문
for (int i = 1; i <= total; i++)
{
for (int k = 1; k < i; k++)
{
Console.Write(" ");
}
for (int j = i; j <= total; j++)
{
Console.Write("*");
}
Console.WriteLine();
}
// new string
for (int i = 0; i < total; i++)
{
Console.Write(new string(' ', i));
Console.WriteLine(new string('*', total - i));
}
}
}
}

덤으로 while문을 사용해서도 동일한 기능을 구현할 수 있다.
using System;
namespace twinkleStar
{
internal class Program
{
static void Main()
{
int total = 5;
// 2중 while문
int i = 1;
while (i <= total)
{
int k = 1;
while (k < i)
{
Console.Write(" ");
k++;
}
int j = i;
while (j <= total)
{
Console.Write("*");
j++;
}
Console.WriteLine();
i++;
}
// new string
int x = 0;
while (x < total)
{
Console.Write(new string(' ', x));
Console.WriteLine(new string('*', total - x));
x++;
}
}
}
}
코드 스타일과 상황에 따라 for문과 while문을 자유자재로 쓸 수 있도록 잘 연습해보도록 하자.
이렇게 반복문을 이용해 콘솔 출력으로 삼각형을 그려봤다.
다음 글에서는 더 어려운 다이아몬드를 그려 볼 예정이다.
'C#' 카테고리의 다른 글
| C# - 배열 ( Array ) (0) | 2025.09.08 |
|---|---|
| C# - 콘솔로 별 찍기 (다이아몬드 편) (0) | 2025.09.08 |
| C# - 반복문 ( Loop Statements ) (0) | 2025.09.04 |
| C# - 조건문 ( Conditional Statements ) (0) | 2025.09.04 |
| C# - 형변환 ( type casting ) (0) | 2025.09.04 |