JAVA

[Java] 백준 별 찍기 2438번 2439번 2440번

로춘남 2022. 2. 22. 14:31
728x90


자바를 배우다보면 한 번쯤 보게되는 별(*) 찍기. 백준 알고리즘을 풀다가 별 찍는게 여러개가 나와서 여러 종류별로 정리를 해보려고한다. 

 

2438번 - https://www.acmicpc.net/problem/2438

출력물 : 5를 입력값으로 적용했을때,

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

※ 입력하는건 Scanner 혹은 BufferReader를 사용하면 된다.

 

별 찍기는 보통 for문을 이용하게 된다. 해당 문제는 for문으로 int i 랑 int j를 돌려주게 되는데, i의 경우에는 1줄, 2줄, 3줄처럼 밑으로 내려가는 세로줄을 의미. j의 경우에는 1줄에서 *를 하나씩 찍는 과정을 의미한다. 

i가 1일 경우 첫째줄에 시작하고, 이때 j는 0, i는 1이기때문에 j는 ++에 의하여 1이 증가되고 "*"를 1개 수행하게 된다. 이후 두 번째 줄은 i가 2이기 때문에 j는 0과 1 2가지가 해당되서 *를 총 2번 찍고 println()에 의해 다음줄로 내려오게된다.

이러한 순서로 반복이 지속되며 입력값 N에 5를 입력하였을때는 i도 5줄에서 끝나고, *를 찍는 j도 5에서 마무리가 된다.

* 하나 찍고, println("") 적용되서, ** 찍고, 또 println("") 적용되서, 아래로 내려와 또 *** 찍는 이런식


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

출력물 : 입력값으로 5를 입력했을때,

다른 방향으로의 직각삼각형이다. 2438번과 차이가 있다면, *를 먼저 찍는것이 아니라 공백(" ")을 먼저 찍어준다.

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

그렇기때문에 *를 찍고, 개행. **를 찍고 개행 이런식이 아니라 " " 공백으로 입력된값에 따른 조건으로 출력한 뒤 *를 찍고, 다음줄로 내려와줘야한다. 입력값 N이 5라고 가정을 했을때, 첫 번째 줄 *를 출력하기 위해선 i값은 1 j값은 입력값 5를 나타낸다. if문에서 i가 j보다 작을때 " "을 출력하라고 명령했으니, j값이 5은 j--를 통해 1씩 작아지며, 4, 3, 2, 1 이 되었을때, 총 4개의 " "을 찍고, else의 "*"를 출력한다음에 System.out.println();에 의하여 다음행으로 이동된다. 이렇게 j값인 5가 i값보다 작아질때까지를 반복하면서 " "와 "*"를 출력하게 되는것이다.


2440번 - https://www.acmicpc.net/problem/2440

출력 : 입력값 5를 입력했다고 가정했을때,

밑으로 내려갈수록 1개씩 작아지는 형태의 직각삼각형 별 찍기 문제다. 앞부분에 공백이 없어서 i값이 1씩 커짐에 따라 j값을 입력값 5라고 했을때, 1개씩 작아지면서 ***** **** *** 순서로 출력하려고 했었다. 

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

흠 그런데, 생각보다 내가 뻘짓을 하고 잇는거 같아서 j값을 변형해서 풀이를 해주었다. j가 증가할때마다 i역시 증가되지만 그 차이가 1이기때문에 +1로 변화를 줬고, 해당 j까지 출력되면 바로 줄바꿈을 실행했다.

내가 처음 원했던것인 j값이 하나씩 줄어드는 방법은 아니였지만 어쨋든 풀기는 풀어냈다.

그런데 이후에 그냥 다시 한 번 j값이 하나씩 줄어드는 방법으로 바로 시도했는데, 바로 성공;; 뭐징...

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

해당 코드가 int J를 입력값으로 설정하고, j--에 의해 하나씩 줄어드는 별 찍기 방법이다. 쉬운듯하면서도 어려운것 같은 별 찍기... 백준 앞으로 별찍기 문제 많이 있을텐데 살짝 두려움이 몰려오기도한다.

 

 

 

728x90