본문 바로가기

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

백준 별찍기 시리즈 - 2440, 2441, 2442, 2443번

두잇 책 1장에 나온 것들이라서 다시 정리해보는 마음으로 풀어봤다.

 

별찍기 - 3

문제

첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제

입력

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

5

출력

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

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

 

내 코드

import java.util.Scanner;

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

 

별찍기 문제를 풀기 위한 반복문을 둘로 나눈다면

  • 한 행마다 요긴하게 쓸 값 정하기
  • 반복해서 별찍기 혹은 반복해서 빈공간 찍기

예를 들어 지금과 같은 문제에서

한 행마다 요긴하게 쓸 값은 한 행당 별의 개수가 될 것이다. 

별의 개수는 1행에서 num, 2행에서 num - 1, 3행에서 num - 2,.... num 행에서 1이 될것이다.

이 별의 개수를 i에 저장한다고 생각하면 for문이 

for (int i = num; i >= 1; i--) 

이렇게 선언되는 것은 상식적이다.

 

그럼 이제 한 행에서 정해진 i 값을 갖고 어떻게 별과 빈공간을 반복해서 찍을지 정한다. 

여기서는 빈공간을 굳이 출력할 필요가 없으니 별만 정확히 i값 만큼만 찍으면 그림이 완성된다.

별을 반복해서 찍는 방법은

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

이 틀에 있는 k에 원하는 반복수를 적어주는 것이다. 

 

빈공간을 찍어주고 싶다면 마찬가지로 

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

이 틀을 유지해주기만 하면 된다.

 

일단 여기서는 빈공간없이 i 반복수만큼만 별을 찍으면 되므로

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

 

이 반복문을 한행마다 반복해줄것이기 때문에 위의 for 문의 몸체 안에 넣어주기만 하면 된다.

한행에 찍을 별을 다 찍었다면 마무리로 줄 바꿈을 해준다.

 


별찍기 - 4

문제

첫째 줄에는  N, 둘째 줄에는  N-1, ..., N번째 줄에는  1개를 찍는 문제

하지만, 오른쪽을 기준으로 정렬한 (예제 참고) 출력하시오.

입력

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

5

출력

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

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

 

내 코드

import java.util.Scanner;

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

 

이번에도 다음과 같이 단계를 나누면

  • 한 행마다 요긴하게 쓸 값 정하기
  • 반복해서 별찍기 혹은 반복해서 빈공간 찍기

한행마다 요긴하게 쓸 값을 별보다 먼저 찍어야하는 빈공간의 개수로 정했다.

빈공간의 개수는 다음과 같을 것이다.

1행 0 -> 2행 -> 1, 3행 -> 2, ... , num행 -> num - 1 

그래서 반복문을 이렇게 정했다.

for (int i = 0; i < num; i++) {

 

그리고 한 행에서 i만큼 빈공간을 찍고, 그 다음에는 num - i 만큼 별을 찍을 것이다.

빈공간을 찍는 코드는 다음과 같고,

for (int j = 0; j < i; j++) System.out.print(" ");

별을 찍는 코드는 다음과 같다.

for (int j = 0; j < num - i; j++) System.out.print("*");

한행에 찍을 것을 다 찍었다면 줄바꿈을 해주면 된다.


별찍기 -  5

문제

첫째 줄에는 별 1개, 둘째 줄에는 별 3개, ..., N번째 줄에는 별 2×N-1개를 찍는 문제

별은 가운데를 기준으로 대칭이어야 한다.

입력

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

5

출력

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

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

 

내 코드

import java.util.Scanner;

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

 

한 행에서 요긴하게 쓰게 될 값은 문제에서 정해준 그대로 했다. 그냥 i행에서 i * 2 - 1만큼 별을 찍으라고 했으니 이 i행의 i를 값으로 지정한다. 이 값은 행마다 다음과 같을 것이다.

1행 -> 1, 2행 -> 2, 3행 -> 3, 4행 -> 4,....num행 -> num

따라서 반복문을 다음과 같이 정했다.

for (int i = 1; i <= num; i++) {

그리고 한 행마다 별보다도 빈공간을 먼저 찍어야하는 데 이 빈공간의 개수가 num - i이다. 따라서 다음과 같이 빈공간을 찍는다.

for (int j = 0; j < num - i; j++) System.out.print(" ");

빈공간을 찍을 만큼 찍었다면, 별도 찍어줘야하는데, 문제에서 한 행마다 별의 개수를 손수 정해줬으니 그걸 그대로 따르면 된다.

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

한 행에 찍을 것을 다 찍었으니 마무리로 줄바꿈!

 


별찍기 - 6

문제

첫째 줄에는 별 2×N-1개, 둘째 줄에는 별 2×N-3개, ..., N번째 줄에는 별 1개를 찍는 문제

별은 가운데를 기준으로 대칭이어야 한다.

입력

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

5

출력

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

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

 

내 코드

import java.util.Scanner;

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

저번문제랑 다른 것은 한 행마다 쓸 값 뿐이다.

이번에는 저번 문제와 반대로 1행 -> num, 2행 -> num - 1, 3행 -> num - 2, 4행 -> num - 3,....num행 -> 1이다.

따라서 이 반복문만 바꾸고 나머지는 전과 동일하게 풀면된다.

for (int i = num; i >= 1; i--) {