문제풀이/구름
[구름 Level] 구슬 주머니
Hyeon-Uk
2021. 5. 25. 20:02
반응형
https://level.goorm.io/exam/49102/%EA%B5%AC%EC%8A%AC-%EC%A3%BC%EB%A8%B8%EB%8B%88/quiz/1
구름LEVEL
코딩테스트에서 가장 높은 비중을 차지하는 알고리즘 문제를 제작하고 풀이할 수 있는 온라인 저지 서비스입니다. 기업에서 선호하는 C, C++, 파이썬(Python), 자바(Java), 자바스크립트(Javascript) 이
level.goorm.io
-풀이-
내용은, i번째 구슬을 뺀 나머지 값의 합을 2로 나눈뒤, 2로 나눈 구슬이 있냐 없냐에 따라 결과를 정한다.
한 구슬을 뺀 나머지 구슬들의 합이 10이라고 한다면, 한개는 5, 나머지의 합이 5가 되어야 좋은 주머니가 된다. 따라서 나머지 구슬 중 , 5를 가진 구슬이 있다면, 좋은 주머니가 된다.
이때, i번째 구슬을 뺀 나머지 값의 합이 홀수라면, 어떤 경우라도 좋은 주머니가 될 수 없다.
예를들어 i번째 구슬을 뺀 나머지 값의 합이 11이라고 한다면, 구슬하나를 A, 나머지 구슬의 합을 B라 할때, A+B=11, A=B가 되어야 하는데 , A+B의 값이 홀수라면 성립되지 않기때문이다.
따라서 우리는 짝수인 경우만 고려해주면 된다.
마지막으로 현재 뺀값과 중간값이 같다면, 현재 뺀 값이 2개 이상이여야만 답이되므로, 그것도 고려해주어 코드를 짜야한다.
-코드-
#include <iostream>
#include<map>
#include<vector>
using namespace std;
vector<long long> v;
vector<int> answer;
map<long long,int> m;
int n;
int main() {
cin>>n;
v.resize(n);
long long sum=0;
for(int i=0;i<n;i++){
cin>>v[i];
m[v[i]]++;
sum+=v[i];
}
for(int i=0;i<n;i++){
sum-=v[i];
if(sum%2==0){
long long mid=sum/2;
if(m[mid]>=1){
if(mid==v[i]){
if(m[mid]>=2){
answer.push_back(i+1);
}
}
else{
answer.push_back(i+1);
}
}
}
sum+=v[i];
}
cout<<answer.size()<<"\n";
for(int i=0;i<answer.size();i++){
cout<<answer[i]<<" ";
}
return 0;
}
반응형