공부방

dp-파스칼의 삼각형 본문

문법/알고리즘

dp-파스칼의 삼각형

코딩 화이팅 2023. 5. 9. 21:51

https://www.acmicpc.net/problem/16395

 

16395번: 파스칼의 삼각형

파스칼의 삼각형은 이항계수를 삼각형 형태로 배열한 것인데, 블레즈 파스칼(1623-1662)을 따라 이름 붙여졌다. 단순한 형태로, 파스칼의 삼각형은 다음과 같은 방법으로 만들 수 있다. N번째 행

www.acmicpc.net

원래 코드

package DP;

import java.util.Scanner;

public class bj_파스칼의삼각형_16395 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
		int b=sc.nextInt();
		int up=1;
		int left=1;
		int right=1;
		for (int i =a-1; i >= 1; i--) {
			up*=i;
		}
		for (int i = b-1; i>=1; i--) {
			left*=i;
		}
		for (int i = a-b; i >=1; i--) {
			right*=i;
		}
		System.out.println(up/(left*right));
	}
}

답은 맞는 거 같지만 수가 커지면 오버플로우가 발생할 수 있다. 이 코드를 개선하기 위해

package DP;

import java.util.Scanner;

public class bj_파스칼의삼각형_1_16398 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int[][] pascal = new int[a][a];
        파스칼의 수를 하나씩 저장할 배열을 만든다. 
        크기는 a행과 a의 줄만큼 있기 때문에 [a][a]크기의 배열
        이 배열로 파스칼의 수처럼 피라미드 형태의 배열이라고 생각한다.
        
        pascal[0][0] = 1;
        맨 위에 수는 하나인 1
        for (int i = 1; i < a; i++) {
        0은 위에서 지정해줬기 때문에 1부터 a만큼 반복
            pascal[i][0] = 1;
            맨 왼쪽의 수는 1
            pascal[i][i] = 1;
            맨 오른쪽의 수도 1
            for (int j = 1; j < i; j++) {
            0->젤 왼쪽은 위에서 지정해주고
            i도 위에서 지정해주기 때문에 이 안의 수만큼 반복            
                pascal[i][j] = pascal[i - 1][j - 1] + pascal[i - 1][j];
                파스칼의 피라미드 형태라고 2차원 배열을 생각해준다.
                행의 줄 수를 정해주기 위해 위 왼쪽 수와 위 오른쪽 수를 더해준다.
            }
        }
        
        System.out.println(pascal[a - 1][b - 1]);
        처음부터 0,0으로 시작하기 때문에 -1을 빼준 값을 구해준다.
    }
}

 

'문법 > 알고리즘' 카테고리의 다른 글

HashSet  (0) 2023.06.12
dfs로봇 청소기(4방 탐색)  (0) 2023.06.04
그리디/2차배열 정렬/회의실 배정  (0) 2023.04.27
bfs문제(토마토)  (0) 2023.04.15
가장 긴 증가하는 부분 수열  (0) 2023.04.15