백준

백준 2439번 - 별 찍기-2

때래뚫 2023. 2. 2. 13:41

백준 2439번 - 별 찍기-2

오늘은 백준 2439번의 풀이에 대해서 설명해보겠습니다. 부족한 부분이 보이시거나

더 간단한 코드에 대한 지적은 언제나 환영입니다!

 

우선 문제에는

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

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

라고 설명이 나와있습니다.

 

입력과 출력 예제는

//입력
5
//출력
    *
   **
  ***
 ****
*****

위 그림처럼 입력한 값에 따라 반쪽짜리 트리를 세워놓은 모양으로 출력해야합니다.

 

우선 소스 코드를 보여드린 후 설명하겠습니다.

package backUp;

import java.util.Scanner;
/**
 * 
 * @author lucky
 *
 */
public class BackJun2439 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);//입력받는 스캐너 선언
		
		int a =sc.nextInt();// 출력할 줄 수 입력
		int b = a;// 공백 출력의 for문 범위를 잡아주기 위한 변수
		for (int i = 0; i < a; i++) {// 출력횟수에 따라 실행.. == 줄 수만큼 실행
			
			for (int j = b; j > 1; j--) {// 공백 먼저입력
				System.out.print(" ");
			}
			
			for (int j = 0; j <= i; j++) {// 별 입력
				System.out.print("*");
			}
			b--;// 한 줄 찍을 때마다 공백찍는 횟수를 1번씩 줄인다.
			System.out.println();
		}
				
	}
}

우선 문제를 먼저 보면 N번째 줄에 별 N개를 입력하라고 되어있습니다.

따라서 줄 당 총 글자 수는 공백이 있는줄도 모두 N개입니다. 

그 점을 먼저 알아내셨다면 줄 수를 조절하는 반복문과 그 안에 별을 찍는 반복문과 공백을 찍는 반복문이 있어야한다고 생각했습니다. 이제부터 설명드리겠습니다.

for (int i = 0; i < a; i++) {// 출력횟수에 따라 실행.. == 줄 수만큼 실행}

소스코드 맨 위에 들어가는 반복문입니다. 스캐너를 통해 줄 수 N을 입력받으면 그것을 변수 a에 초기화합니다. 이후 N번만큼 실행하여 줄 수를 조절하는 반복문이라 할 수 있습니다.

이렇게 줄수를 조절하는 반복문을 만들고, 별을 찍는 반복문과, 공백을 찍는 반복문 중 무엇을 먼저 실행해야할까요?

//입력
5
//출력
    *
   **
  ***
 ****
*****

출력 예시를 보면 첫 줄에 공백이 먼저 나오는 것을 확인 할 수 있습니다.

따라서 공백에 대한 반복문을 먼저 작성하여 넣겠습니다.

		int a =sc.nextInt();// 출력할 줄 수 입력
		int b = a;// 공백 출력의 for문 범위를 잡아주기 위한 변수
		for (int i = 0; i < a; i++) {// 출력횟수에 따라 실행.. == 줄 수만큼 실행
			
			for (int j = b; j > 1; j--) {// 공백 먼저입력
				System.out.print(" ");
           
             }
          	b--;// 한 줄 찍을 때마다 공백찍는 횟수를 1번씩 줄인다.
        }

공백에 대한 for문을 살펴보면 5가 입력됬을 때  변수 b == j == 5가 됩니다.

한번 반복될 때마다 -1씩되고, b가 2일때까지 총 4번의 공백을 출력합니다. 이후에는 1줄을 찍을때 마다

1번씩 줄어들어 3번,2번,1번 마지막엔 0번을 출력하겠죠?

그럼 제대로 찍히는지 공백대신 1의 숫자를 넣어보겠습니다.

출력예시

이렇게 원하는대로 출력되는 것을 알 수 있습니다.

 

이제 별만 덧붙여 출력해주면 됩니다. 별은 공백과 반대로 첫번째 줄은 1개부터 줄당 1개씩 증가시키면 되겠습니다.

	for (int j = 0; j <= i; j++) {// 별 입력
				System.out.print("*");
			}

두 번째 조건은 마지막 줄의 출력은 별의 수와 줄수가 같아야하기때문에 j(별을 찍어야하는 횟수)<=i(줄의 수) 로 표기한 것입니다. 이것을 줄을 출력하는 반복문의 마지막 부분에 넣어주면 됩니다. 이것은 한 줄을 찍을때마다(제일 위의 반복문이 한바퀴 돌때마다) j는 1씩 증가하므로 한줄마다 별은 1개씩늘어난다고 생각하시면됩니다.

 

이제 다시한번 전체 소스코드를 보겠습니다.

package backUp;

import java.util.Scanner;
/**
 * 
 * @author lucky
 *
 */
public class BackJun2439 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);//입력받는 스캐너 선언
		
		int a =sc.nextInt();// 출력할 줄 수 입력
		int b = a;// 공백 출력의 for문 범위를 잡아주기 위한 변수
		for (int i = 0; i < a; i++) {// 출력횟수에 따라 실행.. == 줄 수만큼 실행
			
			for (int j = b; j > 1; j--) {// 공백 먼저입력
				System.out.print(" ");
			}
			
			for (int j = 0; j <= i; j++) {// 별 입력
				System.out.print("*");
			}
			b--;// 한 줄 찍을 때마다 공백찍는 횟수를 1번씩 줄인다.
			System.out.println();// == enter
		}
				
	}
}

이제 한 줄을 출력하는 반복문이 실행되면, 공백이 먼저 출력됩니다. 이후 줄 갯수 - 공백만큼 별을 찍은 뒤에

공백 출력 횟수를 하나 줄여줍니다.(b--;) 그렇게 한줄의 출력이 끝나면 println()으로 한줄을 띄워줍니다(enter키처럼)

그 과정이 반복되면 출력 예시와 같은 결과가 나오게됩니다.

 

긴 글 읽어주셔서 감사합니다.