알고리즘 & 백준 문제풀이 메모

[백준] 2447번: 별 찍기 - 10

볼륨조절불가 2024. 8. 1. 19:49
728x90

문제 링크

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

 

 


 

 

풀이 과정

별 모양으로 채운 2차원 배열에서 시작해 현재 사각형의 9등분에서 가운데 부분을 빈칸으로 바꾸는 식으로 문제를 해결했다.

 

eraseStar의 매개변수 중 row, col은 도형의 시작점이고, temp라는 변수를 이용해 9등분을 구현했다.

 

for문을 이용해 eraseStar를 9번 재귀 호출했다.

 

중간에 빈칸으로 채워지는 부분까지 호출되는데, 어차피 빈칸이므로 정답에 지장은 없다.

 

 


 

 

코드

import java.util.*;
import java.io.*;

class Main {
    static void eraseStar(char[][] arr, int row, int col, int size) {
        int temp = size / 3;

        for(int i = 0; i < temp; i++) {
            for(int j = 0; j < temp; j++) {
                arr[row + temp + i][col + temp + j] = ' ';
            }
        }

        if(temp > 1) {
            for(int i = 0; i < 3; i++) {
                for(int j = 0; j < 3; j++) {
                    eraseStar(arr, row + i * temp, col + j * temp, temp);
                }
            }
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        char[][] stars = new char[n][];
        for(int i = 0; i < n; i++) {
            stars[i] = new char[n];
        }

        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                stars[i][j] = '*';
            }
        }

        eraseStar(stars, 0, 0, n);

        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                sb.append(stars[i][j]);
            }
            sb.append("\n");
        }

        System.out.println(sb);
    }
}

 

 


 

 

느낀 점

재귀를 이렇게도 사용할 수 있구나를 느꼈다.

 

내 풀이처럼 배열에서 구역을 나눠 가운데 부분을 빈칸 처리할 수도 있고, 아래 풀이처럼 현재 좌표에서 어떤 문자를 출력하는지 알아내는 방식도 기억하면 좋을 것 같아 아래에 남겨두려고 한다.

 

import java.util.*;
import java.io.*;

class Main {
    static char getStar(int i, int j, int size) {
        int newSize = size / 3;
		
        // 빈칸을 출력하는 가운데 공간에 i, j가 있으면 빈칸 리턴
        if(i / newSize == 1 && j / newSize == 1) return ' ';
        // 위에서 리턴되지 않은 경우 중 현재 사이즈가 3인 경우 * 리턴
        if(size == 3) return '*';
		
        // i와 j의 좌표를 변경하여 재귀 호출
        // 3등분한 사이즈로 나눈 나머지: 탐색 범위를 9등분한 칸으로 좁히는 효과
        return getStar(i % newSize, j % newSize, newSize);
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                sb.append(getStar(i, j, n));
            }
            sb.append("\n");
        }

        System.out.println(sb);
    }
}
728x90