[Problem Solving/Java] 백준 2447번 - 별 찍기 - 10

2024. 1. 8. 11:06·알고리즘 문제 풀이 (Problem Solving)

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

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

문제

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

***
* *
***

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

입력

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

첫 번째 시도

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;

public class Main {
    static char[][] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int N = Integer.parseInt(br.readLine());
        arr = new char[N][N];
        star(0, 0, N, false);
        for (int i = 0; i < N; i++) {
            bw.write(arr[i]);
            bw.write("\n");
        }
        bw.flush();
        bw.close();
    }

    static void star(int x, int y, int N, boolean blank) {
        // 공백칸일 경우
        if (blank) {
            for (int i = x; i < x + N; i++) {
                for (int j = y; j < y + N; j++) {
                    arr[i][j] = ' ';
                }
            }
            return;
        }
        // 더이상 쪼갤 수 없는 블록일 때
        if (N == 1) {
            arr[x][y] = '*';
            return;
        }
        /*
         * N=27 일 경우 한 블록의 사이즈는 9이고, N=9 일 경우 한 블록의 사이즈는 3이듯 해당 블록의 한 칸을 담을 변수를 의미 size
         *
         * count는 별 출력 누적을 의미
         */
        int size = N / 3;
        int count = 0;
        for (int i = x; i < x + N; i += size) {
            for (int j = y; j < y + N; j += size) {
                count++;
                if (count == 5) { // 공백 칸일 경우
                    star(i, j, size, true);
                } else {
                    star(i, j, size, false);
                }
            }
        }
    }
}

해결 방법

답이 나오지 않아서 구글에 검색했다.

어려웠던 점 / 고쳐야할 점

큰 블록으로 1, 2, 3 / 4, 5, 6 / 7, 8, 9 중 5번 째에만 공백이 들어가면 되는 건 이해 했는데, 구현을 어떻게 해야 하는지 몰랐다. 그래서 참고한 코드를 보면, star 메소드에서 5번째에 해당하는 것을 알 수 있도록 한 매개변수 blank가 참이면 공백을 넣는다. 그리고 매개변수 N은 주어진 숫자를 호출할 때마다 3으로 나누고, N이 1이 되면 *을 넣는다. Star 메소드 가장 아래의 for 문은 1, 2, 3 / 4, 5, 6 / 7, 8, 9의 순서대로 진행해서, count가 5가 되면 blank가 참이 되도록 하고, 아니라면 false를 입력하여 공백을 넣는 코드가 실행되지 않도록 한다. Main 메소드에선 크기가 주어진 수 N 인 2차원 배열을 선언하고, star 메소드를 호출해서 * 또는 공백을 넣는다. 

반응형

'알고리즘 문제 풀이 (Problem Solving)' 카테고리의 다른 글

[Problem Solving/Java] 백준 2231번 - 분해합  (1) 2024.01.08
[Problem Solving/Java] 백준 2798번 - 블랙잭  (0) 2024.01.08
[Problem Solving/Java] 백준 10870번 - 피보나치 수 5  (0) 2024.01.05
[Problem Solving/Java] 백준 10872번 - 팩토리얼  (1) 2024.01.05
[Problem Solving/Java] 백준 10757번 - 큰 수 A+B  (0) 2024.01.05
'알고리즘 문제 풀이 (Problem Solving)' 카테고리의 다른 글
  • [Problem Solving/Java] 백준 2231번 - 분해합
  • [Problem Solving/Java] 백준 2798번 - 블랙잭
  • [Problem Solving/Java] 백준 10870번 - 피보나치 수 5
  • [Problem Solving/Java] 백준 10872번 - 팩토리얼
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (216)
      • 개발 (Development) (151)
        • Algorithm (1)
        • Angular (1)
        • AWS (4)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (30)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (6)
        • PostgreSQL (37)
        • Python (26)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (10)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (10)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Linux
    timescaledb
    Kafka
    pandas
    javascript
    자바
    데이터분석
    AWS
    typescript
    DevOps
    java
    백준알고리즘
    리눅스 마스터 2급 2차
    오답노트
    deepseek
    JPA
    python
    springboot
    리눅스 마스터 2급
    MyBatis
    JSON
    Vue.js
    docker
    Kubernetes
    백준자바
    백준
    Linux master
    ADsP
    PostgreSQL
    백준온라인저지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[Problem Solving/Java] 백준 2447번 - 별 찍기 - 10
상단으로

티스토리툴바