반응형
출처: https://www.acmicpc.net/problem/2447
Approach
규칙적으로 형성되는 모양에서 왼쪽 상단의 꼭지점을 시작점으로 잡는다.
최소 크기를 n = 3으로 잡아 좌측 상단 시작점에서부터 재귀적으로 별 모양 형성
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Vertex{
int x, y;
public Vertex(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = Integer.parseInt(sc.next());
// 인덱스를 0,0부터 시작한다.
char[][] arr = new char[N][N];
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
arr[i][j] = ' ';
}
}
List<Vertex> list = new ArrayList<>();
list.add(new Vertex(0, 0));
// N = 1은 예외적으로 처리
if(N == 1) {
System.out.println("*");
return;
}
int target = N;
while(true) {
target = target / 3;
if(target < 3) {
break;
}
int listSize = list.size();
for(int i=0; i<listSize; i++) {
Vertex v = list.get(i);
for(int j=1; j<3; j++) {
list.add(new Vertex(v.x, v.y + j*target));
}
list.add(new Vertex(v.x + target, v.y));
list.add(new Vertex(v.x + target, v.y + 2*target));
for(int j=0; j<3; j++) {
list.add(new Vertex(v.x + 2*target, v.y + j*target));
}
}
}
// 해당 정점들로 별모양을 갖춰간다.
for(int i=0; i<list.size(); i++) {
Vertex v = list.get(i);
// 중간 두 개
arr[v.x+1][v.y] = '*'; arr[v.x+1][v.y+2] = '*';
for(int j=0; j<3; j++) {
// 상단 별 3개
arr[v.x][v.y + j] = '*';
// 하단 별 3개
arr[v.x+2][v.y + j] = '*';
}
}
// 결과 출력
StringBuilder sb = new StringBuilder();
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
sb.append(arr[i][j]);
}
sb.append("\n");
}
System.out.print(sb.toString());
}
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 6593 상범 빌딩 (0) | 2021.02.18 |
---|---|
[BOJ] 백준 15552 빠른 A+B (0) | 2021.02.18 |
[BOJ] 백준 2448 별찍기 - 11 (2) | 2021.02.18 |
[BOJ] 백준 1003 피보나치 함수 (0) | 2021.02.18 |
[BOJ] 백준 2577 숫자의 개수 (0) | 2021.02.17 |
댓글