Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- 비트마스크
- SSAFY
- 메모리풀
- 크루스칼
- 링크드리스트
- DP
- 시뮬레이션
- 순열
- dfs
- 세그먼트 트리
- 이분 탐색
- 중복 순열
- Knapsack
- 우선순위 큐
- BFS
- 빠른 입출력
- 스택
- 완전 탐색
- 분할 정복
- 문자열
- BeautifulSoup
- 피보나치 수
- 그리디
- 재귀
- 백트래킹
- lis
- 조합
- 클래스
- MST
- 큐
Archives
- Today
- Total
작심 24/7
[백준] 2447번 별 찍기 - 10 본문
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 �
www.acmicpc.net
분할 정복 알고리즘 문제라 한다.
분할 정복법이란 문제를 나눌 수 없을 때까지 나누어서 각각을 풀고 다시 합병하는 방법인데
N이 27이면 그림처럼 27X27 -> 9X9 -> 3X3 -> 1X1까지 분할시킬 수 있다.
언제가 공백인지가 관건인데 저런 식으로 공백인 좌표들을 모아 두고 규칙성을 찾아보니
N이 27인 경우엔 좌표를 9, 3, 1로 나눈 값에 %3을 한 값이 1일 때
즉, i/N/3%3, i/N/3/3%3, i/N/3/3/3%3 ... 이 1인 경우가 공백인 경우였다.
1X1로 만들기 위해 재귀 호출할 때 N을 3으로 나눈 값을 넣어주고
공백인 경우를 위해 i와 j를 각각 3으로 나눈 값을 넣어준다.
#include <iostream>
using namespace std;
void Star(int i, int j, int N) {
if (i % 3 == 1 && j % 3 == 1) {
cout << " ";
return;
}
else if (N == 1) {
cout << "*";
return;
}
else Star(i / 3, j / 3, N / 3);
}
int main() {
int N;
cin >> N;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
Star(i, j, N);
}
cout << "\n";
}
return 0;
}
공백인 경우를 어떻게 처리해야할지 감도 안 잡혀서 재귀 함수 안에서 for문으로 어떻게 해보려고 했는데
3X3씩이 아니라 1X1씩 차근차근 출력한다 생각하니 좀 풀렸다.
하지만 아직 분할 정복법이 와 닿지는 않는다. 내가 재귀를 잘 쓰지 못하는 것 같다ㅜㅜ
'백준' 카테고리의 다른 글
[백준] 10989번 수 정렬하기 3 (0) | 2020.05.22 |
---|---|
[백준] 11729번 하노이 탑 이동 순서 (0) | 2020.05.20 |
[백준] 1002번 터렛 (3) | 2020.05.20 |
[백준] 1929번 소수 구하기 (2) | 2020.05.20 |
[백준] 1193번 분수찾기 (0) | 2020.05.20 |
Comments