• n이 주어지면 n x n 크기의 문제에서 주어지는 패턴으로 출력하는 문제이다.

문제 풀이

  • edge case를 1x1로 잡고 정수배열에 먼저 값을 저장해놓은 후 string으로 옮겨서 한 줄씩 출력했었다. ' ''*'' '가 훨씬 적기 때문에 배열을 모두 '*'로 채워놓았다고 가정 후 공백이 들어갈 곳을 바꿨다.
소스코드
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
#include<bits/stdc++.h>
using namespace std;

int n, nl;
char* cm;

void s(int si, int sj, int l){
	if(l<=3){
		cm[(si+1)*nl+sj+1]=' ';
		return;
	}
	for(int i=si+l/3;i<si+2*l/3;i++) for(int j=sj+l/3;j<sj+2*l/3;j++) cm[i*nl+j]=' ';
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++){
			if(i==1 && j==1) continue;
			s(si+i*l/3, sj+j*l/3, l/3);
		}
}

int main()
{
	ios::sync_with_stdio(0);
	cin>>n;
	nl=n+1;
	cm=new char[n*(n+1)+1];
	for(int i=0;i<n*(n+1);i++) cm[i]='*';
	cm[n*(n+1)]='\0';
	for(int i=n;i<n*(n+1);i+=n+1) cm[i]='\n';
	s(0, 0, n);
	cout<<cm;
}

풀고나서

  • 실행 시간이 44ms로 나쁜편은 아니었다. string을 이용해서 한 줄씩 출력해서 빨랐을 것이다. 하지만 처음부터 char형 배열을 사용해 푸는 풀이를 보았고 나름대로 커팅을 해보았다. edge case를 3x3으로 바꾸고 출력할 배열을 1차원 char형 배열로 만든 후 출력을 1회로 줄이니까 시간이 12ms로 줄었다.맞은 사람

  • 배열 초기화를 검색하다가 유용한 코드를 찾았다. jacking75님의 블로그에서 본 코드이다.

1
2
3
4
template<typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val){
    std::fill( (T*)array, (T*)(array+N), val );
}
  • val을 배열의 자료형에 맞게 캐스팅해야 한다.

  • 다차원 배열도 일차원처럼 간단하게 적용가능하다.

  • std::fill을 이용했기 때문에 마찬가지로 동적 할당한 배열에 대해서는 적용할 수 없다.

Leave a comment