※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2437번 문제인 저울이다.
문제는 아래 링크를 확인하자.
2437번: 저울
하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다. 이 저울의 양 팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고, 양팔의 길이는 같다. 또한, 저울의 한쪽에는 저울추들만 놓
www.acmicpc.net
이 문제를 knapsack 문제를 해결하듯이 dp를 이용해서 풀려고 시도할 수는 있겠지만, 이 문제에 하기에는 나올 수 있는 숫자의 범위가 넓어 사용하기 좋은 방법이 아니다.
이 문제에서 요구하는 것은 주어진 추들로 구성하지 못하는 최소 정수이므로, 다음과 같은 과정으로 작은 무게의 추부터 순서대로 살펴보는 것으로 만들 수 없는 가장 작은 무게의 조합을 빠르게 계산해낼 수 있다.
1) 주어진 추 가운데 무게가 1인 추가 없다면 1이 만들 수 없는 가장 작은 무게임은 자명하다.
2) 가장 가벼운 추부터 i번째로 가벼운 추까지 사용하여 만들 수 있는 추의 무게의 범위가 1 이상 K 이하라고 가정하자(i > 0).
2-1) i+1번째로 가벼운 추의 무게 X가 K+1 이하라면, 가장 가벼운 추부터 i+1번째로 가벼운 추까지 사용하여 만들 수 있는 추의 무게의 범위는 1 이상 K+X 이하이다. K의 값을 K+X로 갱신하고, 2)로 돌아가 다음 추를 살펴보자. 다음 추가 없다면 답으로 K+1을 출력하고 프로그램을 종료한다.
2-2) i+1번째로 가벼운 추의 무게 X가 K+1을 넘어간다면, 주어진 추로 K+1이라는 무게를 측정할 수 없음을 알 수 있다. 남은 추의 무게는 모두 K+1을 넘어가기 때문이다. 따라서 답으로 K+1을 출력하고 프로그램을 종료한다.
아래는 제출한 소스코드다. 위의 내용을 그대로 구현한 것으로, 특별한 주석은 달지 않았다.
#include <iostream>
#include <algorithm>
using namespace std;
int arr[1000];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
for (int i = 0;i < N;i++) {
cin >> arr[i];
}
sort(arr, arr + N);
if (arr[0] != 1) {
cout << 1;
return 0;
}
int ans = 1;
for (int i = 1;i < N;i++) {
if (arr[i] <= ans + 1) ans += arr[i];
else break;
}
cout << ans + 1;
}
'BOJ' 카테고리의 다른 글
[BOJ 2075 // C++] N번째 큰 수 (0) | 2021.04.21 |
---|---|
[BOJ 2810 // C++] 컵홀더 (0) | 2021.04.20 |
[BOJ 17481 // C++] 최애 정하기 (0) | 2021.04.18 |
[BOJ 3049 // C++] 다각형의 대각선 (0) | 2021.04.17 |
[BOJ 3005 // C++] 크로스워드 퍼즐 쳐다보기 (0) | 2021.04.16 |