๋ฌธ์
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๋ฌธ์ ์ด์ฉํด ๊ฒ์ํ๊ณ ์ต์ข ์ ์ผ๋ก ๊ณต๋ฐฑ ์ญ์ผ๊ฐํ์ ์ฝ์ ํ๋ ๋ฐฉ์์ด๋ค.