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); } }