본문 바로가기

백준

백준17213 - 과일서리

https://www.acmicpc.net/problem/17213

 

17213번: 과일 서리

민건이네 과일 농장은 N가지 종류의 과일을 재배하는 중이다. 평소 민건이에게 앙심을 품고 있던 지환이는 민건이를 골탕 먹이기 위하여 민건이네 과일 농장에서 과일들을 훔치기로 다짐했다. 지환이는 완벽한 범죄를 위하여 처음 생각한 개수 만큼만 훔치려고 한다. 이때 지환이가 훔칠 수 있는 경우의 수가 몇가지나 될 지 알아보자. 단, 모든 종류의 과일을 적어도 1개는 훔친다.

www.acmicpc.net

수학적 요소를 중시하는 문제이다.

처음에는 브루트 포스를 사용하려 했지만 문제를 잘 읽어보니 중복조합을 사용하면 될 것 같았다.

N개의 요소 중 M개를 중복하여 선택하는 문제이다.

 

N개의 요소는 모두 적어도 1개를 뽑아야 하는 조건이 있다.

따라서 최종적으로 M은 M - N이 된다.

오랜만에 수학적 요소가 중요하다고 느끼는 문제이다.

#include <iostream>
using namespace std;


int main() {
	int a, b; //a는 입력받을 과일의 갯수, b는 훔칠 과일의 갯수
	long long int bunja = 1, bunmo = 1; //분자와 분모를 나타낸 변수, 콤비네이션을 사용하기 위해 자료형으로 long long int를 선언
    
	cin >> a;
	cin >> b;
    
	b = b - a; //최소 a개의 과일을 적어도 1번은 사용하기 때문에 선언
    
	if (b == 0) { //콤비네이션의 r값이 0이면
		cout << 1; //콤비네이션 정의에 따라 1이 나와야 함
		return 0;
	}
    else { //1이 아니면
        a = a + b - 1; //중복조합에서 n + r - 1을 설정
	    if (a - b < b) { //연산 횟수를 줄이기 위해 사용, n - r < r이면
		    b = a - b; //r을 갱신
	    }
	    for (int i = a; i > a - b; i--) { //a부터 a - b + 1까지
		    bunja = bunja * i; //곱한다.
	    }
	    for (int i = b; i > 0; i--) { //b부터 1까지
		    bunmo = bunmo * i; //곱한다.
	    }
	    cout << bunja / bunmo;
    }
}

'백준' 카테고리의 다른 글

백준3986 - 좋은단어  (0) 2019.06.19
백준2870 - 수학숙제  (0) 2019.06.19
백준11729 - 하노이 탑 이동 순서  (0) 2019.06.11
백준1541 - 잃어버린 괄호  (0) 2019.06.11
백준2012 - 등수 매기기  (0) 2019.06.11