해당 문제는 학생들이 체육복을 가지고 있었는데 도난당했을 경우 서로 빌려주었을 때 체육복을 가지고 있을 수 있는 학생의 최댓값을 구하는 문제이다. 이때 체육복은 자신의 전, 후 사람과만 교환할 수 있다.
단순하게 생각하면 쉽게 풀 수 있는 문제였다. 우선 모두 1개씩 체육복을 가지고 있다고 가정하고 여벌을 가지고 있는 학생들에게 모두 1개씩 체육복을 더 부여한다. 그리고 도난 당한 학생들의 체육복을 한개씩 뺏는다. 그 후에 모든 학생들을 앞에서부터 확인하며 체육복이 2개일 경우 앞에 사람이 체육복이 없으면 주고, 앞에 사람은 있고 뒷 사람이 없으면 체육복을 주는 과정을 반복하면 해결되는 문제이다. 이러한 루프를 모두 거쳤다면 마지막에 모든 학생들을 확인하며 체육복을 2개이상 가진 학생들의 수를 세어주면 해결된다.
#include <string>
#include <vector>
using namespace std;
int arr[35];
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
for (int i = 1; i <= n; i++)
arr[i] = 1;
for (auto el : reserve)
arr[el]++;
for (auto el : lost)
arr[el]--;
for (int i = 1; i <= n; i++) {
if (arr[i] == 2 && 1 < i && !arr[i - 1]) {
arr[i - 1]++;
arr[i]--;
}
if (arr[i] == 2 && i < n && !arr[i + 1]) {
arr[i + 1]++;
arr[i]--;
}
}
for (int i = 1; i <= n; i++)
if (arr[i] > 0)
answer++;
return answer;
}
int main() {
vector<int> lost;
vector<int> re;
lost.push_back(2);
lost.push_back(4);
//re.push_back(1);
re.push_back(3);
//re.push_back(5);
int answer = solution(5, lost, re);
printf("%d\n", answer);
return 0;
}