Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 지연로딩
- 멀록 조명등
- til
- 코딩테스트실력진단
- JPA
- TagLibraryValidator
- 공부 기록
- IT 좀 아는 사람
- 구름톤 트레이닝
- 코드트리
- 금 채굴하기
- 구름톤
- spring
- 공부하기 싫어 #그래도 해야해
- 구름톤 챌린지
- 백준
- 백준 #1010 #다리놓기
- 행복한 수열의 개수
- 1005 #ACM craft #백준
- 코드트리 챌린지
- 1931번
- 즉시로딩
- 완전탐색
- @EntityGraph
- 코딩테스트
- 동적 계획법
- Today I Learned
- eager
- 회의실 배정
- 최장 공통 부분수열
Archives
- Today
- Total
화분
[Baekjoon]2448번 별 찍기 - 11 본문
2448번: 별 찍기 - 11 (acmicpc.net)
2448번: 별 찍기 - 11
첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)
www.acmicpc.net
이 문제는 유명한 별찍기 문제의 심화버전 중 하나이다. 수학적인 규칙이 존재하고 그걸 발견해서 구현하면 됐지만, 나 같은 경우 클래스를 활용해서 풀고 싶어졌다. 그래서 아래와 같은 코드를 짜고 설마 돌아가진 않겠지? 생각하며 돌렸는데...
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Fractal f = new Fractal(n);
StringBuilder[] tea = f.makeStar(n);
f.printBigStar(tea, n);
}
static class Fractal{
Fractal top;
Fractal left;
Fractal right;
int height;
StringBuilder[] arr;
public Fractal(int n){
if(n == 3){
arr = new StringBuilder[n];
return;
}
top = new Fractal(n/2);
left = new Fractal(n/2);
right = new Fractal(n/2);
height = n;
arr = new StringBuilder[n];
}
public StringBuilder[] makeStar(int n) {
if (n == 3) {
arr[0] = new StringBuilder(" * ");
arr[1] = new StringBuilder(" * * ");
arr[2] = new StringBuilder("*****");
return arr;
}
StringBuilder[] resultSb = new StringBuilder[n];
StringBuilder[] tb = top.makeStar(n / 2);
StringBuilder[] lb = left.makeStar(n / 2);
StringBuilder[] rb = right.makeStar(n / 2);
StringBuilder temp;
for(int j = 0; j < n / 2; j++){
temp = new StringBuilder();
for(int i = 0; i < n/2; i++){
temp.append(" ");
}
temp.append(tb[j]);
for(int i = 0; i < n/2; i++){
temp.append(" ");
}
resultSb[j] = temp; //top triangle
}
int count = n/2;
for(int i = 0 ; i < n/2; i++){
StringBuilder sb = new StringBuilder();
sb.append(lb[i]);
sb.append(" ");
sb.append(rb[i]);
resultSb[count++] = sb;
}
return resultSb;
}
public void printBigStar(StringBuilder[] sb, int n){
for(int i = 0; i < n; i++){
System.out.println(sb[i]);
}
}
}
}
통과가 됐다!
왜지? 아무튼 기쁘다. 메모리 한도인 256mb를 가까스로 초과하지 않았다. 다른 분들이 푸신 걸 보니 속도가 나보다 확연히 빠른 점을 봐선 아무래도 재귀나 반복 등 수학을 활용한 효율적인 풀이가 존재하는 거 같다.
큰 기대는 안했는데 통과돼서 기쁘다..!
'Study > CODINGTEST' 카테고리의 다른 글
[Baekjoon]1107번 리모컨 풀이 (0) | 2023.12.11 |
---|---|
[코드트리 챌린지] 홀수 짝수의 묶음 (0) | 2023.09.13 |
[코드트리 챌린지] 금 채굴하기 (0) | 2023.09.12 |
[코드트리 챌린지] 트로미노 (0) | 2023.09.11 |
[구름톤 챌린지 19일차] 대체 경로 (0) | 2023.09.10 |