

다이아몬드 형태로 별을 찍는 문제이다.
#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()를 활용해서 반복 조건을 구성했다.
이런 문제는 절반을 넘어가면 규칙이 바뀌기에 구간을 나눠서 풀어주는 것이 좋다.
구간은 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;
}
가 된다.
확실히 반복 조건을 찾는데 걸리는 시간도 줄고, 훨씬 덜 복잡하다. 다음부턴 이 방식으로 풀어야겠다.

우리는 이 구간만 출력해야한다. 이를 넘어가는 구간을 출력하면 오답처리된다.
다시말해 공백-별-공백 으로 출력하면 오답처리되고, 공백-별 출력해야 정답처리가된다.
이런 문제는 대칭이라고 절댓값 함수로 풀려고 접근하면 반복 조건을 찾는데 너무 오랜 시간이 걸린다.
따라서 구간을 나눔으로써 문제를 간단화하고, 반복 조건을 빠르게 찾아내자.