본문 바로가기

자바 자료구조 & 알고리즘/알고리즘 문제 풀이

백준 별찍기 시리즈 - 2444, 2445, 2446번

별 찍기 - 7 성공분류

문제

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

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

5

출력

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

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

 

 

내 코드

import java.util.Scanner;

public class No2444 {
  
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    for (int i = 1; i <= n; i++) {
      for (int j = 0; j < n - i; j++)
        System.out.print(" ");
      for (int j = 0; j < 2 * i - 1; j++)
        System.out.print("*");
      System.out.println();
    }
    
    for (int i = n - 1; i >= 1; i--) {
      for (int j = 0; j < n - i; j++)
        System.out.print(" ");
      for (int j = 0; j < 2 * i - 1; j++)
        System.out.print("*");
      System.out.println();
      
    }
  }
}

가장 첫번째로 나타나는 for 문은 두가지 조건을 맞춰야한다. 

  • 반복 횟수를 행 횟수와 일치시켜야한다.
  • i 값을 각 행에서 요긴하게 쓸 수 있는 값으로 지정해야한다.

저번에는 후자만 생각해서 글을 써서 뭔가 좀 부족했던 것 같다. 전자가 충족되지 않으면 첫번째 for 문은 의미가 없다.

 

일단 출력해야할 마름모를 두개의 삼각형으로 나눠서 두 개의 for문을 실행시킬 것이다.

    *
   ***
  *****
 *******
*********
---------
 *******
  *****
   ***
    *

이렇게 위아래로 나눈다면 위의 삼각형은 별찍기 5번에서 했던 그대로 for문을 작성해주면 된다.

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

아래 삼각형은 첫번째 for 문만 오름차순이 아니라 내림차순으로 바꿔주면 된다. 어차피 i 값을 갖고 각 행에 찍는 시스템은 일치하기 때문에 첫번째 for 문 블록안의 코드는 똑같이 한다.

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

별 찍기 - 8 성공분류

문제

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

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

5

출력

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

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

 

내 코드

package com.heejin.baekjoon.star;

import java.util.Scanner;

public class No2445 {
  
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    for (int i = 1; i <= n; i++) {
      for (int j = 0; j < i; j++)
        System.out.print("*");
      for (int j = 0; j < 2 * (n - i); j++)
        System.out.print(" ");
      for (int j = 0; j < i; j++)
        System.out.print("*");
      System.out.println();
    }
    for (int i = n - 1; i >= 1; i--) {
      for (int j = 0; j < i; j++)
        System.out.print("*");
      for (int j = 0; j < 2 * (n - i); j++)
        System.out.print(" ");
      for (int j = 0; j < i; j++)
        System.out.print("*");
      System.out.println();
    }
  }
}

이것도 위의 문제와 마찬가지로 그림을 위아래로 쪼개어 두개의 for 문으로 만든다.

*        *
**      **
***    ***
****  ****
**********
----------
****  ****
***    ***
**      **
*        *
  • 위 아래 중 위의 그림에 대하여 첫번째 for 문은 각 행에서 가장 먼저 찍히는 *별의 개수로 정한다. 
  • i 값에 대하여 한 행에서 *을 i개 찍고, 빈공간을 2 (n - i)개 찍고, 마지막으로 다시 *을 i개 찍은 후 줄바꿈을 하면 완성이다.
    for (int i = 1; i <= n; i++) {
      for (int j = 0; j < i; j++)
        System.out.print("*");
      for (int j = 0; j < 2 * (n - i); j++)
        System.out.print(" ");
      for (int j = 0; j < i; j++)
        System.out.print("*");
      System.out.println();
    }

이렇게 위에 그림이 완성되면 아래 그림을 그리기 위해 첫번째 for 문 선언부만 바꿔주면 된다. 일단 행의 개수가 n - 1개이고 각 행에서 가장 먼저 찍히는 별의 개수가 n - 1에서부터 작아져 1까지 내림차순이다. 이에 따라 for 문만 변경한다.

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

 

별 찍기 - 9 성공분류

문제

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

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

5

출력

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

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

 

내 코드

package com.heejin.baekjoon.star;

import java.util.Scanner;

public class No2446 {
  
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    for (int i = n; i >= 1; i--) {
      for (int j = 0; j < n - i; j++)
        System.out.print(" ");
      for (int j = 0; j < 2 * i - 1; j++)
        System.out.print("*");
      System.out.println();
    }
    for (int i = 2; i <= n; i++) {
      for (int j = 0; j < n - i; j++)
        System.out.print(" ");
      for (int j = 0; j < 2 * i - 1; j++)
        System.out.print("*");
      System.out.println();
    }
  }
}

이것은 별찍기 - 7에서 나눈 위 아래 그림의 자리를 서로 바꿔준 모양새이므로 이에 따라 두 그림을 만든 for 문의 자리를 서로 바꿔주면 되겠지만 그렇게 풀지 않고 직접 다시 풀었다. 그런데 아마 그렇게 풀어도 될것이다.

 

각 행의 그림을 찍는 시스템은 별찍기 - 7과 완전히 같기 때문에 해설은 생략하고, 첫번째 for 문 선언부만 봤을 때, 위의 그림은 n 에서부터 1까지 내림차순으로 i를 지정하여 n 번 반복하고, 아래의 그림은 2에서부터 n까지 오름차순으로 i를 지정하여 n - 1번 반복한다.