DY N DY

실력키우기 파스칼삼각형(JAVA) 본문

PARK/ALGORITHM

실력키우기 파스칼삼각형(JAVA)

손세지 2016. 5. 16. 17:40

2071 : 파스칼 삼각형

제한시간: 1Sec    메모리제한: 64mb
해결횟수: 841회    시도횟수: 1887회   



파스칼 삼각형이란 아래 <표1> 과 같은 자신의 왼쪽 위의 좌표와 오른쪽 위의 좌표 값을 더해서 값을 계속 갱신시켜 나가는 형태의 삼각형을 말한다. 아래와 같은 파스칼 삼각형의 높이 n과 종류 m을 입력받은 후 다음과 같은 형태의 파스칼 삼각형을 출력하는 프로그램을 작성하시오.


efc6e5f9d670c6da62174cf11a66a8c2_1449728 


<처리조건> 
m에 대한 파스칼 삼각형의 모습은 아래 <표2>의 모습과 같다.

efc6e5f9d670c6da62174cf11a66a8c2_1449729

 

삼각형의 높이n(1부터 30사이의 정수)과 종류m(1부터 3사이의 정수)을 입력받는다.



위에서 제시한 형태의 파스칼 삼각형을 입력에서 들어온 높이 n과 종류 m에 맞춰서 출력한다.
숫자는 한칸의 공백으로 구분하여 출력한다.


 [Copy]
5 1
 [Copy]
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1



 [Copy]
6 3
 [Copy]
1
5 1
10 4 1
10 6 3 1
5 4 3 2 1
1 1 1 1 1 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**************************************************************
    Problem: 2071
    User: a132034
    Language: Java
    Result: Success
    Time:144 ms
    Memory:9072 kb
****************************************************************/
 
 
import java.util.Scanner;
 
public class Main{
     public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
         int N = sc.nextInt();
         int M = sc.nextInt();
 
        int[][] pascal = new int[N][N];
         if(N > 0)
             pascal[0][0] = 1;
         if(N > 1){
             pascal[1][0] = 1;
             pascal[1][1] = 1;
         }
         if(N > 2){
             for(int i = 2 ; i < N; ++i)
             {
                 for(int j = 0 ; j <= i; ++j)
                 {
                     if(j == 0 || j == i)
                         pascal[i][j] = 1;
                     else
                         pascal[i][j] = pascal[i-1][j-1] + pascal[i-1][j];
                 }
             }
         }
          
         if(M == 1){
             for(int i = 0 ; i < N; ++i)
             {
                 for(int j = 0 ; j < N; ++j)
                     if(pascal[i][j] != 0)
                         System.out.print(pascal[i][j] + " " );
                 System.out.println();
             }
         }else if (M == 2){
             for(int i = N-1 ; i >= 0; --i)
             {
                 for(int j = i ; j < N-1; ++j)
                     System.out.print(" ");
                 for(int j = 0 ; j < N; ++j)
                     if(pascal[i][j] != 0)
                         System.out.print(pascal[i][j] + " " );
                 System.out.println();
             }
         }else if (M == 3){
             for(int i = N-1 ; i >= 0; --i)
             {
                 for(int j = N-1 ; j >= 0; --j)
                     if(pascal[j][i] != 0)
                         System.out.print(pascal[j][i] + " " );
                 System.out.println();
             }
         }
     }
 }


우선 파스칼 삼각형을 만든 후에 출력 방식만 바꿔주는게 좋겠다고 생각했다. 어차피 셋 다 파스칼삼각형의 원리에 따라 만들어줘야 한다.

파스칼 삼각형을 만드는 공식 자체는 딱히 어렵지 않았다. 

우선 첫 번째 숫자는 1로 시작하고, 2 번째 숫자까지는 생각을 많이 안하려고 직접 입력해주었다.

3번째 부터는 윗줄에서 값을 더해 만들어 주었다(파스칼 삼각형이 원래 그렇다.)


이제 출력인데, 1번은 그대로 출력해주면 되므로 어렵지 않다. 

(0인 경우는 출력하지 않으면 된다)


2번같은 경우 거꾸로 출력해주면 되기 때문에 가장 큰 for loop를 N-1 -> 0까지 반대로 바꾸었다. 

추가로 각 줄 마다 띄어쓰기에 신경을 조금 써주었다. 


3번같은 경우 고민을 하다가 그냥 i, j를 바꿔주어 보았더니 생각과는 다르게 바뀌었다. 기존 2차원 배열을 매트릭스로 보았을 때, 대각선 / 축을 기준으로 x, y를 변경해주면 된다고 생각했다. 

i와 j를 바꾸기만 한 것은 /축이 아니고 반대 대각선 축을 기준으로 바꾸어 준 것이었다.  Maxtrix Traspose(전치행렬로 만들어 줌)된 것.

원하는 것은 이게 아니었고 상하반전도 필요했다(추가로 좌우반전까지) 때문에 for loop도 전부 반대로 변경해주었다.

이렇게 하면 원하는 행렬(배열)로 출력이 가능하다.