set_difference라는 차집합을 구하는 표준 라이브러리 함수를 사용해서
체육복이 두 벌인 사람이 잃어버려서 한 벌이 된 사람부터 두 벡터에서 제외시켰다.
그 후 find_if를 통해 체육복을 잃어버린 사람의 앞번호와 뒷번호를 확인해서 빌려줄 사람이 있을 때
reserve에서 해당 번호를 제외시켰다.
🎉완성코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
sort(lost.begin(), lost.end());
sort(reserve.begin(), reserve.end());
vector<int> lost2;
vector<int> reserve2;
set_difference(lost.begin(), lost.end(), reserve.begin(), reserve.end(), back_inserter(lost2));
set_difference(reserve.begin(), reserve.end(), lost.begin(), lost.end(), back_inserter(reserve2));
int cover = lost2.size();
for (auto& d : lost2)
{
auto give = find_if(reserve2.begin(), reserve2.end(), [&d](int a) {return (a == d - 1) || (a == d + 1); });
if (give != reserve2.end())
{
reserve2.erase(give);
--cover;
continue;
}
}
return n - cover;
}
학생 번호를 인덱스로 삼아서 문제를 해결했다.
#include <string>
#include <vector>
using namespace std;
int student[35];
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
for(int i : reserve) student[i] += 1;
for(int i : lost) student[i] += -1;
for(int i = 1; i <= n; i++) {
if(student[i] == -1) {
if(student[i-1] == 1)
student[i-1] = student[i] = 0;
else if(student[i+1] == 1)
student[i] = student[i+1] = 0;
}
}
for(int i = 1; i <=n; i++)
if(student[i] != -1) answer++;
return answer;
}