이것은 나의 자존감 상승을 위한 브론즈 문제.. 다행히 맞았다! 사실 틀렸어도 기죽을 필요는 없다 더 공부하면 되니까!!!!! 요거슨 성공코드
package baekjoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main_2775 {
static int count=0;
static int[][] dp;
public static void main(String[] args) throws IOException {
// a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야한다
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.valueOf(br.readLine()); // 테스트 케이스 수
int[] result = new int[T];
for (int i = 0; i < T; i++) {
count = 0;
int k = Integer.valueOf(br.readLine()); // k층
int n = Integer.valueOf(br.readLine()); // n호
dp = new int[k+1][n+1];
for (int j = 1; j <= n; j++) {
dp[0][j] = j;
}
result[i] = dp(k, n);
}
for (int r : result) {
System.out.println(r);
}
}
public static int dp(int k, int n) {
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = dp[i][j-1]+dp[i-1][j];
//System.out.println("dp["+i+"]["+j+"] = dp["+i+"]["+(j-1)+"] + dp["+(i-1)+"]["+j+"]");
//System.out.println(dp[i][j]+" = "+dp[i][j-1]+" + "+dp[i-1][j]);
}
}
return dp[k][n];
}
}
/*
*
* 0층 1:1 2:2 3:3 4:4..
* 1층 1:1 2:3 3:6 4:10.. 2 3 4
* 2층 1:1 2:4 3:10 4:20.. 3 6 10
* 3층 1:1 2:5 3:15 4:35.. 4 10 20
*
* 직전 호수만큼씩 커진다
*
* */
풀이를 하자면.. 0층부터 k층의 n호까지 일일이 계산해봤다. 그랬더니 직전 층의 호수만큼씩 값이 증가하는 것을 확인할 수 있었다. 1층의 1호 2호 3호의 차이는 0층의 2호 3호 4호의 값만큼 증가했고 2층의 1호 2호 3호는 1층의 2호 3호 4호만큼 증가했다.
이걸 점화식으로 표현하니
d[i][j] = d[i][j-1] + d[i-1][j]
가 나온다는 것을 알 수 있었다.
일단 0층은 호수가 곧 인원수이므로 초기값으로 세팅해주고 점화식을 그대로 for문 안에 넣어 0층부터 k층 n호까지 값을 저장했다. bottom-up 방식 !