https://www.acmicpc.net/problem/2775
2775번: 부녀회장이 될테야
첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다
www.acmicpc.net
코드설명
DP(Dynamic Programming) 을 활용합니다.
문제에서 바텀업 방식으로 접근했습니다.
층 / 호 | 1 | 2 | 3 |
0 | 1 | 2 | 3 |
1 | 1 | 3 | 6 |
2 | 1 | 4 | 10 |
3 | 1 | 5 | 15 |
위와 같이 표를 나타낼 수 있는데, 이를 일반화시키면
dp[i][j] = dp[i][j-1] + dp[i-1][j] 로 표현할 수 있습니다. 단 j >= 2 부터입니다.
조금 더 쉽게 표현해보면
dp[현재층][현재 호수] = dp[현재층][현재 호수 - 1] + dp[현재층 -1][현재호수] 로 표현할 수 있습니다.
코드
package algorhythm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.StringTokenizer;
public class Main {
public static int N, M, T;
public static int answer = 0;
public static int[][] dp = new int[15][15];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
T = Integer.parseInt(st.nextToken());
//0층 0 호부터 ~ 0 층 14호까지 col 명으로 초기화합니다.
for(int col=0;col<15;col++) {
dp[0][col] = col + 1;
}
//일반화시킬 것 입니다.
for(int i=1; i<15;i++) {
dp[i][0] = 1;
for(int j=1; j<15;j++) {
dp[i][j] = dp[i][j-1] + dp[i-1][j];
}
}
for(int t = 0; t < T; t++) {
st = new StringTokenizer(br.readLine());
int k = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
System.out.println(dp[k][n-1]);
}
// System.out.println(answer);
}
}