Algorithm/Baekjoon(Java)

[백준/JAVA] 2439 : 별 찍기 - 2 ( 중첩for문 )

비망노트 2022. 7. 10. 14:22
문제

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

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

 

입력

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

 

출력

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

 

예제 입력 예제 출력
5 *
**
***
****
*****

 

⭕ 풀이

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());
        
        StringBuilder sb = new StringBuilder();
        for(int i=n;i>0;i--){
            for(int j=1;j<=n;j++){
                if(j>=i){
                    sb.append("*");
                }else{
                    sb.append(" ");
                }                     
            }
            System.out.println(sb);
            sb.setLength(0);
        }
    }
}

✅ 처음엔 이전문제와 동일하게 풀며 printf 를 사용해 우측정렬하려했으나

총 몇번의 반복을 해야할지 모르기때문에 %5s 이런식으로 5칸을 사용하도록 할 수 없었다.

그래서 결국 if문을 사용해서 조건을 주고 공백도 넣어주는 식으로 작성했다.

 

예를들어 n이 5였다고 한다면

i = 5가 들어가고 i>0까지 즉 1까지  5, 4, 3, 2, 1 이렇게 5행을 반복하게된다.

여기서 i의 증감식은 --로 감소한다

 

i는 1부터시작하고 5보다 작거나같을때까지 반복하며 1씩 증가한다.

 

j와 i 즉  첫바퀴에서 i는 5다.

1>=5 false로  " " 을 추가한다.  2>=5 공백,  3>=5 공백, 4>=5 공백,  5>=5 true * append

이제 i는 4

1>=4 공백, 2>=4 공백,  3>=4 공백, 4>=4 true 5>=4 true

이제 i는 3

1>=3 공백, 2>=3 공백,  3>=3 true, 4>=3 true 5>=3 true

이제 i는 2

1>=2 공백, 2>=2 true,  3>=2 true, 4>=2 true 5>=2 true

이제 i는 1 (마지막바퀴)

1>=1 true, 2>=1 true,  3>=1 true, 4>=1 true,  5>=1 true

이런식으로 반복하게된다.

 

❗ 내부 for문에서 j는0으로 하고 j<=5 으로설정한다면 6번 반복하게되므로 갯수가 맞지않고

j=0 j<5 로한다면 5번 출력은 맞지만 바깥for문의 i가 5인데 j는 4까지가 최대값이므로

첫줄은 공백만 담게된다.

헷갈려서 여러번 시도해보며 출력값을 비교해보았다.

특히 중첩for문을 사용할때는 초기화와 조건식에따른 결과가 헷갈린다면

직접 한바퀴한바퀴 메모장이나 어디든 적어가면서 비교해보는것을 추천한다.

귀찮겠지만 내가 실수한부분을 찾고 이해하기 가장 좋은것같다.

 

 

그리고 처음에 우측정렬을 하려고 바깥for문 마지막에 System.out.printf를 사용하려하다보니 내부for문이 끝날때마다 출력하고

sb의 길이를 0으로하지않으면 계속 누적되기때문에 값이 달라지므로 setLength를 사용해 초기화를 해주었다.

근데 다시생각해보니 그냥 전처럼 한번에sb로받고 sb를 출력하는 식이 더 속도가 빨라질것같아서

아래처럼 다시 작성해보았다.

 

⭕ 재풀이

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());
        
        StringBuilder sb = new StringBuilder();
        for(int i=n;i>0;i--){
            for(int j=1;j<=n;j++){
                sb.append(j>=i?"*":" ");
            }
            sb.append("\n");
        }
        System.out.print(sb);
    }
}