본문 바로가기
알고리즘/백준 & swacademy

BOJ 2448 - 별찍기11

by sun__ 2019. 7. 4.

https://www.acmicpc.net/problem/2448

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (k ≤ 10)

www.acmicpc.net

재귀를 이용해서 풀어주면 된다. boj 2447문제도 재귀를 활용한 별찍기 문제인데 2448이 생각하는데 조금더 시간이 걸렸다.

 

출력은 잘 되는데 자꾸 틀렸습니다가 떠서 찾아봤더니 백준에선 출력을 읽을때 null을 읽으면 틀렸습니다 처리를 한다고 한다.

 

가로의 길이가 세로의 길이의 두배인 것을 잘 확인해서 문제를 풀었지만 map[][]을 선언할때 가로길이를 두배로 두지 않아서 1차로 헤맸다.

 

map[][]을 ' '로 fill해줄때 선언한 것에 맞게 여기도 가로길이를 세로길이의 두배로 두지않아서 2차로 헤맸다.

('틀렸습니다'가 아니라 '시간초과'가 떠서 더 헤맸다.. 멀쩡한 재귀함수만 두들기면서 한 시간은 시간 허비한 것 같다..)

 

좀 침착하게 문제를 풀 필요가 있는 것 같다ㅠㅠ

 

#include <cstdio>
#include <algorithm>
using namespace std;

const int MAX_V = 3072;

char map[MAX_V][MAX_V*2];

void make_map(int y, int x) {
	map[y][x] = '*';
	map[y + 1][x - 1] = map[y + 1][x + 1] = '*';
	for (int i = 0; i < 5; i++) map[y + 2][x - 2 + i] = '*';
}

void go(int cy, int cx, int n) {
	if (n == 3) {
		make_map(cy, cx);
		return;
	}
	go(cy, cx, n / 2);
	go(cy + n / 2, cx - n / 2, n / 2);
	go(cy + n / 2, cx + n / 2, n / 2);

}

int main() {
	int n;
	fill(&map[0][0], &map[MAX_V - 1][MAX_V*2], ' ');
	scanf("%d", &n);
	go(0, n - 1, n);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n * 2 - 1; j++)
			printf("%c", map[i][j]);
		printf("\n");
	}
}

'알고리즘 > 백준 & swacademy' 카테고리의 다른 글

BOJ 1182 - 부분수열의 합  (0) 2019.07.06
BOJ 9663 - N QUEEN  (0) 2019.07.06
BOJ 15649 - N과 M (1~12)  (0) 2019.07.06
BOJ 1074 - Z  (0) 2019.07.04
(인강)기초-dp1  (0) 2019.06.23