기몽수
코딩 기록일지
기몽수
전체 방문자
오늘
어제
  • 분류 전체보기 (443)
    • 알고리즘 - SWEA (210)
      • D1 (19)
      • D2 (25)
      • D3 (143)
      • D4 (21)
      • D5 (2)
    • 알고리즘 - Programmers (74)
      • Unrated (34)
      • Lv 0 (4)
      • Lv 1 (3)
      • Lv 2 (32)
      • Lv 3 (1)
    • 알고리즘 - Baekjoon (158)
      • Bronze (1)
      • Silver (65)
      • Gold (90)
      • Platinum (2)
    • 취업 (0)
    • SSAFY (1)
hELLO · Designed By 김용수.
기몽수

코딩 기록일지

알고리즘 - Baekjoon/Gold

[백준] 2448번 : 별 찍기 - 11 Gold4(골드4) - JAVA[자바]

2024. 1. 19. 00:32

[Gold IV] 별 찍기 - 11 - 2448

문제 링크

성능 요약

메모리: 234796 KB, 시간: 476 ms

분류

재귀

제출 일자

2024년 1월 19일 00:23:23

문제 설명

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

출력

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

 

접근 방법

1. 주어진 예시를 본다면 N이 3일 때 3층짜리 삼각형이고 맨 아랫줄은 6개의 공간이 생기는 것을 알 수 있다.

2. 출발점에서 시작하여 밑변의 길이를 2로 나누면 아래층의 시작점을 나눌 수 있다.

3. 밑변의 길이를 2로 나눈 것을 한번 더 나눠준다면(높이는 N이고 너비는 2 * N이기때문에) 가운데 시작점을 찾을 수 있다.

4. 길이가 총 6이 된다면(N = 3이 최소값이고 너비가 N * 2인 6이 너비의 최소값) 시작점을 기준으로 별을 넣어주면 된다.

import java.util.*;
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));
        StringBuilder sb = new StringBuilder();
        // n은 3의 배수
        int n = Integer.parseInt(br.readLine());
        // n이라면 3층짜리 배열에 맨 아랫줄은 별이 6개
        map = new char[n][n * 2];
        // 공백으로 초기화 시켜준다.
        for (int i = 0; i < map.length; i++) {
            Arrays.fill(map[i], ' ');
        }

        // 별을 채우는 재귀 호출
        star(n - 1, 0, n * 2);

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

    private static void star(int x, int y, int len) {
        // len이 6이라면 3층짜리 삼각형 한개라서 채워주고 종료
        if (len == 6) {
            // 1층
            map[x][y] = map[x][y+1] = map[x][y+2] = map[x][y+3] = map[x][y+4] = '*';
            // 2층
            map[x - 1][y + 1] = map[x - 1][y + 3] = '*';
            // 3층
            map[x - 2][y + 2] = '*';
            // 종료
            return;
        }
        // 다음 길이는 현재 변의 길이의 나누기 2
        int nextLen = len / 2;
        // 왼쪽 아래 삼각형
        star(x, y, nextLen);
        // 오른쪽 아래 삼각형
        star(x, y + nextLen, nextLen);
        // 가운데 삼각형 높이고 len은 2 *n이 기준이기 때문에 나누기 2를 해주면 구할 수 있다.
        star(x - nextLen / 2, y + nextLen / 2, nextLen);
    }
}

'알고리즘 - Baekjoon > Gold' 카테고리의 다른 글

[백준] 4256번 : 트리 Gold2(골드2) - JAVA[자바]  (1) 2024.01.22
[백준] 3425번 : 고스택 Gold4(골드4) - JAVA[자바]  (0) 2024.01.20
[백준] 17073번 : 나무 위의 빗물 Gold5(골드5) - JAVA[자바]  (0) 2024.01.17
[백준] 11404번 : 플로이드 Gold4(골드4) - JAVA[자바]  (0) 2024.01.17
[백준] 1068번 : 트리 Gold5(골드5) - JAVA[자바]  (1) 2024.01.16
    '알고리즘 - Baekjoon/Gold' 카테고리의 다른 글
    • [백준] 4256번 : 트리 Gold2(골드2) - JAVA[자바]
    • [백준] 3425번 : 고스택 Gold4(골드4) - JAVA[자바]
    • [백준] 17073번 : 나무 위의 빗물 Gold5(골드5) - JAVA[자바]
    • [백준] 11404번 : 플로이드 Gold4(골드4) - JAVA[자바]
    기몽수
    기몽수

    티스토리툴바