IT 프로그래밍/백준

[C++] 2444 별찍기 7

기술1 2024. 3. 27. 17:27
반응형

https://www.acmicpc.net/problem/2444

 

2444번: 별 찍기 - 7

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

풀이


#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;


    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n - i; j++)
            cout << " ";

        for (int k = 1; k <= 2 * i - 1; k++)
            cout << "*";

        cout << endl;
    }


    for (int i = n - 1; i >= 1; i--)
    {
        for (int j = 1; j <= n - i; j++)
            cout << " ";

        for (int k = 1; k <= 2 * i - 1; k++)
            cout << "*";

        cout << endl;
    }

    return 0;
}

의외로 이중for문을 쓰면 식 자체는 간단한 것인데 생각하는데 오래 걸렸습니다.

 

아마 몇시간째 코딩을 풀다보니 과부화가 온 것이 아닐까 생각이 드네요.. 이거를 풀고 쉬려했는데 여기에서 머리를 넘 많이 써버린 느낌이에요.

 

먼저 이 문제를 처음 접근할 때 출력되는 구조를 봐야합니다. 

 

증가하는 부분/ 감소하는 부분 이것을 끊어서 for문을 넣어야 합니다. for문에서 감소하다가 증가로 바꿔주는 하나의 식은 없기 때문에 두 식으로 나눠주어야 합니다.

 

첫번째 for문

" " 공백은 계속해서 줄어들고 별은 2*n -1번씩 증가를 합니다. 따라서 " " 공백은 계속해서 줄여야 하기 때문에 이줄 for문의 2번째 조건에 j <= n -1을 넣어주었습니다. 그러면 i가 증가함에 따라 j는 감소하게 되는 것입니다. 

 

그리고 별을 출력해주는 것은 2*i -1을 통해 1, 3, 5, 7, 9 이런식으로 늘어나도록 설정을 해주었습니다. 

 

두번째 for문

두 번째 for문은 감소하는 방식이기 때문에 int i = n-1로 잡아주었고 i >=1보다 클 때 i--가 되도록 해주었습니다. 예제처럼 n이 5일때는 4부터 시작을 해줍니다.

 

이중 for문의 안쪽 첫번째 for문에서는 공백이 0 , 1, 2, 3, 4 이런식으로 증가해야 하기 때문에 j = 1부터 n - i 번째까지 넣어주었습니다. 증가하려면 i가 점점 감소하는 상태가 됩니다. 

 

그리고 별은 계속해서 감소해야 하기 때문에 별이 2 * i - 1인 것은 전에 식과 동일하지만 이번에 i는 감소하기 때문에 별이 9 7 5 3 1 이런 식으로 감소하게 됩니다. 

 

 

반응형