나 개발자 진짜 되냐?

바킹독 0x02 문제24 - 별찍기 7 / 백준 2444번 본문

C++을 시작해봐요!/알고리즘을 공부해봐요!

바킹독 0x02 문제24 - 별찍기 7 / 백준 2444번

Snow Rabbit 2025. 8. 25. 19:16

string을 배운 후

조금 문제의 활력이 생기는 듯한 기분

기분만 그렇다.

라고 문제를 읽는데

갑자기 취소하고 싶어 졌다.

string활용을 어떻게 해야 할지 막막해졌기 때문이다.


 

 

시작부터 대뜸 예제 보라는 사가지없는 녀석..

그래도 출력에서 2N -1까지라고 설명해 줘서 쫌?! 고마웠다.

 

 

호오.. 다이아몬드군...

 

원래 5를 쓰면 5줄만 나왔는데 이번엔 5를 쓰고 9줄이 나왔다.

그래서 2N-1줄이라고 한 것 같았다.

 

내 고민은 이것이다.

1 - 4만 규칙을 정해놓고

마지막 5번째는 그냥 2n-1개 별 출력하고

다시 4-1까지 규칙을 정하는 방법

 

또는

그냥 1부터 2N-1 개수만큼 돌리는 것..

도대체 for문이 몇 개인거지.....

 

풀다 보니 전자로 풀었다.

디버깅 없었으면 또 헤맸을....ㅋ

 

 

쓰긴 했다마는.. 너무 긴 거 같아서 ( 약 50줄 )

답지를 보기로 했다.

 

답지도 비슷했다.

차이점이라고는 마지막에 i--로 한 거? 정도?

 for(int i = N - 1; i >= 1; i--) 
 {
    for(int j = 1; j <= N - i; j++) cout << ' ';
    for(int j = 1; j <= 2 * i - 1; j++) cout << '*';
 }

 

꽤 이 방법도 좋다는 생각이 들었다.

 

아까 나는 전자로 풀었는데

후자로 푸는 방법이 있을까? 싶어서 지피티를 찾아봤다.

 

지피티는 참 똑똑하다.

더 간단하고.. 쉽지는 않은 식을 알려주었다.

 

지금 줄은 2N-1줄!

1부터 4까지는 늘어났다가, 

5에서 2N-1개 별을 찍고

다시 6부터 9까지는 별의 개수가 줄어든다.

 

그래서 지피티는

1부터 5까지 별이 늘어나는 패턴

별 : 2i - 1

공백 : N - i

 

6부터 9까지 별이 줄어드는 패턴

별 : ( 2i  -1) - 2(N - 1)

공백 : i - N

 

이 두식을 이용하여 문제를 풀게 된다.

for (int i = 1; i <= 2*N - 1; i++) {
    int stars;
    int spaces;

    if (i <= N) { // 윗부분
        stars = 2*i - 1;
        spaces = N - i;
    } else {      // 아랫부분
        stars = 2*(2*N - i) - 1;
        spaces = i - N;
    }

    cout << string(spaces, ' ') << string(stars, '*') << '\n';
}

 

삼항연산자로 더 줄인 코드도 있다. 나도 삼항연산자 연습 많이 해봐야지!!

for (int i = 1; i <= 2*N - 1; i++) {
    int stars = (i <= N) ? (2*i - 1) : (2*(2*N - i) - 1);
    int spaces = (i <= N) ? (N - i)   : (i - N);
    cout << string(spaces, ' ') << string(stars, '*') << '\n';
}

 

 

삼항연산자

조건 ? 값 1 : 값 2

조건이 이면 값 1 실행

조건이 거짓이면 값 2 실행

 

나중에 또 써먹을 수 있길...!

아니 도대체 이런 생각은 어떻게 하는 걸까?! 참 대단하다.

나는 그냥 하나로 합치면 어떨까.. 한 건데..

대단하다...

 

 

마지막으로 string을 풀며 마친다.

 

혼자 스스로 써봤는데

95% 맞췄으니?

그걸로 됐다.

 

나 잘했다.

아마도