풀이
- 만들 수 있는 각도로 새로운 각도를 만들어 set에 넣는다.
- set에 있는 원소를 vector에 넣은 다음 2중 for문을 통해 만들 수 있는 모든 각도를 만든 후 다시 set에 넣는다.
- 반복하다가 set의 크기와 vector의 크기가 같아지면 더 이상 추가될 게 없다는 것이므로 이 때 set에 현우가 외친 각이 있으면 YES, 없으면 NO
코드
#include <iostream>
#include <set>
#include <vector>
using namespace std;
int n, k;
vector<int> angle;
vector<int> output;
void input() {
cin >> n >> k;
int temp;
for(int i=0;i<n;++i) {
cin >> temp;
angle.push_back(temp);
}
for(int i=0;i<k;++i) {
cin >> temp;
output.push_back(temp);
}
}
int convert(int num) {
if(num >= 360) {
return num - 360;
}
if(num < 0) {
return num + 360;
}
return num;
}
set<int> ans;
void process() {
int nowAnsLength = 0;
for(int i=0;i<angle.size(); ++i) {
ans.insert(convert(angle[i]));
}
for(int i=0;i<angle.size(); ++i) {
for(int j=0;j<angle.size(); ++j) {
ans.insert(convert(angle[i] + angle[j]));
ans.insert(convert(angle[i] - angle[j]));
}
}
while(nowAnsLength != ans.size()) {
nowAnsLength = ans.size();
vector<int> temp_vec;
for(auto x : ans) {
temp_vec.push_back(x);
}
for(int i=0;i<temp_vec.size(); ++i) {
for(int j=0;j<temp_vec.size(); ++j) {
ans.insert(convert(temp_vec[i] + temp_vec[j]));
ans.insert(convert(temp_vec[i] - temp_vec[j]));
}
}
}
for(int i=0;i<output.size();++i) {
if(ans.count(output[i]) == 0) {
cout << "NO" << endl;
} else {
cout << "YES" << endl;
}
}
return;
}
int main(void) {
input();
process();
}