코딩테스트
[백준/1010/다리 놓기]
개발하는지호
2024. 3. 19. 01:19
https://www.acmicpc.net/problem/1010
1010번: 다리 놓기
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
www.acmicpc.net
<<풀이>>
이 문제는 DFS로 풀었다. 처음에는 시간 초과가 났는데 메모제이션을 활용한다면 이를 극복할 수 있고 메모리 초과 같은 경우는 내가 다리가 놓아질 수 있는 최대 갯수를 확인 안 하고 무작정 높게 잡아서 생긴 문제이다. 이런 부분만 조심하면 바로 구할 수 있다!!
메모제이션을 활용할 때 조합쳐럼 nCr 에 특정 n, r일 때의 값을 저장해야 하기 때문에 이중배열을 사용해서 메모제이션을 활용했다.
외에는 조합을 풀기 위한 정형적인 방식이다 !!
nCr = n-1Cr + n-1Cr-1
이 공식을 잘 기억해두자!
import java.util.Scanner;
class Data {
int a;
int b;
public Data(int a, int b) {
this.a = a;
this.b = b;
}
}
class Main {
public static int[][] ch = new int[50][50];
private int DFS(int b, int a, int n) {
if (ch[b][a] > 0) return ch[b][a];
for (int i = 0; i < n; i++) {
if (b == a || a == 0) return 1;
else return ch[b][a] = DFS(b - 1, a - 1, n) + DFS(b - 1, a, n);
}
return -1;
}
public static void main (String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
Data[] data = new Data[n];
for (int i = 0; i < n; i++) {
data[i] = new Data(in.nextInt(), in.nextInt());
}
for (int i = 0; i < n; i++) {
System.out.println(T.DFS(data[i].b, data[i].a, n));
}
}
}