Table of Contents

Programmers 체육복 C++

Table of Contents

코딩테스트 연습 - 체육복

접근 방법

탐욕 알고리즘을 사용하여 해결해야합니다.

여분의 체육복을 가지고 온 경우를 O, 체육복이 없는 경우를 X인 경우를 배열로 나타내면 {O, X, O, X} 입니다. 이 때 3번째 학생이 2번째 학생에게 체육복을 빌려주게 되면 4번째 학생은 1번째 학생에게 체육복을 빌려줄 수 없게 됩니다. 따라서 앞에 있는 학생을 우선으로 빌려주어야만 그리디하게 문제를 해결할 수 있습니다.

여분의 체육복이 있는 학생도 체육복을 도난당할 수 있다는 점에 유의합니다.

코드

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <bits/stdc++.h>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    
    set<int> set_lost(lost.begin(), lost.end());
    set<int> set_reserve(reserve.begin(), reserve.end());
    
    vector<int> common;
    for (auto i : lost) {
        if (set_reserve.find(i) != set_reserve.end()) {
            common.push_back(i);
        }
    }
    
    for (auto i : common) {
        set_lost.erase(i);
        set_reserve.erase(i);
    }
    
    n -= set_lost.size();
    
    for (auto i : set_reserve) {
        if (set_lost.find(i-1) != set_lost.end()) {
            set_lost.erase(i-1);
            set_lost.erase(i);
            n++;
            continue;
        } 
        
        if (set_lost.find(i+1) != set_lost.end()) {
            set_lost.erase(i+1);
            set_lost.erase(i);
            n++;
            continue;
        } 
        
    }
    
    return n;
}