- 해당 문제의 keypoint
1) 체육복 여분이 있는 학생이 도난당한 경우 처리iterator / find / vector.erase
를 자유롭게 사용하여 문제를 해결함vector.erase()
의 반환값은 삭제된 후 다음 요소를 가리키는 iterator이다
--> 만약 삭제 후 요소의 변화가 영향을 준다면 반환값을 다시 받은 뒤감소(--)
처리를 해준다/* 여분의 체육복이 있는데, 도난당한 학생을 제외하하여 순수 lost / reserve만 남기는 코드 */ for(auto a = lost.begin(); a!= lost.end();a++){ auto it = find(reserve.begin(), reserve.end(), *a); if(it != reserve.end()){ reserve.erase(it); /* erase한 후 반환값은 다음 요소를 가리키는 iterator */ a = lost.erase(a); a--; } }
#include <string> #include <vector> #include <numeric> #include <algorithm> using namespace std; int solution(int n, vector<int> lost, vector<int> reserve) { int answer = 0; /* 여분의 체육복이 있는데, 도난당한 학생을 제외하하여 순수 lost / reserve만 남기는 코드 */ for(auto a = lost.begin(); a!= lost.end();a++){ auto it = find(reserve.begin(), reserve.end(), *a); if(it != reserve.end()){ reserve.erase(it); /* erase한 후 반환값은 다음 요소를 가리키는 iterator */ a = lost.erase(a); a--; } } vector<int> board(n,1); /* board의 default 값은 1이며, 도난 당한 학생은 0으로 처리 */ for(auto a : lost) { board[a-1] = 0; } /* 여분이 있는 학생들을 기준으로 앞/뒤 인덱스를검사하여 충족되면 빌려줌 */ for(int i=0;i<reserve.size();i++) { int prev_idx = reserve[i]-2; int next_idx = reserve[i]; if(prev_idx >= 0 && board[prev_idx] == 0){ board[prev_idx] = 1; }else if (next_idx < n && board[next_idx] == 0){ board[next_idx] = 1; } } /* board의 1의 개수는 체육 수업을 들을 수 있는 학생을 의미! */ return answer = accumulate(board.begin(), board.end(), 0); }