https://www.acmicpc.net/problem/2448
풀이
별 찍기 - 10(https://kyj0032.tistory.com/16) 과 비슷하게 풀었다.
f(n) : 크기가 n인 삼각형 출력
g(n, r) : 크기가 n인 삼각형의 r번째 줄 출력
N==3
..*.. <- g(3, 0)
.*.*. <- g(3, 1)
***** <- g(3, 2)
N==9 일때는
3x3 공백 네모, f(3), 3x3 공백 네모
f(3), 1x3 공백 네모, f(3)
으로 구성되어있다. 이때 공백 네모는 (N/2)x(N/2) 넓이를 차지한다.
수도 코드
f(n) { // 높이가 n인 삼각형 출력
for(0~n-1행까지)
g(n, r)
\n 출력
}
g(n, r) { // 높이가 n인 삼각형의 r번째 행 출력
if (n==3)
'..*..'
'.* *.'
'*****' 각각 출력
return
if (r < n/2) { // 높이 N을 반으로 나눴을 때, 위쪽은 공백 네모가 존재해야함
공백 * N/2개 출력
g(n/2, r) 출력
공백 * N/2개 출력
}
else { // 밑 쪽은 두 개의 세모 사이에 한 줄짜리 공백이 존재해야 함
g(n/2, r%(n/2)) 출력
공백 1개 출력
g(n/2, r%(n/2)) 출력
}
}
코드
/*boj g4 2448 별 찍기 - 11*/
#include <iostream>
using namespace std;
int N;
void g(int n, int r) {
if (n == 3) {
if (r == 0)
cout << " * ";
else if (r == 1)
cout << " * * ";
else if (r == 2)
cout << "*****";
return;
}
if (r < n / 2) { // 앞에 공백
for (int i = 0; i < n / 2; i++)
cout << " ";
g(n / 2, r);
for (int i = 0; i < n / 2; i++)
cout << " ";
} else {
g(n / 2, r % (n / 2));
cout << " ";
g(n / 2, r % (n / 2));
}
}
void f(int n) {
for (int i = 0; i < n; i++) {
g(n, i);
cout << "\n";
}
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
f(N);
}
'알고리즘' 카테고리의 다른 글
백준 g4 9663 N-Queen c++ (0) | 2024.01.15 |
---|---|
백준 s3 15649 N과 M (1) c++ (0) | 2024.01.15 |
백준 2447 g5 별 찍기 - 10 c++ (0) | 2024.01.13 |
백준 s1 1074 Z c++ (0) | 2024.01.13 |
백준 g5 11729 하노이 탑 이동 순서 c++ (0) | 2024.01.13 |