Be a developer

백준 2309 일곱 난쟁이 본문

알고리즘

백준 2309 일곱 난쟁이

중국고대사 2019. 3. 25. 15:21



생각해야할 알고리즘 종류를 크게 보면 부르트포스, BFS, 다이나믹 프로그래밍이 있다.

먼저 브루트포스를 나누면 

1. for문을 사용하는 방법

2. 순열을 사용하는 방법

3. 재귀 호출을 사용하는 방법

4. 비트마스크를 사용하는 방법

이 있다.

브루트포스는 모든 경우의 수를 다 계산하므로, 풀려면 시간 제한을 봐야한다. 1초는 1억개의 경우의 수를 한계로 잡는다.

보통 10*10! 정도 까지?


방법

1. 문제의 가능한 모든 경우의 수를 계산해본다.

2. 가능한 모든 방법을 다 만들어본다.

3. 각각의 방법을 이용해 답을 구해본다.



위의 문제를 분석해보자.

9명 중 7명을 골라서 합이 100이 되어야 한다.

for문 7개를 사용해서 풀 수도 있지만, for문 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
#include <iostream>
#include <algorithm>
using namespace std;
 
int n = 9;
int *bf = new int[n];
 
int main(int argc, char* argv[]) {
    int sum = 0;
 
    for (int i = 0; i < n; i++) {
        cin >> bf[i];
        sum += bf[i];
    }
    //for문을 사용 하고, 결과가 오름차순으로 정렬되어야 하므로, 미리 정렬시킨다.
    sort(bf, bf+ n);
    cout << '\n';
    //2명을 구하는데 N^2 X 합을 구하는 for문 N => N^3같지만, 답을 찾았을 때 딱 한 번만 실행되므로, 실제로는 N^2의 시간 복잡도를 가진다.
    for(int i = 0;i<n;i++)
        for(int j = i+1;j<n;j++)
            if (sum - bf[i] - bf[j] == 100) {
                for (int k = 0; k < n; k++) {
                    if (k == i || k == j)continue;
                    else cout << bf[k] << '\n';
                }
                //답은 하나만 찾으면 되니까 return으로 종료시켜줘야 한다.
                return 0;
            }
 
    return 0;
}
cs


출처: https://www.acmicpc.net/problem/2309

'알고리즘' 카테고리의 다른 글

백준 10819 차이를 최대로  (0) 2019.03.27
백준 10972 다음 순열  (0) 2019.03.27
백준 9095 1,2,3 더하기  (0) 2019.03.27
백준 14500 테트로미노  (0) 2019.03.27
백준 1476 날짜 계산  (0) 2019.03.26
Comments