[백준 알고리즘]/[C++]

백준 2437 저울 | C++

말하는펭귄 2021. 3. 25. 10:50
728x90
반응형

 

 

이번 포스팅은 백준 2437번 저울입니다.

아래 url를 클릭하시면 백준 사이트에서 문제를 볼 수 있습니다.

www.acmicpc.net/problem/2437

 

2437번: 저울

하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다. 이 저울의 양 팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고, 양팔의 길이는 같다. 또한, 저울의 한쪽에는 저울추들만 놓

www.acmicpc.net

 

 

 

기본 알고리즘

그리디 알고리즘

 

셸 정렬 사용함

벡터와 sort 함수를 사용하면 코드의 길이와 실행 시간을 단축할 수 있다.

 

풀이

자연수 배열에서 배열 원소에 1이 존재하고, 배열의 (i-1)번째 원소까지의 누적합 sum에 대해

arr[i] <= sum + 1 을 만족하면 배열 원소의 부분합으로 1부터 sum까지의 자연수를 모두 표현할 수 있다.

 

 

 

전체 코드

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//백준2437 저울                                                                
#include <iostream>
using namespace std;
 
void sortGapInsertion(int*intintint);
void shellSort(int*int);
 
int main() {
    int N; //list 원소 개수
    int list[1001]; //저울추 저장 배열
    int sum; //누적합 저장 변수
    int ans; //출력
    
    /*입력*/
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> list[i];
    }
 
    /*셸 정렬*/
    shellSort(list, N);
 
    /*풀이*/
    if (list[0!= 1) {
        ans = 1;
    }
    else {
        sum = list[0];
        for (int i = 1; i < N; i++) {
            if (sum + 1 < list[i]) {
                break;
            }
            sum += list[i];
        }
        ans = sum + 1;
    }
    
    /*출력*/
    cout << ans;
    return 0;
}
 
void sortGapInsertion(int* list, int first, int last, int gap) {
    int i, j, key;
    for (i = first + gap; i <= last; i++) {
        key = list[i];
        for (j = i - gap; j >= 0 && list[j] > key; j -= gap) {
            list[j + gap] = list[j];
        }
        list[j + gap] = key;
    }
}
 
void shellSort(int* list, int n) {
    int gap;
    for (gap = n / 2; gap > 0; gap /= 2) {
        if (gap % 2 == 0) gap++;
        for (int i = 0; i < gap; i++) {
            sortGapInsertion(list, i, n - 1, gap);
        }
    }
}
cs

 

 

 

 

728x90
반응형