DY N DY
실력키우기 파스칼삼각형(JAVA) 본문
2071 : 파스칼 삼각형
제한시간: 1Sec 메모리제한: 64mb
해결횟수: 841회 시도횟수: 1887회
파스칼 삼각형이란 아래 <표1> 과 같은 자신의 왼쪽 위의 좌표와 오른쪽 위의 좌표 값을 더해서 값을 계속 갱신시켜 나가는 형태의 삼각형을 말한다. 아래와 같은 파스칼 삼각형의 높이 n과 종류 m을 입력받은 후 다음과 같은 형태의 파스칼 삼각형을 출력하는 프로그램을 작성하시오.
<처리조건>
m에 대한 파스칼 삼각형의 모습은 아래 <표2>의 모습과 같다.
[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도 전부 반대로 변경해주었다.
이렇게 하면 원하는 행렬(배열)로 출력이 가능하다.
'PARK > ALGORITHM' 카테고리의 다른 글
실력키우기 빙고(C++) (0) | 2016.05.21 |
---|---|
실력키우기 달팽이삼각형(JAVA) (5) | 2016.05.17 |
실력키우기 숫자삼각형(JAVA) (0) | 2016.05.16 |
알고리즘 좋은수열(C++) (0) | 2016.05.16 |
실력키우기 최대공약수와 최소공배수(C++) (0) | 2016.05.14 |