λͺ©λ‘μœΌλ‘œ
λ°±μ€€

BOJ - [Array - 2448 별찍기 - 11] - GOLD IVπŸ₯‡

https://www.acmicpc.net/problem/2448 이 문제 λ˜ν•œ β€œ2447 - 별찍기 - 10” 와 λΉ„μŠ·ν•œ 문제둜 λ‹€μ–‘ν•œ λͺ¨μ–‘μœΌλ‘œ 별을 μ°λŠ” λ¬Έμ œλ‹€. 이번 λ¬Έμ œλ„ 2447번과 λΉ„μŠ·ν•˜κ²Œ ν”„λž™νƒˆ λ„ν˜• ν˜•νƒœμ˜ 별을 μ°λŠ”λ° μ΄λ²ˆμ—λŠ” 2447번 λ¬Έμ œμ—μ„œ ν”„λž™νƒˆ λ„ν˜•μ˜ μ˜ˆμ‹œλ‘œ...

1λΆ„ 읽기

문제

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

풀이

이 문제 λ˜ν•œ β€œ2447 - 별찍기 - 10” 와 λΉ„μŠ·ν•œ 문제둜 λ‹€μ–‘ν•œ λͺ¨μ–‘μœΌλ‘œ 별을 μ°λŠ” λ¬Έμ œλ‹€.

이번 λ¬Έμ œλ„ 2447번과 λΉ„μŠ·ν•˜κ²Œ ν”„λž™νƒˆ λ„ν˜• ν˜•νƒœμ˜ 별을 μ°λŠ”λ° μ΄λ²ˆμ—λŠ” 2447번 λ¬Έμ œμ—μ„œ ν”„λž™νƒˆ λ„ν˜•μ˜ μ˜ˆμ‹œλ‘œ λ³΄μ—¬μ€¬λ˜ μ‚Όκ°ν˜• 사진을 λ™μΌν•˜κ²Œ κ΅¬ν˜„ν•΄μ•Όλ˜λŠ” λ¬Έμ œλ‹€. 2447번 문제 : https://hoshi2710.github.io/%EB%B0%B1%EC%A4%80/2447

좜처 : https://m.blog.naver.com/jamogenius/220886627296

κ·ΈλŸ¬λ‚˜ 2447번 μ—μ„œ ν’€μ—ˆλ˜ 방식을 κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ‹ˆ μ‹œκ°„ μ΄ˆκ³Όμ— 걸렀버렸닀.

2447λ²ˆμ—μ„œλŠ” λ¨Όμ € 제일 메인인 큰 λ„ν˜•μ„ λ§Œλ“€κ³  src배열에 그것보닀 μž‘μ€ ν”„λž™νƒˆ λ„ν˜•μ„ λ§Œλ“€κ³  결과물에 뢙이기λ₯Ό λ°˜λ³΅ν–ˆλŠ”λ° μ΄λ¬Έμ œμ—μ„œλŠ” κ·Έ 과정을 κ·ΈλŒ€λ‘œ μ μš©ν–ˆμ„λ•Œ 과정이 더 λ³΅μž‘ν•΄μ§€κ³  더 λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λ˜μ–΄ μ΄λ²ˆμ—λŠ” 방법을 μ•½κ°„ λ³€ν˜• μ‹œμΌœλ³΄μ•˜λ‹€.

λ°”λ‘œ 제일 큰 λ„ν˜•μ„ 그리고 λ‚œ λ‹€μŒ κ·Έ 이후 μž‘μ€ μ‚Όκ°ν˜•μ„ λΆ™μ΄λŠ” λŒ€μ‹  μ‚Όκ°ν˜• λͺ¨μ–‘μ˜ κ³΅λ°±μ˜μ—­μ„ 계속 λ§Œλ“œλŠ” 것이닀.

λŒ€μΆ© 이런 μ‚Όκ°ν˜•μ„ 제일 λ©”μΈμœΌλ‘œ λ¨Όμ € λ§Œλ“ λ‹€μŒ

이런 λͺ¨μ–‘μœΌλ‘œ 곡백을 λ„£μ–΄ μ—­ μ‚Όκ°ν˜• λͺ¨μ–‘μœΌλ‘œ ꡬ멍을 뚫고 이λ₯Ό λ°˜λ³΅ν•˜λ„λ‘ ν•˜λŠ” 것이닀.

μ†ŒμŠ€

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main()
{
	int height = 0, width = 0, looped = 1;
	bool** res; //[μ„Έλ‘œ][κ°€λ‘œ] (False = '*', True = ' ')

	scanf("%d", &height);

	width = height * 2 - 1;
	int origin_width = width, origin_height = height;

	res = (bool**)malloc(sizeof(bool*) * height);
	for (int i = 0; i < height; i++)
	{
		res[i] = (bool*)malloc(sizeof(bool*) * width);
		memset(res[i], true, sizeof(bool) * origin_width);
	}

	for (int j = origin_height - 1; j >= 0; j--) //별찍기
		memset(res[j] + (origin_height - j - 1), false, sizeof(bool) * (width - ((height - j - 1) * 2)));
	for (int j = height / 2; j < height; j++) // κ°€μš΄λ° 빈칸 μ‚½μž…
		memset(res[j] + j + (height == 3 ? 1 : 0), true, sizeof(bool) * ((((width - 1) / 2) - ((j - (height / 2)) * 2)) - (height == 3 && j == 1 ? 1 : 0)));

	while (height != 1)
	{
		width = (width - 1) / 2;
		height /= 2;
		for (int j = 1; j <= origin_height; j += origin_height / looped)
			for (int find = origin_width/2 - j; find < origin_width/2+j; find++)
				if (res[j - 1][find] == false)
					for (int k = 0; k < height; k++) // κ°€μš΄λ° 빈칸 μ‚½μž…
						memset(res[j - 1 + k + height] + find - ((width - 1) / 2) + k, true, sizeof(bool) * (height != 1 ? (width - 2 * k) : 1));
		looped *= 2;
	}

	for (int i = 0; i < origin_height; i++)
	{
		for (int j = 0; j < origin_width; j++)
			putchar(!res[i][j] ? '*' : ' ');
		putchar('\n');
	}

	free(res);
}

while λ¬Έ λΆ€λΆ„μ—μ„œ μ—°μ‡„μ μœΌλ‘œ μ—­μ‚Όκ°ν˜• 곡백 ꡬ멍을 λ§Œλ“œλŠ” μž‘μ—…μ΄ 이루어 μ§€λŠ”λ° 제일 큰 μ‚Όκ°ν˜•μ˜ 높이 값을 μ΄μš©ν•΄ 1,2,4,8개의 μ€„λ‘œ μ„Έλ‘œ ꡬ역을 λ‚˜λˆ„μ–΄ μ—­μ‚Όκ°ν˜•μ΄ λ“€μ–΄κ°ˆ ꡬ간을 for문을 μ΄μš©ν•΄ κ²€μƒ‰ν•˜κ³  μ΅œμ’…μ μœΌλ‘œ 곡백 μ—­μ‚Όκ°ν˜•μ„ μ‚½μž…ν•˜λŠ” 방식이닀.

λŒ“κΈ€