[백준 알고리즘]/[C++]
백준 2437 저울 | C++
말하는펭귄
2021. 3. 25. 10:50
728x90
반응형
이번 포스팅은 백준 2437번 저울입니다.
아래 url를 클릭하시면 백준 사이트에서 문제를 볼 수 있습니다.
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*, int, int, int);
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
반응형