[백준] 다이아몬드 별찍기

YUN·2026년 2월 21일

C++

목록 보기
39/85


다이아몬드 형태로 별을 찍는 문제이다.

1. 나의 풀이

#include <iostream>
    
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int N;
    cin >> N;
    for(int i=0; i<2*N-1; i++) {
        for(int j=0; j<abs(N-i-1); j++) cout << " ";
        for(int k=0; k<2*N-1-2*abs(N-i-1); k++) cout << "*";
        cout << "\n";
    }
    return 0;
}

다이아몬드가 대칭임을 이용해 절댓값을 반환하는 <iostream\> 헤더의 함수인 abs()를 활용해서 반복 조건을 구성했다.

2. 다른 풀이

이런 문제는 절반을 넘어가면 규칙이 바뀌기에 구간을 나눠서 풀어주는 것이 좋다.

구간은 0~N, 0~N-1로 나누면 총 2*N-1개의 줄을 출력 가능하다.

각 구간에서 반복 조건을 아래와 같이 찾아준다.

<0~N 구간>
공백은 N-i-1
별은 1+2i

<0~N-1 구간>
공백은 i+1
별은 2N-3-2i

이를 코드로 구현하면

#include <iostream>

using namespace std;

int main() {
    int N;
    cin >> N;
    for(int i=0;i<N; i++) {
        for(int j=0; j<N-i-1 ; j++) cout << " ";
        for(int j=0; j<1+2*i; j++) cout <<"*";
        cout << "\n";
    }
    for (int i=0; i<N-1; i++) {
        for(int j=0; j<i+1 ; j++) cout << " ";
        for(int j=0; j<2*N-3-2*i; j++) cout <<"*";
        cout << "\n";
    }
    return 0;
}

가 된다.

확실히 반복 조건을 찾는데 걸리는 시간도 줄고, 훨씬 덜 복잡하다. 다음부턴 이 방식으로 풀어야겠다.

3. 배운 점

(1) 별찍기에서 우측 공백은 나타내면 안된다.

우리는 이 구간만 출력해야한다. 이를 넘어가는 구간을 출력하면 오답처리된다.

다시말해 공백--공백 으로 출력하면 오답처리되고, 공백- 출력해야 정답처리가된다.

(2) 구간을 나누자

이런 문제는 대칭이라고 절댓값 함수로 풀려고 접근하면 반복 조건을 찾는데 너무 오랜 시간이 걸린다.

따라서 구간을 나눔으로써 문제를 간단화하고, 반복 조건을 빠르게 찾아내자.

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글