#include <string>
#include <vector>
#include <memory>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
// 먼저 본인이 도난 당했지만, 여벌옷을 가져왔을 때의 경우이다.
// 이때 lost는 제거되고, reserve또한 제거된다.
for(int i=0; i<lost.size(); i++){
for(int j=0; j<reserve.size(); j++){
if(lost[i] == reserve[j]){
lost[i] = -1;
reserve[j] = -1;
}
}
}
int cnt = 0;
// 이후 도난 당한 학생의 앞뒤를 확인하여 만약에 여분이 존재한다면 빌려주는 절차를 진행한다.
for(int i=0; i<lost.size(); i++){
for(int j=0; j<reserve.size(); j++){
if(lost[i]-1 == reserve[j] || lost[i]+1 == reserve[j]){
lost[i] = -1;
reserve[j] = -1;
}
}
}
// 전체에서 lost값이 남아있는 학생들을 빼주면 이것이 체육수업을 들을 수 있는 학생의 최대값이다.
for(int i=0; i<lost.size(); i++){
if(lost[i] != -1) cnt++;
}
return n-cnt;
}
#include <string>
#include <vector>
using namespace std;
int student[35];
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
// 나는 이부분에서 굳이 비효율적이게 이중 포문을 사용하였다.
// 여기서 reserve를 통해 1을 더해주고, 다시 lost로 1을 빼주는 과정이다.
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;
}
이 문제를 처음에 풀 당시 대체 왜 이중포문을 낭비했는지 모르겠다..... ㅋㅋㅋ 아직 많이 부족한것 같다. 다른분께서 푸신 방법처럼 저렇게 포문 하나로 충분히 풀 수 있었고, 나또한 생각할 수 있는 문제였다. 조금 더 집중하고 더 잘해봐야겠다.