[2448] 별찍기 - 11
풀이
- 충분한 크기의 배열을 만듭니다. 입력 n에 대해서 row는 n, col은 2n-1까지 사용합니다. n의 최대가 3072이므로 충분히 큰 배열을 만들어야 합니다. 저는 1만 * 1만으로 했습니다.
- 제일 꼭대기의 의 좌표를 계산해서 배열에 저장해줍니다. a[0][n - 1] = ‘’;
- 제일 위쪽읜 row를 0번이라고 할 때 row%3의 결과에 따라서 아래의 4 가지 연산을 진행합니다.
- r%3 == 1 : 현재 좌표가 ‘‘이면, (왼쪽아래), (오른쪽 아래)를 ‘‘으로 바꿔줍니다.
- r%3 == 2 : 현재 좌표가 ‘‘이면, (왼쪽아래),(바로아래) ,(오른쪽 아래)를 ‘‘으로 바꿔줍니다.
- r%3 == 3 : 현재 좌표가 ‘‘이 아니고, 오른쪽 좌표가 ‘‘이면 (바로 아래)의 값을 바꿔줍니다. ‘‘이면 ‘_‘로, ‘_‘면 ‘‘로
- r%3 == 3 : 현재 좌표가 ‘‘이고, 오른쪽 좌표가 ‘‘가 아니면 (오른쪽 아래)의 값을 ‘*‘로 바꿔줍니다.
주의사항
잘 적혀있는 주의사항을 한 번 확인해보시는 것도 좋습니다.
코드
#include <iostream>
#include <queue>
using namespace std;
char a[10000][10000];
int main() {
int n; cin >> n;
a[0][n - 1] = '*';
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2 * n - 1; j++) {
if (i % 3 == 0) {
if (a[i][j] == '*') {
a[i + 1][j - 1] = '*';
a[i + 1][j + 1] = '*';
}
}
else if (i % 3 == 1) {
if (a[i][j] == '*') {
a[i + 1][j - 1] = '*';
a[i + 1][j] = '*';
a[i + 1][j + 1] = '*';
}
}
else if ( i % 3 == 2) {
if (j == 2 * n - 2) break;
if (a[i][j] != '*' && a[i][j+1] == '*') {
if (a[i + 1][j] == '*') a[i + 1][j] = '_';
else if (a[i + 1][j] != '*') a[i + 1][j] = '*';
}
else if (a[i][j] == '*' && a[i][j+1] != '*') {
a[i + 1][j + 1] = '*';
}
}
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2 * n - 1; j++) {
if (a[i][j] == '*') {
printf("%c", a[i][j]);
}
else {
printf(" ");
}
}
printf("\n");
}
return 0;
}