코테/백준

[백준/JAVA] 1010번: 다리 놓기

imname1am 2023. 5. 10. 22:43
반응형

🔺 문제

 

1010번: 다리 놓기

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

www.acmicpc.net

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        // DP 배열 초기화
        long[][] bridge = new long[31][31];
        for(int i = 0 ; i <= 30 ; i++) {
            bridge[i][0= 1;
            bridge[i][1= i;
            bridge[i][i] = 1;
        }
        
        // DP 수행
        for(int i = 2 ; i <= 30 ; i++) {
            for(int j = 1 ; j < i ; j++) { // 고르는 수가 전체 개수 넘지 않게
                bridge[i][j] = bridge[i - 1][j] + bridge[i - 1][j - 1]; // 파스칼의 삼각형
            }
        }
        
        StringBuilder sb = new StringBuilder();
        int T = Integer.parseInt(br.readLine());
        
        while(T --> 0) {
            st = new StringTokenizer(br.readLine()," ");
            int N = Integer.parseInt(st.nextToken());   // 서
            int M = Integer.parseInt(st.nextToken());   // 동
            
            sb.append(bridge[M][N] + "\n");
        }
        
        System.out.println(sb);
        br.close();
    }
}
cs
✅ 해결 아이디어
✔ 조합!
- DP (점화식) : Bottom-UP 방식

 

 

💥 유의사항

• 20! 만 되어도 long 범위를 넘어간다고 함!

 


🔺 다른 풀이들

- 재귀로도 푼 방법! (메모이제이션)

 

[백준] 1010번 : 다리 놓기 - JAVA [자바]

www.acmicpc.net/problem/1010 1010번: 다리 놓기 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 <

st-lab.tistory.com

 


💬 느낀 점

20!만 넘어도 long 범위를 넘어간다는 것을 기억해두자!

 

 

 

1회독 2회독 3회독 4회독 5회독
V 230703 240628    

 

 

(+ 230703 2회독)

위랑 별 차이 없음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        
        int[][] dp = new int[31][31];
        for(int i = 0 ; i < 31 ; i++) {
            dp[i][0= 1;
            dp[i][i] = 1;
            dp[i][1= i;
        }
 
        for(int i = 1 ; i < 31 ; i++) {
            for(int j = 2 ; j < 31 ; j++) {
                dp[i][j] = dp[i-1][j] + dp[i-1][j-1];
            }
        } 
        
        int T = Integer.parseInt(br.readLine());
        while(T --> 0) {
            st = new StringTokenizer(br.readLine(), " ");
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());
            
            sb.append(dp[M][N]).append("\n");
        }
        System.out.println(sb);
    }
}
 
cs

 


(참고)

 

[백준/JAVA] 11050번: 이항 계수 1

🔺 문제 11050번: 이항 계수 1 첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 10, 0 ≤ \(K\) ≤ \(N\)) www.acmicpc.net 🔺 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import jav

bono039.tistory.com

 

반응형