📖 문제
15489번: 파스칼 삼각형
첫째 줄에 양의 정수 R, C, W가 공백을 한 칸씩 두고 차례로 주어진다. (단, 2 ≤ R+W ≤ 30, 2 ≤ C+W ≤ 30, 1 ≤ W ≤ 29, C ≤ R)
www.acmicpc.net
💡 풀이 방식
• 조합 (DP)
파스칼 삼각형을 모두 왼쪽으로 밀었다고 생각하고 2차원 배열을 채운다. 맨 왼쪽 줄(= 0번째 열) 과 행=열인 칸은 값을 1로 채운다.
나머지 (i, j) 위치의 칸은 왼쪽 위 칸 (i-1, j-1)과 바로 윗 칸 (i-1,j)의 합으로 채운다.
dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
점 (R,C)부터 길이가 W인 삼각형의 합을 구한다. 이 때 삼각형 모양으로 범위를 제한하기 위해 변수 tmp를 활용하며, 현재 행 i가 R로부터 얼만큼 길어졌는지 그 값을 사용해 행마다 열 길이의 범위를 제한한다.
for(int i = R ; i < R + W ; i++) {
tmp = i - R; // j의 길이 범위 제한하기
for(int j = C ; j < C + W ; j++) {
if(R <= i && i < R + W && C <= j && j <= C + tmp) {
sum += dp[i][j];
}
}
}
🔺 코드
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
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int R = Integer.parseInt(st.nextToken()); // 행
int C = Integer.parseInt(st.nextToken()); // 열
int W = Integer.parseInt(st.nextToken()); // 정삼각형 변 길이
int[][] dp = new int[R + W][R + W];
for(int i = 1 ; i < dp.length ; i++) {
dp[i][1] = 1;
dp[i][i] = 1;
}
for(int i = 1 ; i < dp.length ; i++) {
for(int j = 1 ; j < i ; j++) {
if(i==j) continue;
dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
}
}
int sum = 0;
int tmp = 0; // j의 길이 범위를 삼각형 모양으로 제한하기 위한 변수
for(int i = R ; i < R + W ; i++) {
tmp = i - R; // j의 길이 범위 제한하기
for(int j = C ; j < C + W ; j++) {
if(R <= i && i < R + W && C <= j && j <= C + tmp) {
sum += dp[i][j];
}
}
}
System.out.println(sum);
}
}
|
cs |
➕ 다른 풀이 방식
1) dp식이 다르다! 이것이 훨 깔끔하구먼.. (출처)
for(int i = 0 ; i < W ; i++) {
for(int j = 0 ; j <= i ; j++) {
sum += dp[R + i][C + j];
}
}
2) dp 배열 채우는 것부터 합 구하는 것까지 깔끔하다. 담엔 이렇게 풀어야지!
[백준 알고리즘] 백준 15489번 파스칼 삼각형 자바(Java)
츄르사려고 코딩하는 코집사입니다. 1. [백준 알고리즘] 백준 15489번 파스칼 삼각형 자바(Java) 1) 문제번호 : 15489번 2) 문제 출처 www.acmicpc.net/problem/15489 15489번: 파스칼 삼각형 첫째 줄에 양의 정수 R
yongku.tistory.com
💦 어려웠던 점
- 한 지점으로부터 길이가 W인 정삼각형을 구할 때 어떻게 저 범위까지만 삼각형으로 가져올 수 있지?에 시간이 좀 걸렸다ㅠ
🧐 새로 알게 된 내용
파스칼 삼각형의 한 지점으로부터 삼각형 모양 범위로 합을 구할 때는 이렇게 진행하자.
for(int i = 0 ; i < W ; i++) {
for(int j = 0 ; j <= i ; j++) {
sum += dp[R + i][C + j];
}
}
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 17213번: 과일 서리 (1) | 2024.02.15 |
---|---|
[백준/JAVA] 10164번: 격자상의 경로 (0) | 2024.02.15 |
[백준/JAVA] 15661번: 링크와 스타트 (0) | 2024.02.09 |
[백준/JAVA] 16946번: 벽 부수고 이동하기 4 (0) | 2024.02.08 |
[백준/JAVA] 2961번: 도영이가 만든 맛있는 음식 (1) | 2024.02.07 |