IT/BaekJoon

[백준/JAVA] 2439번 '별 찍기' 설명 - BufferReader 사용

Buang 2023. 5. 21. 23:08
반응형

1. 문제

https://www.acmicpc.net/problem/2439

 

2439번: 별 찍기 - 2

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

www.acmicpc.net


2. 풀이

 

첫째 줄에는 별 1개,

둘째 줄에는 별 2개,

N번째 줄에는 별 N개를 찍히도록 하는 문제다.

 

그런데 결과가 좀 특이하게 나와야 한다.

 

 

정렬이 보통 왼쪽으로 되도록 하는데

이 문제는 정렬을 오른쪽으로 해서 출력되도록 해야 한다.

 

 

for문을 총 3번 사용해서 풀 수 있다.

 

 for (int i = 1; i <= count; i++) { // 사용자가 입력한 숫자만큼 줄 출력

- 사용자가 입력한 숫자만큼 줄이 나와야 한다.

예) 5를 입력했다면 5줄이 출력되어야 한다.

 

  for (int i = 1; i <= count; i++) {
            for (int spaces = count - i; spaces > 0; spaces--) { // 공백 출력하는 for 루프
                // 입력받은 수에서 -1 해주고, 결과값만큼 스페이스바
                System.out.print(" ");
            }

 

- 별이 먼저 출력되는 게 아니라 공백을 먼저 출력하도록 해야 한다.

- 예를 들어서 사용자가 3을 입력했다고 한다면,

첫 번째 턴에선 '공백 2번 별 한 개'

두 번째 턴에선 '공백 1번 별 두 개'

세 번째 턴에선 '공백 0번 별 세 개'

 

이런 식이다.

 

- 그러니 공백이 먼저 나오고 그 다음 별이 출력되도록 해야 하는 것이다.

 

- 위에서 사용자가 3을 입력했다고 가정했었다.

- 사용자가 입력한 숫자를 count란 변수에 담는다고 했을 때

이 count 변수에 있는 값을 -1 해주면 적절한 공백 값이 나온다.

- 예) 사용자가 3을 입력했다면 count에는 3이 저장된다.

- 첫 번째 턴에선 count 값인 3에서 -1을 해줘서 2가 나온다. 공백이 총 2번 찍힌다.

 

첫 번째 턴에선 '공백 2번 별 한 개'

두 번째 턴에선 '공백 1번 별 두 개'

세 번째 턴에선 '공백 0번 별 세 개'

 

- 공백 2번이 첫 번째 턴에선 찍히는 게 맞다.

- spaces--를 해줘서 턴을 돌 때 마다 공백 값도 줄어들게 한다.

- 이렇게 해서 두 번째 턴에선 공백 1번이 출력될 것이다.

 

 

 for (int stars = 1; stars <= i; stars++) { // i만큼 별 출력
                System.out.print("*"); // 별 출력
            }
            System.out.println(); // 별 출력 후 줄바꿈

 

- 한 줄 씩 내려갈 때 마다 별의 개수도 증가한다.

예) 첫 번째 줄에는 별 한 개, 두 번째 줄에는 별 두 개, 세 번째 줄에는 별 3개 이런 식이다. 

 

- 한 줄에 별을 다 찍고 줄바꿈이 있어야 한다.

이를 위해 두 번째 for문 바깥에 System.out.prinln();을 작성해서

줄바꿈을 해주었다.

 

3. 코드

 

package loop;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PrintStarts_2439 {
    public static
    void main ( String[] args ) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //Scanner와 유사

        int count = Integer.parseInt(br.readLine());
        // readLine은 입력을 받을 때 사용하는 메서드다. next 메서드 느낌?
        // br.readLine()이 scan.nextInt 느낌. ex) int n = scan.nextInt();
        //  readLine 메서드로 입력받은 건 String type으로 고정되서 다른 타입으로 입력받으려 할 땐
        // 형 변환이 필요하다. 여기선 정수형으로 받아줘야 해서 Integer.parseInt를 작성해서 String을 int로 바꿔줬다.


        for (int i = 1; i <= count; i++) {
            for (int spaces = count - i; spaces > 0; spaces--) { // 공백 출력하는 for 루프
                // 입력받은 수에서 -1 해주고, 결과값만큼 스페이스바
                System.out.print(" "); // 공백 출력
            }
            for (int stars = 1; stars <= i; stars++) { // i만큼 별 출력
                System.out.print("*"); // 별 출력
            }
            System.out.println(); // 별 출력 후 줄바꿈
        }
    }
}

 

전체 코드는 위와같다.

 

 

 

 

 

 

반응형