BOJ

[백준 2224번/JAVA] 별 찍기 - 7

syj0522 2024. 3. 11. 17:00

문제

백준 2224번

 

2444번: 별 찍기 - 7

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

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

풀이

별 찍기는 어려운 문제는 아닌데 공백과 별이 찍히는 횟수를 일반화하는 과정이 생각을 많이 요해서 풀기 귀찮은 문제이다.


그래서 항상 풀기 싫어했는데 그 감정을 극복하기 위해.. 이번 문제를 통해 풀이 방법을 체화하고 넘어가려고 한다. 이번에는 경우의 수를 많이 나눠야 해서 알고리즘 설계 시 바로 IDE에 작성하지 않고 손코딩을 했다.

 

먼저 별 갯수가 점점 늘어나는 부분(위), 줄어드는 부분(아래)를 따로 for문으로 구현하기로 한다.

N을 입력받았을 때, 위: N줄, 아래: N-1줄을 출력해야 하므로 각 for문 안에 쓰일 조건문은 완성되었다.

 

N=3일때 위쪽 for문의 각 줄이 출력하는 것

i 공백
0 2 1
1 1 3
2 0 5
일반화 : N-1-i 2i+1

N=3일때 아래쪽 for문의 각 줄이 출력하는 것

i 공백
0 1 3
1 2 1
일반화 :  i+1 2(N-i)-3

 

위쪽 for문 : 공백과 별이 각각 N-1-i번, 2i+1번 반복출력되고 개행문자가 더해진다. -> N번 반복
아래쪽 for문 : 공백과 별이 각각 i+1번, 2(N-i)-3번 반복출력되고 개행문자가 더해진다. -> N-1번 반복

코드

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

public class Main {
    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());
        for(int i=0; i<N; i++) {
            for(int p=0; p<N-1-i; p++) {
                bw.write(" ");
            }
            for(int q=0; q<2*i+1; q++) {
                bw.write("*");
            }
            bw.write("\n");
        }

        for(int i=0; i<N-1; i++) {
            for(int p=0; p<i+1; p++) {
                bw.write(" ");
            }
            for(int q=0; q<2*(N-i)-3; q++) {
                bw.write("*");
            }
            bw.write("\n");
        }
        bw.close();
    }
}

Note

일반화하는 팁

  • 홀수를 구하고싶으면 2x-1을 적용해본다
  • i와 반비례이면 i를 빼본다
  • 만든 일반식에 숫자를 직접 대입하여 확인해본다