BOJ 2447 - 별 찍기 - 10
- 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