PS/알고리즘 문제풀이

*다중 반복문* 숫자 피라미드(java, 알고리즘)

javajoha 2022. 9. 4. 21:41

알고리즘 공부를 하면서, 다시 한번 복습하고, 푸는 방법을 익히는 연습을 하기 위해 이 주제에 대해 글을 쓰기로 하였다.

다중 반복문을 이용한 문제인데, 숫자 피라미드라는 문제이다.

핵심 

이 문제의 핵심은 홀수번째 줄에서 숫자가 증가하고, 짝수번째 줄에서는 숫자가 감소하는 것이다. 또한 숫자는 1~9까지만 반복한다. 그리고 출력을 할 때,  왼쪽에서 오른쪽으로 하기 때문에, 각 줄의 첫 번째 수를 찾는 방법 또한 매우 중요하다. 

정답 코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int s = sc.nextInt();
        int previousFirst = 0;
        int previousLast = 0;
        int number = 1;
        int space = n - 1;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j < space; j++) System.out.print(" ");
            space--;
            if (i % 2 == 0) { //짝수일때 증가함
                int currentFirst = previousFirst + 1;
                if (currentFirst >= 10) currentFirst = 1;

                for (int j = 0; j < number; j++) {
                    System.out.print(currentFirst);
                    previousLast = currentFirst;
                    currentFirst++;
                    if (currentFirst >= 10) currentFirst = 1;
                }}
            else{ //홀수일때 감소함
                int currentFirst;
                if (i==1)currentFirst=s;
                else {currentFirst = previousLast;

                for (int j = 0; j < number; j++) {
                    currentFirst++;
                    if (currentFirst >= 10) currentFirst = 1;
                }}
                previousFirst = currentFirst;

                for (int j = 0; j < number; j++) {
                    System.out.print(currentFirst);
                    currentFirst--;
                    if (currentFirst <= 0) currentFirst = 9;
                }
            }
            number += 2;
            System.out.println();
        }

    }
}

해설

처음 나타내야 하는 것은 공백이다. 출력 값에서 공백의 크기는 n이 5일 때 4,3,2,1,0로 차례대로 줄어든다.

i나 n을 사용하여, 공백 출력을 나타낼 수 있지만, 이해하기 편하고, 직관적이게 space라는 변수를 선언했다.

이후에는 짝수 줄과 홀수 줄을 나누어서 비교해야 한다.

짝수 줄의 경우 수가 증가하는 형태이다.

그리고 이전 줄에서  첫 번째 값+1을 한 값이 시작 숫자가 된다.

그래서 currentFirst = previousFirst+1로 나타내었다. 그리고 숫자는 1~9이므로 10을 넘기면 1로 초기화한다.

이제 반복문을 통해 숫자를 증가시킨다.

홀수 줄의 경우에는 수가 감소하는 형태이다.

홀수 줄의 첫 번째 값 같은 경우에는 이전 줄의 마지막 값에서 현재 줄의 크기를 더한 값이다.

따라서 currentFirst = previousLast를 한 뒤, size만큼 더해주었다.

이제 반복문을 통해 숫자를 감소시킨다.다음 줄로 넘어갈 때, 숫자의 길이가 2개씩 늘어나기 때문에, number+=2를 해주었다.

 

 

 

개선점이나 오류가 있다면, 댓글 부탁드립니다.