일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 백준
- 문자열
- 구현
- 다이나믹 프로그래밍
- 정보처리기사
- SWEA
- 소수 판정
- springboot
- 백트래킹
- dfs
- 브루트포스 알고리즘
- MYSQL
- 재귀
- 너비 우선 탐색
- Vue
- 알고리즘
- DB
- 프로그래머스
- JPA
- 그래프 이론
- Spring Security
- 자료 구조
- 프로젝트
- 스택
- 깊이 우선 탐색
- 그래프 탐색
- 정수론
- n과 m
- 배포
- 수학
- Today
- Total
영원히 남는 기록, 재밌게 쓰자
백준 [1010] 다리 놓기 (JAVA) 본문
문제
풀이
서쪽과 동쪽 사이트를 다리로 연결하는데 한 사이트에는 최대 한 개의 다리만 연결할 수 있다.
다리를 최대한 많이 짓는 경우(N개)를 가정
다리끼리 서로 겹칠 수 없다.
N보다 M의 갯수가 더 많다고 문제 조건에 주어져 있다. N개를 모두 빠짐 없이 고르는 경우의 수들을 체크해야 한다. M개 중 N개를 택하는 경우 -> 조합을 사용한다.
조합을 사용할 경우 다리가 겹치는 문제도 해결할 수 있다. 조합은 중복을 허용하지 않기 때문이다.
이항 계수와 파스칼의 법칙을 사용하여 nCr 조합을 구현하면 된다.
조합 참고 사이트
https://st-lab.tistory.com/159#%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
[백준] 11050번 : 이항 계수 1 - JAVA [자바]
www.acmicpc.net/problem/11050 11050번: 이항 계수 1 첫째 줄에 \(N\)과 \(K\)가 주어진다. (1 ≤ \(N\) ≤ 10, 0 ≤ \(K\) ≤ \(N\)) www.acmicpc.net 문제 알고리즘 [접근 방법] 이항 계수(Binomial coefficient) 문제 자체는 매
st-lab.tistory.com
2차원 dp 배열을 선언해준다. (부분 문제를 계속해서 재귀함수를 타는 것을 방지하기 위해)
조합 공식과 성질들을 활용하여 문제를 푼다.
조합 공식
조합 성질 1 파스칼의 법칙
간단하게 아래와 같이 표현 가능. 위 식은 파스칼의 삼각형을 생각해보면 된다.
위는 아래와 같이 표현가능
조합 성질 2
위 두 성질과 메모이제이션을 활용하여 구현할 수 있다.
정답코드
package com.baekjoon.dynamic_programming.p1010;
import java.io.*;
import java.util.*;
public class Main {
static int[][] dp = new int[30][30];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
while (T-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int r = Integer.parseInt(st.nextToken());
sb.append(combi(r, n) + "\n");
}
System.out.println(sb);
}
static int combi(int n, int r) {
if (dp[n][r] > 0) {
return dp[n][r];
}
if (n == r || r == 0) {
return dp[n][r] = 1;
}
return dp[n][r] = combi(n - 1, r - 1) + combi(n - 1, r);
}
}
'Algorithm > 백준' 카테고리의 다른 글
백준 [9019] DSLR (JAVA) (0) | 2024.08.09 |
---|---|
백준 [1024] 수열의 합 (JAVA) (0) | 2024.08.05 |
백준 [7662] 이중 우선순위 큐 (JAVA) (0) | 2024.07.18 |
백준 [1976] 여행가자 (JAVA) (0) | 2024.07.12 |
백준 [2504] 괄호의 값 (JAVA) (0) | 2024.07.11 |