[C++] 프로그래머스 '체육복' 풀이

#include <string>
#include <vector>
#include <bits/stdc++.h> 

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    set<int> s;
    //소거법으로 없애는 게 좋을듯 
    for(int i=1;i<=n;i++) s.insert(i);
    for(int e:lost) s.erase(e);
    for(int e:reserve){ 
        //뒷 친구 없을 때 
        if(!s.count(e+1) && e!=n) s.insert(e+1);
        //본인 없을 때 
        else if(!s.count(e)) s.insert(e);
        //앞 친구 없을 때 
        else if(!s.count(e-1)&&e!=1) s.insert(e-1);
    }
    answer=s.size();
    return answer;
}

자꾸 정확성 83임ㅜㅜ 어렵고도 먼 코테의 길, 

 

일단 벡터는 다른 자료구조로 옮기는 게 좋을듯 특히 find 쓸 때 인자 넣기 너무 불편 

 

 

#include <string>
#include <vector>
#include <bits/stdc++.h> 

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    set<int> s;
    set<int> lostset(lost.begin(),lost.end());
    set<int> reserveset(reserve.begin(),reserve.end());
    //소거법으로 없애는 게 좋을듯 
    for(int i=1;i<=n;i++) s.insert(i);
    for(int e:lostset) { 
        if(reserveset.count(e)){
            //본인 게 없으면 
            reserveset.erase(e);
        }else{
            s.erase(e);
        }
    }
    for(int e:reserveset){ 
        //앞 친구 없을 때 
        if(!s.count(e-1)&&e!=1) s.insert(e-1);
        //뒷 친구 없을 때 
        else if(!s.count(e+1) && e!=n) s.insert(e+1);
    }
    answer=s.size();
    return answer;
}

수정한 부분 

-> erase, reserve를 reserve 탐색하기 전 중복 다 제거 

-> 오름차순에서 앞친구 먼저 그리디 해야 누락이 없음