※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2629번 문제인 양팔저울이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2629
2629번: 양팔저울
첫째 줄에는 추의 개수가 자연수로 주어진다. 추의 개수는 30 이하이다. 둘째 줄에는 추의 무게들이 자연수로 가벼운 것부터 차례로 주어진다. 같은 무게의 추가 여러 개 있을 수도 있다. 추의 무
www.acmicpc.net
먼저 음의 무게를 잴 수 있다고 가정하자. 이제, 기존에 잴 수 있는 무게와 새로운 추가 있다면, (기존에 잴 수 있는 무게 + 추의 무게)와 (기존에 잴 수 있는 무게 - 추의 무게), (추의 무게 - 기존에 잴 수 있는 무게)를 새로이 잴 수 있게 된다는 점을 관찰하자. 구할 수 있는 음의 무게도 기록해두고 있으므로, 위의 두가지 차를 모두 구할 필요는 없고 한 방향의 차만 구해주어도 충분하다.
추의 개수가 많지 않고 잴 수 있는 숫자의 범위는 항상 15000 이하이므로, 매 새로운 추가 들어올 때마다 잴 수 있는 숫자들을 구해 목록에 합치는 것을 반복하는 것으로 문제를 해결할 수 있다. 글쓴이는 이를 위해 set을 이용하였다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <set>
using namespace std;
set<int> st;
set<int> stst;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
st.insert(0);
int N; cin >> N;
while (N--) {
stst.clear();
int x; cin >> x;
for (auto n : st) {
stst.insert(n + x);
stst.insert(n - x);
}
for (auto n : stst) {
st.insert(n);
}
}
int Q; cin >> Q;
while (Q--) {
int x; cin >> x;
if (st.find(x) == st.end()) cout << "N ";
else cout << "Y ";
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 23058 // C++] 뒤집기 게임 (0) | 2021.12.04 |
---|---|
[BOJ 16724 // C++] 피리 부는 사나이 (0) | 2021.12.03 |
[BOJ 11635 // C++] Wipe Your Whiteboards (0) | 2021.12.01 |
[BOJ 14565 // C++] 역원(Inverse) 구하기 (0) | 2021.11.30 |
[BOJ 10244 // C++] 최대공약수들 (0) | 2021.11.29 |