본문 바로가기
백준

[백준] 10992번 : 별 찍기 - 17 – JAVA [자바]

by Hongwoo 2022. 8. 6.
반응형

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

 

10992번: 별 찍기 - 17

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

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 10992번 별 찍기 - 17은 브론즈 3 난이도의 구현 문제이다. 이 문제는 문제에서 주어진 것처럼 출력하면 되는 문제이다. 

 

우선 예를 보겠다. n = 4일 때, 다음과 같은 패턴의 *들을 출력해주면 된다.

 

   *
  * *
 *   *
*******

 

맨 위에 줄을 편의상 level 0, 그리고 맨 밑에 있는 줄을 level n - 1이라고 부르겠다.

 

패턴을 보면 우선 첫째줄 가운데에 *이 1개가 있다. 그리고 그다음 줄부터 *이 2개씩 있고 마지막 줄에는 *이 2n - 1개가 있다는 것을 확인할 수 있다.

 

이 문제는 2차원 배열을 이용해서 풀었다. 만약에 다른 방법으로 풀었으면 댓글로 남겨주면 감사하겠다.

 

우선 사이즈가 [n - 1][2n - 1]인 배열을 초기화해준다. 우선 세로로 사이즈가 n - 1인 이유는 맨 밑줄을 제외하고 *들을 저장해주기 위함이다. 이 이유는 어차피 맨 밑줄에는 *이 공백 없이 2n - 1개가 있기 때문이다. 

 

그리고 우선 int형 변수 L_index와 R_index를 선언해준다. 이 변수들은 배열에 *을 추가할 인덱스를 뜻한다. 우선 처음에는 L_index를 1, 그리고 R_index를 2n - 3으로 초기화해준다. 이 이유는 level n-2를 보면 인덱스 1과 인덱스 2n - 3에 *이 있기 때문이다. 따라서 arr [n - 2][L_index] = arr [n-2][R_index] = '*'로 해준다. 그리고 그 위에 줄에는 *이 1칸씩 가운데로 오기 때문에 L_index는 1씩 증가시켜주고 R_index는 1씩 감소시켜준다.

 

이 과정을 for-loop으로 진행해주면 맨 밑줄을 제외한 모든 줄에 맞는 위치에 *이 추가된다. 이것을 공백을 신경 써주면서 출력해주고 마지막 줄에는 *을 2n - 1개씩 출력해주면 된다.

 

자세한 코드는 밑에 있다.

 

 


  • 코드

 

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        // n = 1이면 * 1개만 출력
        if (n == 1) {
            System.out.print("*");
            return;
        }
        char[][] arr = new char[n-1][2*n-1];  // *을 저장할 배열
        int L_index = 1;
        int R_index = 2*n-3;
        for (int i = n-2; i >= 0; i--) {
            arr[i][L_index] = arr[i][R_index] = '*';
            L_index++;
            R_index--;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= n-1; i++) {
            sb.append(" ");
        }
        sb.append("*\n");
        for (int i = 1; i <= n-2; i++) {
            int count = 2;
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] == '*') {
                    sb.append("*");
                    count--;
                    if (count == 0) break;
                } else {
                    sb.append(" ");
                }
            }
            sb.append("\n");
        }
        for (int i = 1; i <= 2*n-1; i++) {
            sb.append("*");
        }
        System.out.print(sb);
    }
}

 

 

반응형

댓글