문제 종류 - 그리디 (Greedy)
★ Point
1. 여벌 옷을 가지고 있는 학생이 도난 당한 학생에도 속하는지 먼저 검사하여 -1로 만들어준다.
2. lost와 reserve 배열을 상대로 이중 for문을 돌아 옷을 빌려주면 -1로 만들어 뒤의 학생에게 빌려주지 않도록 한다.
(어짜피 lost는 문제에서 오름차순으로 정렬되어있기 때문에 이렇게 차례로 검사하는게 가능하다.)
class Solution {
public int solution(int n, int[] lost, int[] reserve) {
int answer = 0;
int exist = 0;
int count = 0;
//여벌 옷을 가지고 있는 학생이 도난 당하면 빌려줄 수 없도록 만든다.
for(int i=0; i<lost.length; i++) {
for(int j=0; j<reserve.length; j++) {
if(lost[i]==reserve[j]) {
exist++;
lost[i] = -1;
reserve[j] = -1;
break;
}
}
}
//옷을 빌려주고 -1로 만들어 뒤의 학생에게 빌려주지 않게 한다.
for(int i=0; i<lost.length; i++) {
for(int j=0; j<reserve.length; j++) {
if(lost[i]==reserve[j]+1 || lost[i]==reserve[j]-1) {
count++;
reserve[j] = -1;
break;
}
}
}
//answer은 전체 학생수에서 잃어버린 학생 수를 뺀다.
//후에 여벌옷을 가진 학생이 도난 당했으면 그 수만큼 더해주고 옷을 빌려준 학생 수 만큼 다시 더해준다.
answer = n - lost.length + exist + count;
return answer;
}
}