728x90
반응형
728x90
이번 문제는 동적계획법 문제이다.
그냥 정확히 말하면 조합 문제이다.
반응형
강 동쪽에서 M개 중에 N개를 골라 다리를 연결하는 것이니 조합 문제인 것이 당연할 것이다.
Top Down, Bottom Up 둘 중 하나의 방식으로 풀면 된다.
하지만, Top Down처럼 재귀로 호출하는 방식은 스택오버플로우를 불러 일으키기 쉬운 문제이다.
그래서 Bottom Up 방식으로 문제를 풀면 되는데,
이 문제를 푸는 방법중에서는 파스칼의 삼각형을 보면 좋다.
이와 같은 삼각형 모습을 이루는 구조가 파스칼의 삼각형인데,
이것은 (x - 1)^2 나 (x-1)^3 을 펼쳐 계산하면 위와 같은 계수로 나오는 것을 알수 있다.
파스칼의 삼각형을 적용하여 코드를 구현하면 아래와 같다.
package dp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class PutBridge {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = stoi(br.readLine());
while(T-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int M = stoi(st.nextToken());
int N = stoi(st.nextToken());
int[] []dp = new int[31][31];
dp[0][0] = 1;
for (int i = 1; i <= N; i++) {
for (int j = 0; j <= i; j++) {
if(j == 0) {
dp[i][j] = 1;
} else {
dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
}
}
}
bw.write(dp[N][M] + "\n");
}
bw.flush();
}
public static int stoi(String str) {
return Integer.parseInt(str);
}
public static int factorial(int n) {
if(n == 1) return 1;
else return n *factorial(n-1);
}
}
728x90
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[백준/java] 2589번: 보물섬 - BFS, 브루트포스 (0) | 2021.08.18 |
---|---|
[백준/java] 2206번: 벽 부수고 이동하기 - BFS (0) | 2021.08.17 |
[백준/java] 2178번: 미로 탐색 - BFS (0) | 2021.08.16 |
[백준/java] 2667번 :단지번호붙이기 - BFS (0) | 2021.08.16 |
[백준/java] 7569번 : 토마토(3차원배열) BFS (0) | 2021.08.15 |
댓글