-
[13015] 별 찍기 - 23BOJ 2022. 1. 14. 23:47
https://www.acmicpc.net/problem/13015
13015번: 별 찍기 - 23
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
www.acmicpc.net
<문제>
첫줄과 마지막줄은 다른 줄과 다르게 특별한 공통점이 없다. 이 부분은 그냥 반복문에서 빼서 직접 구현하자.
어처피 중간을 기준으로 대칭이니, [1, n)번째 줄까지만 생각해보도록 하면,
맨 왼쪽의 공백은 j<i,
첫번째 '*'과 두번째 '*', 세번째'*'과 네번째 '*' 사이에 존재하는 2번의 공백은 n-2번 포함된다.
두번째와 세번째 사이의 중앙공백은, 가장 첫번째줄의 공백은 2*n-3번 발생하며,
한줄당 2개씩 줄어드니 j<(2*n-3)-(2*i)가 되겠다.
n번째 줄인 정 가운데는, '*'이 3번밖에 존재하지 않으므로, 첫번째줄처럼 별도로 구현해주었다.
<소스코드>
1234567891011121314151617181920212223242526272829303132333435#include <bits/stdc++.h>using namespace std;int n;string ans[101];int main(void) {cin >> n;int i, j;for (i = 0; i < n; i++) ans[0] += '*';for (i = 0; i < 2 * n - 3; i++) ans[0] += ' ';for (i = 0; i < n; i++) ans[0] += '*';for (i = 1; i < n - 1; i++) {for (j = 0; j < i; j++) ans[i] += ' ';ans[i] += '*';for (j = 0; j < n - 2; j++) ans[i] += ' ';ans[i] += '*';for (j = 0; j < (2 * n - 3) - (i * 2); j++) ans[i] += ' ';ans[i] += '*';for (j = 0; j < n - 2; j++) ans[i] += ' ';ans[i] += '*';}int m = n - 1;for (i = 0; i < n - 1; i++) ans[m] += ' ';ans[m] += '*';for (i = 0; i < n - 2; i++) ans[m] += ' ';ans[m] += '*';for (i = 0; i < n - 2; i++) ans[m] += ' ';ans[m] += '*';for (i = 0; i < n; i++) cout << ans[i] << '\n';for (i = n - 2; i >= 0; i--) cout << ans[i] << '\n';return 0;}cs 'BOJ' 카테고리의 다른 글
[1774] 우주신과의 교감 (0) 2022.01.15 [1826] 연료 채우기 (0) 2022.01.15 [2485] 가로수 (0) 2022.01.12 [1966] 프린터 큐 (0) 2022.01.12 [2805] 나무 자르기 (0) 2022.01.12