부트캠프

[c#] 별 찍기 + 피라미드, 역피라미드, 왼쪽/오른쪽 화살표

맛난과자 2024. 5. 29. 21:53

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를 활용하여 어떻게 열의 문자 갯수를 줄이거나 늘릴 것인지부터 접근하면 비교적 쉬울 것이다.

 

풀 수 있는 방법이 아주 다양하다는 것에 놀랐다.

한 방법에 국한되지 않고 머리 끙끙 싸매가며 다양한 방법을 찾아봐야겠다.