[필수 문제] 숫자 피라미드

2021. 2. 11. 22:46코딩 테스트/필수 문제

1. 문제

N과 시작 숫자 S가 주어지면 숫자 피라미드를 만드는 프로그램을 작성하시오.


예를 들어, N이 5이고 S가 3 이라면, 그 숫자 피라미드는 다음과 같다.

 

    3
   456
  21987
 3456789
987654321

 

  • 시작 숫자 S는 꼭대기부터 1씩 증가한다.
  • 시작 행의 번호가 1번이라고 했을때, 짝수번째 행은 왼쪽에서 오른쪽으로 1씩 증가하도록 적고, 홀수번째 행은 거꾸로 적는다.
  • 숫자가 만약 10이 될 경우, 1로 바꾸고 다시 증가한다.  

입력

입력의 첫 번째 줄에 N과 시작 숫자 S가 주어진다. ( 1≤N≤100, 1 ≤S≤ 9)

출력

첫 번째 줄부터 숫자 피라미드를 출력한다. (각 줄에 존재하는 공백의 개수와 숫자의 개수를 정확하게 확인해주시바랍니다.)

예제 입력

5 3

예제 출력

    3
   456
  21987
 3456789
987654321

 

 

 

2. 풀이

이 문제는 총 3가지의 특징을 잡아내야 해결할 수 있다.

  • 각 줄에 출력되는 숫자의 수
  • 각 줄의 증감
  • 각 줄의 시작 숫자

 

가장 먼저, 각 줄에 출력되는 숫자의 수는 규칙을 통해 쉽게 찾을 수 있다.

  • 1 번째 줄 : 1
  • 2 번째 줄 : 3
  • 3 번째 줄 : 5
  • 4 번째 줄 : 7
  • 5 번째 줄 : 9
  • n 번째 줄 : 2n-1

 

다음으로는 각 줄의 증감을 확인해본다.

  • 2 번째 줄 : 증가
  • 3 번째 줄 : 감소
  • 4 번째 줄 : 증가
  • 5 번째 줄 : 감소
  • 짝수 줄은 증가, 홀수 줄은 감소

 

마지막으로 각 줄의 시작 숫자를 알아야한다.

  • 1 번째 줄 : 3
  • 2 번째 줄 : 4
  • 3 번째 줄 : 2
  • 4 번째 줄 : 3
  • 5 번째 줄 : 9
  • 짝수 줄의 첫 번째 요소 = 그 전 홀수 줄의 첫 번째 요소 + 1
  • 홀수 줄의 첫 번째 요소 = 그 전 짝수 줄의 마지막 요소 + (2n-1)

 

import java.io.*;
import java.util.StringTokenizer;

public class Main {

    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int s = Integer.parseInt(st.nextToken());

        int prevFirst = 0; // 전 줄의 첫 번째 요소 저장
        int prevLast = 0; // 전 줄의 마지막 요소 저장
        for(int i = 1; i <= n; i++) {

            for(int j = n-1; j >= i; j--) bw.write(" "); // 공백

            if(i == 1) { // 1 번째 줄일 경우
                bw.write(s + "\n");
                prevFirst = s;
                continue;
            }

            int curFirst = 0;

            if(i % 2 == 0) { // 짝수 줄일 경우 (숫자 증가)
                curFirst = prevFirst + 1;
                if(curFirst >= 10) curFirst = 1;

                for(int j = 0; j < 2*i-1; j++) {
                    bw.write(curFirst++ + "");
                    if(curFirst >= 10) curFirst = 1;
                }
                prevLast = curFirst;

            } else { // 홀수 줄일 경우 (숫자가 감소)
                curFirst = prevLast - 1;
                for(int j = 0; j < 2*i-1; j++) {
                    curFirst++;
                    if(curFirst >= 10) curFirst = 1;
                }

                prevFirst = curFirst;

                for(int j = 0; j < 2*i-1; j++) {
                    bw.write(curFirst-- + "");
                    if(curFirst < 1) curFirst = 9;
                }
            }

            bw.newLine();
        }

        br.close();
        bw.flush();
        bw.close();
    }

}
728x90

'코딩 테스트 > 필수 문제' 카테고리의 다른 글

[필수 문제] GCD LCM  (0) 2021.02.12
[필수 문제] 상자 꾸미기  (0) 2021.02.12
[필수 문제] offset  (0) 2021.02.11
[필수 문제] 주사위 게임  (0) 2021.02.11