for 문을 활용하여 각종 모양의 별을 찍어보자.
for 문의 형식은
for ( 시작할 숫자; 실행 가능 범위(조건문); 숫자 증감)
나는 실행 가능 범위가 아니라 실행 불가능 범위로 착각해서 한참 헤맸다...
왼쪽 정렬 삼각형
- 이중 for문 활용
행이 바뀔 때 마다 별의 갯수가 달라져야 하기 때문에,
이중 for문을 사용해야 한다.
i=0 | i=1 | i=2 | i=3 | |
j=0 | * | |||
j=1 | * | * | ||
j=2 | * | * | * | |
j=3 | * | * | * | * |
이러면 i 열이 바뀔 때마다 j 행에서 별 찍기 실행 횟수를 바꿀 수 있다.
int line = 5;
for (int i = 0; i < line; i++)
{
for (int l = 0; l < i; l++)
{
Console.Write("*");
}
Console.WriteLine(); // 줄 바꿈
}
- 2) string 특성 활용
"맛있는" + "과자" 를 코드로 작성하면 맛있는 과자가 출력된다.
이는 string이 사실 배열이기 때문이다.
이를 활용하여 출력 후 별에 별을 더하여 구현할 수 있다.
int line = 5;
string star = "*";
for (int i = 0; i < line; i++)
{
Console.WriteLine(star);
star += "*";
}
오른쪽 정렬 삼각형
i=0 | i=1 | i=2 | i=3 | |
j,k=0 | * | |||
j,k=1 | * | * | ||
j,k=2 | * | * | * | |
j,k=3 | * | * | * | * |
" "를 찍는 j 열의 경우 갈수록 갯수가 줄어들어야 하므로,
점점 커지는 i 를 (line - 1)에 뺀다.
별을 찍는 k 열의 경우 i 와 함께 증가하므로,
k >= i 와 같이 조건을 걸어준다.
int line = 5;
for (int i = 0; i < line; i++)
{
for (int j = 0; j < (line - 1) - i; j++)
Console.Write(" ");
for (int k = 0; k <= i; k++)
Console.Write("*");
Console.WriteLine();
}
피라미드
슬슬 머리가 아파온다...

- 왼쪽, 오른쪽 정렬 삼각형 섞기
피라미드를 반으로 쪼개면, 삼각형 2개가 보인다.
오른쪽 정렬을 출력 후, 왼쪽 정렬을 출력하자.
int line = 5;
for (int i = 0; i < line; i++)
{
for (int j = 0; j < (line - 1) - i; j++)
Console.Write(" ");
for (int k = 0; k <= i; k++)
Console.Write("*"); //오른쪽 정렬
for (int l = 0; l < i; l++)
Console.Write("*"); //왼쪽 정렬
Console.WriteLine();
}
- 로직 이용
별을 갯수를 보면 모두 홀수이다.
이를 i 와 연관지어보면, 별을 0 ~ i * 2 만큼 출력한다는 것을 알 수 있다.
int line = 5;
for (int i = 0; i < line; i++)
{
for (int j = 0; j < (line - i); j++)
Console.Write(" ");
for (int k = 0; k <= (i * 2); k++)
Console.Write("*");
Console.WriteLine();
}
역피라미드
i 를 행 갯수로 두고 감소하게 두면 된다.
" " 를 찍는 j 는 (line - 1)보다 작도록 => 증가
별을 찍는 k 는 (i * 2) 보다 작도록 => 감소
설정한다.
int line = 5;
for (int i = line; i >= 1; i--)
{
for (int j = 0; j < (line - i); j++)
Console.Write(' ');
for (int k = 1; k < 2 * i; k++)
Console.Write("*");
Console.Writeline();
}
오른쪽을 가리키는 화살표
뇌에서 쿨러 빡세게 돌아가는 느낌이 들었다.

나는 보자마자 삼각형 2개가 합쳐있네 라고 생각하여 삼각형 코드를 써먹는 방향으로 접근하였다.
역삼각형의 경우, i 를 행 갯수로 잡아주고(역삼각형이라서 ㅎㅎ)
j 는 감소, k 는 증가하게 조건을 달았다.
int line = 5;
for (int i = 0; i < line; i++)
{
for (int l = 0; l < i; l++)
{
Console.Write("*");
}
Console.WriteLine(); // 왼쪽 정렬 삼각형
}
for (int i = line; i > 0; i--)
{
for (int j = 0; j < i; j++)
Console.Write("*");
for (int k = line; k > i; k--)
Console.Write(" ");
Console.WriteLine(); // 역삼각형
}
왼쪽을 가리키는 화살표

아래의 역삼각형의 경우,
i = 0으로 시작하여 " "를 찍는 j 를 i 와 함께 증가시키고,
별을 찍는 k 는 (line - 1)로 시작하여 감소시켰다.
int line = 5;
for (int i = 0; i < line; i++)
{
for (int j = 0; j < (line - 1) - i; j++)
Console.Write(" ");
for (int k = 0; k <= i; k++)
Console.Write("*");
Console.WriteLine(); // 오른쪽 정렬 삼각형
}
for (int i = 0; i < line; i++)
{
for (int j = 0; j <= i; j++)
Console.Write(' ');
for (int k = line - 1; k > i; k--)
Console.Write("*");
Console.WriteLine(); // 역삼각형
}
문제를 풀면서,
별 찍기에서 제일 중요한 것은 증감 여부 판단이라는 것을 느꼈다.
i를 활용하여 어떻게 열의 문자 갯수를 줄이거나 늘릴 것인지부터 접근하면 비교적 쉬울 것이다.
풀 수 있는 방법이 아주 다양하다는 것에 놀랐다.
한 방법에 국한되지 않고 머리 끙끙 싸매가며 다양한 방법을 찾아봐야겠다.