[2448] 별찍기 - 11

1 minute read

풀이

  1. 충분한 크기의 배열을 만듭니다. 입력 n에 대해서 row는 n, col은 2n-1까지 사용합니다. n의 최대가 3072이므로 충분히 큰 배열을 만들어야 합니다. 저는 1만 * 1만으로 했습니다.
  2. 제일 꼭대기의 의 좌표를 계산해서 배열에 저장해줍니다. a[0][n - 1] = ‘’;
  3. 제일 위쪽읜 row를 0번이라고 할 때 row%3의 결과에 따라서 아래의 4 가지 연산을 진행합니다.
  • r%3 == 1 : 현재 좌표가 ‘‘이면, (왼쪽아래), (오른쪽 아래)를 ‘‘으로 바꿔줍니다.
  • r%3 == 2 : 현재 좌표가 ‘‘이면, (왼쪽아래),(바로아래) ,(오른쪽 아래)를 ‘‘으로 바꿔줍니다.
  • r%3 == 3 : 현재 좌표가 ‘‘이 아니고, 오른쪽 좌표가 ‘‘이면 (바로 아래)의 값을 바꿔줍니다. ‘‘이면 ‘_‘로, ‘_‘면 ‘‘로
  • r%3 == 3 : 현재 좌표가 ‘‘이고, 오른쪽 좌표가 ‘‘가 아니면 (오른쪽 아래)의 값을 ‘*‘로 바꿔줍니다.

주의사항

잘 적혀있는 주의사항을 한 번 확인해보시는 것도 좋습니다.

★☆★☆★ [필독] 별찍기 - 11 FAQ ★☆★☆★

코드

#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;
}


Tags:

Categories:

Updated: