[알고리즘] 백준 10994 별 찍기

2021. 1. 17. 18:33알고리즘

[알고리즘] 백준 10994  별 찍기

 

www.acmicpc.net/problem/10994

 

10994번: 별 찍기 - 19

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net

이 문제는 알고리즘 분류에 재귀로 분류되어 있었는데 나는 재귀로 풀 자신이 없어서 그냥 내 방식대로 풀었다. 풀리긴 해서 다행이었다.

1 -> *

 

2 ->   *****

          *   *

          * * *

          *   *

          *****

3 -> *********

        * *

        * ***** *

        * * * * * *

       * * * * * * *

       * ***** * * *

       *********

 

옮겨와서 이상하게 돼버렸다...

나는 우선 박스의 규칙성을 찾는데에 노력을 했고 그 결과 박스가 정사각형이고 num + 3*(num-1) 이라는 것을 알아냈다. 그리고 겉에 가장 큰 박스를 만들고 나서 안에 박스를 하나 더 만들어야 하는데 그 간격이 2라는 것을 알아내어서 것에 큰 박스를 만들고 그 안에 가로세로 간격을 2칸씩 띄운 뒤 크기가 작은 박스를 계속 만들어 내는 식으로 이 문제를 해;결하였다. 처음에는 막막하기만 했는데 계속 하다보니 점점 문제가 완성되며 풀렸다.

#include<stdio.h>

char box[500][500] = {'0'};
int startnum =0;
int cols(int num)
{
 if(num == 1)
  return 1;

 return num + 3*(num -1);
}

void upside(int num){
 for(int i =startnum; i< cols(num) + startnum; i++){
	box[startnum][i] = '*';
 }
 //box[startnum][startnum] = '*';
}
void downside(int num){
 int cnum = cols(num) + startnum -1;
 //printf("num: %d cols: %d startnum: %d cnum: %d\n",cols(num),num, startnum, cnum);
 for(int i =startnum; i< cols(num) + startnum; i++){
  box[cnum][i] = '*';
 }
}
void sideside(int num){
 int row = startnum + 1;
 for(int i = startnum + 1; i< cols(num)+ startnum; i++){
  for(int j = startnum; j<cols(num)+ startnum; j++){
  
	if(j == startnum || j == cols(num) +startnum -1){
		box[row][j] = '*';
		continue;
	}
	box[row][j] = ' ';
 }
  row++;
 }
 //box[startnum][startnum] = '*';
}
void writebox(int num)
{
 
 for(int i =num; i>=1; i--){
  if(i == 1){
	box[startnum][startnum] = '*';
	return ;
  }
	
	upside(i);
	sideside(i);
	downside(i);
	startnum += 2;
 }
}

int main(void)
{
 int num;
 scanf("%d", &num);
 writebox(num);
	//upside(3);
	//sideside(3);
	//downside(3);

 for(int i=0; i< cols(num); i++){
  for(int j=0; j < cols(num); j++){
	printf("%c",box[i][j]);
  }
  printf("\n");
 }
 return 0;
}
  

 

 

중간에 이상한 주석까지 가져와 버렸는데 저 주석은 무시해도 좋다. 궁금한 사람을 위해 말해주자면 저건 내가 오류테스트를 했을때 만들어둔 주석이였다.... 아무튼 요즘 재귀를 연습하고 있어서 재귀문제를 풀려고 했었는데 의도치 않게 다른 문제를 손대서 시간을 너무 많이 써버렸다.. 나중에 시간이 된다면 이 코드를 최적화 해서 다시 올려보도록 하겠다. 가능하면 제귀를 사용하는 방법으로 코드를 올리는 것도 나쁘지는 않을것 같다...