공부방
dp-파스칼의 삼각형 본문
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 |