https://school.programmers.co.kr/learn/courses/30/lessons/42862
map을 사용했다. 일단 2벌인 사람들을 전부 value에 2를 넣고 2벌인데 잃어버린 사람은 -- 해준다( 벌써 많이 느려짐 )
그후 lost 를 for문 돌리면서 m[l]이 0이고 m[l-1]이나 m[l+1]이 2인 경우만 빌려주기 처리한다.
다 끝낸 후 아직도 0인 갯수를 샌 뒤 전체에서 뺀다.
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
map<int,int> m;
sort(lost.begin(),lost.end());
sort(reserve.begin(), reserve.end());
for(int r : reserve)
m[r] += 2;
for(int l : lost)
if(m[l] == 2)
m[l]--;
for(int l : lost)
{
if(m[l] == 0 && (m[l-1] == 2 || m[l+1] == 2))
{
m[l] = 1;
m[l-1] == 2 ? m[l-1]-- : m[l+1]--;
}
}
for(int l : lost)
if(m[l] == 0)
answer++;
return n - answer;
}
#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;
}
굳이 map을 쓰지않고 array 하나를 만든다. 최대 인원이 30이지만 index 오버를 방지하기 위해 35까지 넉넉하게 했다. reserve에 있는 학생은 +1 lost에 있는 학생은 -1을 한다. 그 후 -1인 학생만 양 옆을 탐색해서 처리해주면 된다.