본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 2447 별찍기 - 10

by 까망 하르방 2021. 2. 18.
반응형

출처: https://www.acmicpc.net/problem/2447

Approach

 

 

규칙적으로 형성되는 모양에서 왼쪽 상단의 꼭지점을 시작점으로 잡는다.

최소 크기를 n = 3으로 잡아 좌측 상단 시작점에서부터 재귀적으로 별 모양 형성

 

 [문제] BOJ 별 찍기 시리즈

 

[문제] BOJ 별 찍기 시리즈

[BOJ] 2438 별 찍기 - 1 [BOJ] 2439 별 찍기 - 2 [BOJ] 2440 별 찍기 - 3 [BOJ] 2441 별 찍기 - 4 [BOJ] 2442 별 찍기 - 5 [BOJ] 2443 별 찍기 - 6 [BOJ] 2444 별 찍기 - 7 [BOJ] 2445 별 찍기 - 8 [BOJ] 2446 별..

zoosso.tistory.com


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

댓글