일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 유니티 심화과정
- 코딩 테스트
- 5월
- 다이나믹 프로그래밍
- c++
- 2월
- 3월
- 입문
- 4월
- 유니티
- 코딩 기초 트레이닝
- 수학
- 게임 엔진 공부
- todolist
- 골드메탈
- 2025년
- 자료 구조
- 프로그래머스
- 2023년
- 1월
- 2024년
- 기초
- 개인 프로젝트
- 7월
- 단계별로 풀어보기
- 10월
- C/C++
- 개인 프로젝트 - 런앤건
- 백준
- 2022년
- Today
- Total
기록 보관소
[Baekjoon/백준] 1010번: 다리 놓기(C/C++) 본문
단계별로 풀어보기 17단계(정수론 및 조합론) 9번 문제
https://www.acmicpc.net/step/18
정수론 및 조합론 단계
N개의 물건 중 순서를 고려하지 않고 K개를 고르는 경우의 수, 이항 계수를 구하는 문제
www.acmicpc.net
백준 1010번: 다리 놓기
https://www.acmicpc.net/problem/1010
1010번: 다리 놓기
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
www.acmicpc.net
문제 설명
재원이는 한 도시의 시장이 되었다. 이 도시에는 도시를 동쪽과 서쪽으로 나누는 큰 일직선 모양의 강이 흐르고 있다. 하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 것을 알았다. (N ≤ M)
재원이는 서쪽의 사이트와 동쪽의 사이트를 다리로 연결하려고 한다. (이때 한 사이트에는 최대 한 개의 다리만 연결될 수 있다.) 재원이는 다리를 최대한 많이 지으려고 하기 때문에 서쪽의 사이트 개수만큼 (N개) 다리를 지으려고 한다. 다리끼리는 서로 겹쳐질 수 없다고 할 때 다리를 지을 수 있는 경우의 수를 구하는 프로그램을 작성하라.
입력과 출력
입력: 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
출력: 각 테스트 케이스에 대해 주어진 조건하에 다리를 지을 수 있는 경우의 수를 출력한다.
접근 방법
이번 문제는 테스트 케이스 T를 입력받고 각 테스트 케이스마다 강의 서쪽의 사이트 개수 N과 동쪽에 있는 사이트 개수 M을 입력받아서 다리를 지을 수 있는 경우의 수를 출력하는 문제다. 단, 다리가 겹치면 안된다.
따로 조건이 있는 것도 아니고, 그냥 다리를 N개만큼 깔아서 겹치지만 않게 연결하면 된다. 하지만 두 지점 모두 겹치지만 않는다면 연결하는 경우들을 구해야하는 점과 예제의 3번째 테스트 케이스처럼 숫자가 숫자가 굉장히 커질 가능성이 있으므로, 다이나믹 프로그래밍으로 문제를 해결하는 것이 좋을 것같다. 경우의 수는 이전에 풀었던 문제처럼 아래와 같은 공식을 이용하면 문제를 해결할 수 있다.
코드
#include <iostream>
using namespace std;
#define MAX 31
int arr[MAX][MAX];
int main(int argc, char * argv[]) {
int T, N, M;
cin >> T;
for (int i = 0; i < T; i++) {
cin >> N >> M;
for (int j = 1; j <= M; j++)
arr[1][j] = j;
for (int j = 2; j <= N; j++)
for (int h = 2; h <= M; h++)
arr[j][h] = arr[j - 1][h - 1] + arr[j][h - 1];
cout << arr[N][M] << endl;
}
return 0;
}
결과
'코딩 테스트 > 백준' 카테고리의 다른 글
[Baekjoon/백준] 1676번: 팩토리얼 0의 개수(C/C++) (0) | 2022.04.03 |
---|---|
[Baekjoon/백준] 9375번: 패션왕 신해빈(C/C++) (0) | 2022.04.02 |
[Baekjoon/백준] 11051번: 이항 계수 2(C/C++) (0) | 2022.03.30 |
[Baekjoon/백준] 11050번: 이항 계수 1(C/C++) (0) | 2022.03.27 |
[Baekjoon/백준] 3036번: 링(C/C++) (0) | 2022.03.26 |