[Java] 별찍기를 마스터 해보자 with 백준 2444: 별찍기 -7

hansung's·2024년 2월 19일
0

😢 별찍기

백준에서 여러 별찍기 문제를 찾아 볼 수 있는데, 이는 for문을 어느정도 이해하고 있어야 풀 수 있는 문제로, 별찍다가 진짜 별을 볼 뻔해서 이참에 연습을 해보고자 한다.

출력만 신경써서 오답이 많을 수 있다. 더 나은점이 있다면 꼭 댓글로 알려주세요!

Q1) 별 n번 n개만큼 찍어보기

for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

Q2) 순차적인 별트리

for (int i = 0; i < n; i++) {
            for (int j = 0; j <=i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

Q3) 위에서 내려오는 별트리

int n = Integer.parseInt(br.readLine());

for (int k = 0; k < n; k++) {
            for (int i = 0; i < k; i++) {
                System.out.print(" ");
            }
            for (int j = n; j > k; j-- ) {
                System.out.print("*");
            }
            System.out.println();

        }

먼저 공백이 0개 ~ 4개까지 쌓이는 for문이 앞단에 위치하며,
그 후 별을 n-k만큼 반복해서 찍는 코드이다.

Q4) 위에서 아래로 별이 i개만큼 찍히는 별트리

  int n = Integer.parseInt(br.readLine());

        // 5회 반복하기 위한 반복문
        for (int i = 0; i < n; i++) {
            for(int j = 0; j < n - i - 1; j++) {
                System.out.print(" ");
            }
            for(int j = 0; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

Q5) 하나씩 증가해 n개가 됐을때, 1씩 줄어드는 별트리

// 5회 반복하기 위한 반복문
        for (int i = 0; i < n; i++) {
           for (int j = 0; j <= i; j++) {
               System.out.print("*");
           }
            System.out.println();
        }

        // 반대로 줄어드는 트리를 그리기 위한 반복문
        for (int i = 0; i < n-1; i++) {
            for (int j = n-1; j > i; j--) {
                System.out.print("*");
            }
            System.out.println();
        }

Q6) n개에서 하나씩 줄어들다 1개가 됐을때 다시 n개까지 반복하는 별트리

// 5회 반복하기 위한 반복문
        for (int i = 0; i < n; i++) {
           for (int j = n; j > i; j--) {
               System.out.print("*");
           }
            System.out.println();
        }

        // 반대로 다시 늘어나는 트리를 그리기 위한 반복문
        for (int i = 2; i < n+1; i++) {
            for (int j = 0; j < i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

늘어나는 별트리 코드부터는, 이미 내려올 때 1개가 찍힌 상태이므로 2개부터 찍힐 수 있게 i = 2를 한 것이며, n+1을 함으로써 4번을 반복할 수 있도록 구성

Q7) 오른쪽에서 한개씩 증가해 다시 줄어드는 별트리

 // 5회 반복하기 위한 반복문
        for (int k = 1; k < n+1; k++) {
            for (int i = n; i > k; i--) {
                System.out.print(" ");
            }

           for (int j = 0; j < k; j++) {
               System.out.print("*");
           }
            System.out.println();
        }

        // 반대로 다시 줄어드는 트리를 그리기 위한 반복문
        for (int k = 1; k <= n; k++) {
            for (int i = 0; i < k; i++) {
                System.out.print(" ");
            }

            for (int j = n; j > k; j--) {
                System.out.print("*");
            }
            System.out.println();
        }

여기서는 공백이 우선적으로 들어가야 하기 때문에 공백을 위한 for문이 한개 더 늘어난 것을 볼 수 있다.

Q8) 피라미드

// 5번 반복을 위한 반복문
        for (int l = 1; l < 2 *n; l+=2) {
            // 좌측 공백 생성
            for(int i = 2* n-1; i > l; i-=2) {
                System.out.print(" ");
            }
            // 별 생성
            for(int j = 0; j <l; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

먼저 2씩 증가하는 등차의 모습을 보인다. 그러기 때문에 2개씩 증가할 수 있도록
int l을 n까지가 아닌 2*10까지 하여 2씩 증가하는데 부족하지 않도록 한 후
공백 역시 2씩 적어져야 하므로 i-=2로 2씩 감소하도록 코드를 작성하였다.

Q9) 역 피라미드

		for (int i = 1; i < 2 * n; i+=2) {
            for (int j = 1; j < i; j+=2) {
                System.out.print(" ");
            }
            for (int j = 10; j > i; j--) {
                System.out.print("*");
            }
            System.out.println();

        }

문제푼다고 좀 머리 아팠다.. 필자는 수학과 거리가 많이 멀다...
여기서 관건은 공백을 0, 1, 2, 3, 4만큼 만들 수 있냐와
공간을 별이 찍힌만큼 있다고 생각하는 것이 아닌, 마지막 별이 찍히는곳이 끝나는 지점이라는 생각을 해야한다.

필자는 자꾸 공간이 2n-1만큼 있다고 생각하니.. 문제 이해를 못했다. 
혹시 저와 같은 생각을 하시는 분이 계셨다면, 마지막 별이 끝나는 지점이 
끝점 (혹은 옆에 벽이 있다고 생각)이라고 생각을 하면 좀 더 문제 풀기가 쉬울것이다.

Q10) 백준 2444번: 별 찍기 -7 피라미드 + 역피라미드 별찍기

import java.io.*;

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());

        // 피라미드
        for (int i = 1; i < 2 * n; i+=2) {
            for (int j = 2 * n-1; j > i; j-=2) {
                System.out.print(" ");
            }
            for (int j = 0; j < i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

        // 역 피라미드
        for (int i = 2 * n -2; i > 0; i-=2) {

            // 공백찍기
            for (int j = 2 * n ; j > i; j-=2) {
                System.out.print(" ");
            }

            // 별찍기
            for (int j = 1; j < i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

    }
}

이 친구 풀어보려고 지금까지 별찍기를 연습해보았다..
앞으로 또 나올 별찍기에 대해서 이번에 배웠던 로직들을 잘 이용해 다시 블로그에 적도록 하겠다.

profile
ABAPER를 꿈꾸는 개발자

0개의 댓글