알고리즘/백준

백준 2448번 별찍기 11 - 자바(Java)

리콜 2024. 7. 9. 15:33

문제 링크

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

 


1. 문제

2. 문제 관찰 과정 및 풀이

2-1. 문제 관찰 과정

아주 불친절한 문제였다. 먼저 주어지는 N은 높이가 된다는 것을 알 수 있었다.

또한 넓이는 N의 두배에서 -1을 한 값이 었다. (공백 포함)

 

char 2차원 배열을 만들어서 풀게 되었는데 따라서 배열은 [n][n * 2 -1 ]의 배열이었다.

 

문제의 예시그림과 같이 3가지 파트로 나누어 그림을 생각하였다.

좌표를 생각하는 과정에서 가로가 홀수이다 보니 중간점을 기준으로 생각하는 것이 많이 헷갈렸다.

 

또한 이전의 별찍기 10과다르게 먼저 채우지 않고 처리하여 조금더 빠르게 해보려 하였다.

2-2. 문제 풀이

  1. 만약 높이가 3이된다면 제일 작은 중간이 비어있는 삼각형을 해당좌표에 그린다.
  2. 좌표는 삼각형을 네모로 감쌌을때 왼쪽위의 좌표
  3. 제일위의 삼각형은 x는 그대로 y는 현재 넓이의 반의반의 오른쪽
  4. 왼쪽밑은 y는 그대로 x는 높이의 절반
  5. 오른쪽 밑은 x는 높의의 절반, y 는 현재 넓이의 중간의 바로 오른쪽

3. 코드

import java.io.*;

public class Main {
    static char[][] map;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb =new StringBuilder();

        int n = Integer.parseInt(br.readLine());
        map = new char[n][n * 2 - 1];

        recur(n, 0,0);

        for(int i =0;i<map.length;i++){
            for(int j= 0;j<map[i].length;j++){
                if(map[i][j] == 0){
                    map[i][j] = ' ';
                }
                sb.append(map[i][j]);
            }
            sb.append("\n");
        }

        bw.write(sb.toString());
        bw.flush();
        bw.close();
        br.close();
    }

    public static void recur(int n, int x, int y){
        if(n == 3){
            map[x][y] = ' ';map[x][y + 1] = ' ';map[x][y + 2] = '*';map[x][y + 3] = ' ';map[x][y + 4] = ' ';
            map[x + 1][y] = ' ';map[x + 1][y + 1] = '*';map[x + 1][y + 2] = ' ';map[x+1][y + 3] = '*';map[x+1][y + 4] = ' ';
            map[x + 2][y] = '*';map[x + 2][y + 1] = '*';map[x + 2][y + 2] = '*';map[x+2][y + 3] = '*';map[x+2][y + 4] = '*';
            return;
        }
        int next = n /2;
        int width = n * 2 - 1; // 47
        int middleWidth = width/2 + 1;
        recur(next, x, y + width /4 + 1 ); //위
        recur(next, x + next, y ); //왼쪽밑
        recur(next , x + next, y + middleWidth);

    }
}

3-1. 실행 결과

4. 여담

3일때 넣는 방법을 조금 더 보기 간결하게 할 수 없었을까

하지만 내가 적을때 실수하지 않도록 하나하나 적었다...

 

반응형