※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts