Programers : 체육복

김정욱·2021년 1월 20일
0

Algorithm - 문제

목록 보기
57/249

체육복

  • 해당 문제의 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);
}
profile
Developer & PhotoGrapher

0개의 댓글