[프로그래머스/C++] 체육복

최대 1 분 소요

1.문제 링크

체육복



2. 풀이 전 계획과 생각

  • 정렬



3. 풀이

#include <string>
#include <vector>
#include<algorithm>
using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    answer += (n-lost.size());

    // 오름차순 정렬 
    sort(lost.begin(), lost.end());
    sort(reserve.begin(), reserve.end());

    // 여벌 체육복을 가져온 학생이 체육복을 도난당했을 경우 고려 
    for(int i=0;i<lost.size();i++){
        for(int j=0;j<reserve.size();j++){
            if(lost[i]==reserve[j]){
                answer++;
                reserve.erase(reserve.begin()+j);
                lost[i]=-1;
                break;
            }
        }
    }

    // 여벌 옷을 가진 학생이 도난당한 학생에게 체육복 빌려주기 
    for(int i=0;i<lost.size();i++){
        if(lost[i]!=-1){
            for(int j=0;j<reserve.size();j++){
                if(abs(lost[i]-reserve[j])==1){
                    answer++;
                    reserve.erase(reserve.begin()+j);
                    break;
                }
            }
        }

    }

    return answer;
}

lost, reserve 벡터를 오름차순으로 정렬한다.

여벌 체육복을 가져온 학생이 체육복을 도난당했을 경우 다른사람에게 여벌옷을 빌려줄 수 없기때문에 for문을 통해 2중반복문을 순회하면서 lost==reserve인 학생을 찾아내 lost배열에 -1 표시를 한다.

이중 for문을 돌면서 번호 차이가 1이하인 학생에게 체육복을 빌려준다. 이때 lost 배열에서 -1이 아닌 번호만 고려해 빌려준다.