문제

설명

  • 체육복을 잃어버린 사람과 여벌을 갖고 있는 사람을 적절히 분배하여 최대한 많이 체육수업을 들을 수 있는 사람의 수를 구하는 문제
  • 단, 체육복은 본인 번호의 +-1만 빌릴 수 있다.

코드

#include <string>
#include <vector>
#include <set>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    set<int> s;  // 여벌옷을 갖고 있는 사람 리스트
    set<int> losts; // 체육복을 잃어버린 사람 중 여벌옷을 소지한 사람을 제외한 리스트
    // 여벌옷을 갖고 있는 사람 저장
    for (int i = 0; i < reserve.size(); i++) {
        s.insert(reserve[i]);
    }
    // 잃어버린 사람중 여벌옷을 갖고 있는 사람을 제거
    for (int i = 0; i < lost.size(); i++) {
        if (s.find(lost[i]) != s.end()) {
            s.erase(lost[i]);
        } else {
            losts.insert(lost[i]);
        }
    }
    
    answer += n;
    answer -= losts.size();
    // 잃어버린 옷을 양옆의 사람에게 빌린다.
    for (auto ls : losts) {
        // 왼쪽 번호에게 빌린다.
        auto it = s.find(ls-1);
        if (it != s.end()) {
            s.erase(*it);
            answer++;
        } else {
            it = s.find(ls+1);
            if (it != s.end()) {
                s.erase(*it);
                answer++;
            }
        }
    }
    
    if (answer > n) {
        answer = n;
    }
    return answer;
}

댓글을 남기시려면 Github 로그인을 해주세요