일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 독학
- DFS
- 분할정복
- 백준
- SWIFT
- 세브란스
- 부주상골증후군
- dp
- 부주상골수술
- 코테
- sql
- istringstream
- ChatGPT
- 코딩테스트
- 롯데정보통신
- 부주상골
- c++
- 카카오인턴
- 카카오코테
- 스택
- BFS
- 구현
- 부주상골수술후기
- 카카오인턴십
- 독일어독학
- 독일어
- 프로그래머스
- 리눅스
- IOS
- SQLD
Archives
- Today
- Total
슈뢰딩거의 고등어
[백준] 1010 다리놓기 (조합의 수) n개에서 m개 뽑기 본문
https://www.acmicpc.net/problem/1010
초반 생각한 방식은 m개중 n 개를 뽑으면 자동으로 된다고 생각했다. 그래서 익숙한 dfs로 길이가 n인 조합을 구했는데
시간초과가 떳다...ㅎ
경우의 수만 구하면 되는 거니까 수학공식을 사용해서 하면 될것이라고 생각해서 했지만
결과값이 int 가 담을 수 없는 숫자라서 실패
그래서 타입을 long long 에서 unsigned long long 으로 변경한 후 해봤지만 시간초과... and 50% 에서 실패
(n개 중에서 m개를 뽑는 조합의 가짓수)=(n개 중에서 m개를 뽑는 순열의 가짓수)÷m!
=
=
질문검색을 해본 결과
n에서 m 개를 뽑는 경우의 수는 n에서 (n-m) 개를 뽑는 경우의 수와 동일하다
에서 힌트를 얻고 if (m/2 < n) n = m-n 를 추가했다
그 결과 성공
#include <iostream>
#include <vector>
using namespace std;
int n, m;
int t;
// m 개중에서 n을 뽑기
unsigned long long choice(int n, int m) {
unsigned long long a = 1;
unsigned long long b = 1;
for(int i=m; i>=(m-n+1); i--)
a = a * i;
for(int i=n; i>=1; i--)
b = b*i;
return a / b;
}
int main() {
scanf("%d", &t);
while(t--) {
scanf("%d %d", &n, &m);
if(m/2 < n) n = m-n;
unsigned long long answer = choice(n, m);
printf("%llu\n", answer);
}
}
'알고리즘' 카테고리의 다른 글
[프로그래머스] SQL 고득점 키트 (0) | 2022.02.04 |
---|---|
[백준] 14916 거스름돈 (DP) (0) | 2022.02.04 |
[백준] 9625 BABBA (0) | 2022.02.03 |
[프로그래머스] 다리를 지나는 트럭 (0) | 2022.02.03 |
[백준] 2252 줄 세우기 (위상 정렬, topology sort) (0) | 2022.01.31 |
Comments