본문 바로가기

Problem Solving/프로그래머스

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


#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();
   int i = 0;
   int j = 0;
   sort(lost.begin(), lost.end());
   sort(reserve.begin(), reserve.end());
   for (int k = 0; k < reserve.size(); ++k) {
      if (find(lost.begin(), lost.end(), reserve[k]) != lost.end()) {
         lost.erase(find(lost.begin(), lost.end(), reserve[k]));
         reserve.erase(reserve.begin() + k);
          ++answer;
          k=-1;
      }
   }

   while (i < lost.size() && !reserve.empty()) {
      if (j >= reserve.size()) {
         ++i; j = 0;
      }
      else if (lost[i] == reserve[j] - 1 || lost[i] == reserve[j] + 1) {
         ++answer;
         lost.erase(lost.begin() + i);
         reserve.erase(reserve.begin() + j);
          i = 0; j = 0;
      }
      else {
         ++j;
      }

   }
   return answer;
}

탐욕법(greedy) 알고리즘을 사용하는 문제입니다. 낮은 순이던 큰 순이던 남은 체육복을 줄 수 있는 친구들에게 순서대로 제공하는 것이 최대로 제공하는 것이라는 점만 생각하면 쉽게 풀 수 있는 문제입니다.


문제: https://programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr