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

[BOJ] 백준 2448 별찍기 - 11

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

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

Approach

n이 주어졌을 때, 아래와 같은 별 모양을 형성하는 문제이다.

 

해당 문제는 다음과 같이 접근해보았다.

재귀적으로 아래의 각 삼각형 상단 좌표를 기준으로 해서 별모양을 형성

: (1) - (2) - (3) - [4]

 

※ Test Case 통과를 위해서는 아래사항을 주의.

1. null문자는 단 한개도 출력해서는 안된다.

    일부 환경 (예: 비주얼 스튜디오)에서는 널 문자가 마치 공백처럼 출력되어 눈에 보이지 않지만, 

    널 문자와 공백은 엄연히 다르며, 채점 프로그램은 단 한 개의 널 문자라도 발견되면 무조건 오답으로 처리

    공백은 무조건 공백 문자 ' ' 띄워쓰기를 이용해 출력.

2. 출력 예제를 드래그해보면 모든 줄은 같은 길이의 문자를 출력하고 있기에

    별 뒤에 공백밖에 남은 것이 없더라도 다 출력해줘야 합니다.

3. 출력의 크기가 어디까지 갈 수 있을지 잘 생각해보세요.

    이차원 배열을 이용한다면 세로는 최대 3*2^10이지만 세로는 가로의 2배이다. 

4. 별(*)을 출력할 때 속도제한에 신경써야 한다.

    가령, Java의 경우 System.out.print로는 속도의 한계가 있다. 

    → StringBuilder 이용.

 

 [문제] 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);
 
        // 가장 작은 N은 3이다.
        int N = Integer.parseInt(sc.next());
         
        // 인덱스를 1,1부터  시작한다.
        char[][] arr = new char[N + 1][N*2 + 1];
        for(int i=1; i<=N; i++) {
            for(int j=1; j<=2*N; j++) {
                arr[i][j] = ' ';
            }
        }
        List<Vertex> list = new ArrayList<>();
        list.add(new Vertex(1, N));
         
        int target = N;
        while(true) {
            target = target / 2;
            if(target < 3) {
                break;
            }
             
            int listSize = list.size();
            for(int i=0; i<listSize; i++) {
                Vertex v = list.get(i);
                list.add(new Vertex(v.x + target, v.y - target));
                list.add(new Vertex(v.x + target, v.y + target));
            }
             
        }
 
        // 해당 정점들로 최소단위 삼각형태의 별모양을 형성한다.
        for(int i=0; i<list.size(); i++) {
            Vertex v = list.get(i);
             
            arr[v.x][v.y] = '*';
            arr[v.x+1][v.y-1] = '*'; arr[v.x+1][v.y+1] = '*';
            for(int j=v.y-2; j<=v.y+2; j++) {
                arr[v.x+2][j] = '*';
            }
        }
         
        StringBuilder sb = new StringBuilder();
        for(int i=1; i<=N; i++) {
            for(int j=1; j<=2*N; j++) {
                if(i==N && j==2*N) {
                    break;
                }
                sb.append(arr[i][j]);
            }
            if(i != N) {
                sb.append("\n");    
            }
             
        }
        System.out.print(sb.toString());
         
    }
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 15552 빠른 A+B  (0) 2021.02.18
[BOJ] 백준 2447 별찍기 - 10  (2) 2021.02.18
[BOJ] 백준 1003 피보나치 함수  (0) 2021.02.18
[BOJ] 백준 2577 숫자의 개수  (0) 2021.02.17
[BOJ] 백준 2487 섞기 수열  (0) 2021.02.17

댓글