본문 바로가기

백준/C++

[BaeKJoon/C++] 백준 2443 별 찍기 - 6

반응형

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

 

2443번: 별 찍기 - 6

첫째 줄에는 별 2×N-1개, 둘째 줄에는 별 2×N-3개, ..., N번째 줄에는 별 1개를 찍는 문제 별은 가운데를 기준으로 대칭이어야 한다.

www.acmicpc.net

코드

#include <iostream>
 
using namespace std;
 
int main() {
 
    int test;
    cin>>test;
 
    int m=1;
 
    for(int i=0; i<test; i++){
        for(int j=0; j<i; j++){
            cout<<" ";
        }
        for(int j=i; j<test*2-m; j++){
            cout<<"*";
        }
        m++;
        cout<<"\n";
    }
    return 0;
}
 
cs

풀이

공백 'o'에 대한 for문

#include <iostream>
 
using namespace std;
 
int main() {
 
    int test;
    cin>>test;
 
    for(int i=0; i<test; i++){
        for(int j=0; j<i; j++){
            cout<<"*";
        }
        cout<<"\n";
    }
    return 0;
}
 
// test=5
// *
// **
// ***
// ****
 
cs

 

공백 'o'은 해결되었고 이제 별과 공백 'x'에 대한 것만 남았다.

 

여기서 가장 중요한 코드는

for(int j=i; j<test*2-m; j++){
            cout<<"*";
        }
        m++; 이것인데
int j=i는 i가 n번 반복한다면 그만큼 공백 'o'이 n번 생긴다는 뜻이다.
위에 표를 보면 i가 0일 때 별이 9개다.
그말은 즉, int j=i; i<test*2-m여기서 j는 0부터 8까지 별이 반복한다는 것이다.
 
m++은 i for문이 반복할수록 카운트되어 숫자가 커져, 'x'에대한 공백을 만들어낼 수 있다.
test*2에서 m을 빼서 별의 반복수를 줄이기 때문이다.
 

왼쪽에 있는 'o'공백은 i로 부터 만들고, 오른쪽에 있는 'x'는 test*2에서 m을 빼서 만들 수 있다.

 

결론 : 생각의 차이긴 한데, 별과 별 개수의 관점보다는 공백의 관점을 두면서 코드를 생각한다면 더 쉽게 작성할수 있다고 생각한다.

 

 

반응형