본문 바로가기
PS/BOJ

[자바] 백준 13015 - 별 찍기 - 23 (java)

by Nahwasa 2023. 3. 7.

문제 : boj13015

 

 

필요 알고리즘

  • 구현
    • 문제의 입출력을 보고 규칙성을 찾은 뒤 규칙대로 구현해주는 문제이다.

※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.

 

 

풀이

  규칙성을 파악해서 구현해주면 된다. 내 경우엔 크게 맨위, 맨아래, 중간, 그 사이들로 나누어서 생각했다. 코드에서 함수로 나누어두었으니 코드를 확인해보면 될 것 같다.

 

  주의점은 출력할 때 각 줄의 뒤쪽에 공백이 있으면 안된다.

즉, 각 줄이 '***            ' 처럼 출력하면 안되고, 마지막 '*'을 기준으로 '***' 처럼 출력되어야 한다.

 

 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 1<<16);
    private static final StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws Exception {
        new Main().solution();
    }

    public void solution() throws Exception {
        int n = Integer.parseInt(br.readLine());
        StarPrinter sp = new StarPrinter(n);

        sp.printTopAndBottom();
        sp.printUpperMiddle();
        sp.printMiddle();
        sp.printLowerMiddle();
        sp.printTopAndBottom();

        System.out.print(sp.getAnswer());
    }
}

class StarPrinter {
    private static final char STAR = '*';
    private static final char BLANK = ' ';
    private int n;
    private StringBuilder sb;

    public StarPrinter(int n) {
        this.n = n;
        this.sb = new StringBuilder();
    }

    public void printTopAndBottom() {
        printStar(n);
        printBlank(2*n-3);
        printStar(n);
        ln();
    }

    public void printUpperMiddle() {
        for (int i = 1; i <= n-2; i++) {
            printUpperAndLowerMiddle(n, i);
        }
    }

    public void printLowerMiddle() {
        for (int i = n-2; i >= 1; i--) {
            printUpperAndLowerMiddle(n, i);
        }
    }

    public void printMiddle() {
        printBlank(n-1);
        printStar();
        printBlank(n-2);
        printStar();
        printBlank(n-2);
        printStar();
        ln();
    }

    public String getAnswer() {
        return sb.toString();
    }

    private void printUpperAndLowerMiddle(int n, int i) {
        printBlank(i);
        printStar();
        printBlank(n-2);
        printStar();
        printBlank(2*(n-i-2)+1);
        printStar();
        printBlank(n-2);
        printStar();
        ln();
    }

    private void printStar() {
        printStar(1);
    }

    private void printStar(int n) {
        while (n-->0) sb.append(STAR);
    }

    private void printBlank(int n) {
        while (n-->0) sb.append(BLANK);
    }

    private void ln() {sb.append('\n');}
}

 

댓글