n
(전체 학생의 수) ≤ 30lost
(체육복 도난 당한 학생의 수) ≤ n (중복 X)reserve
(여벌 체육복이 있는 학생의 수) ≤ n (중복 X)n - lost.size()
으로 한다.map 생성
앞번호 학생
을 먼저 빌려주자. (뒷번호 학생은 다음 학생의 앞번호로 빌려줄 수 있기 때문)#include <string> #include <vector> #include <map> #include <algorithm> #include <iostream> using namespace std; int solution(int n, vector<int> lost, vector<int> reserve) { map <int, int> map; // 도난 당한 학생 리스트 sort(lost.begin(), lost.end()); // 정렬 sort(reserve.begin(), reserve.end()); // 정렬 for(int i=0; i<lost.size(); i++) { if(find(reserve.begin(), reserve.end(), lost[i]) == reserve.end()) { map.insert(make_pair(lost[i], 1)); } else { reserve.erase(find(reserve.begin(), reserve.end(), lost[i])); } } int answer = n - map.size(); // 전체 학생 수 - 도난 당한 학생 수 for(int i=0; i<reserve.size(); i++) { // 여벌 있는 학생 수 만큼 if(reserve[i] - 1 > 0 && map[reserve[i] - 1]) { map.erase(reserve[i] - 1); answer++; } else if(reserve[i] + 1 <= n && map[reserve[i] + 1]) { map.erase(reserve[i] + 1); answer++; } } return answer; }
처음에 도난 당한 학생 중 여벌 체육복이 있는 학생을 빼주지 않았다.
→ 반례를 찾기 힘들었는데 반례로는 n = 3, lost = [2, 3], reserve = [1, 2]가 있었다.
→ 이 경우 1번 학생이 2번 학생에게 체육복을 빌려주게 되는데, 2번 학생은 빌릴 필요가 없다.
∴ 도난 당했으면서 여벌 체육복이 있는 학생은 제거해주는 작업이 필요하다 !
조건을 잘 생각해보며 제거할 필요가 있는지 확인해보는 습관 가지기 ✨