프로그래머스/Lv.1
[C++] 프로그래머스 체육복
MINU.SHINNNN
2023. 10. 31. 18:50
https://school.programmers.co.kr/learn/courses/30/lessons/42862
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
탐욕법을 사용해 해결하는 문제입니다. 여분 체육복을 가진 학생 또한 도난당할 수 있음에 유의합니다.
체육복을 잃어버린 경우 더 앞쪽 번호의 학생에게 빌려야 최대한 많은 학생이 수업을 들을 수 있습니다.
lost = [2, 4]
reserve = [1, 3]
일 경우, 뒷쪽 학생에게 먼저 빌릴경우 4번 학생은 수업을 듣지 못하므로 최적해가 아닙니다.
따라서, 현재 잃어버린 학생 curr_lost의 바로 앞 학생이 reserve에 존재한다면 answer++를 해줍니다. 이때, 이미 빌려준 학생 처리는 -100으로 하여 1 또는 -1이 되는 것을 방지합니다.
앞쪽 학생이 없다면 뒷쪽 학생이 있는지 확인하고 빌리면 됩니다.
여분 체육복을 가진 학생 또한 도난당할 수 있으므로, answer++ 및 lost에서 -1처리하여 삭제하고 reserve에서 -100 처리 해줍니다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = n - lost.size();
if (lost.size() == 0)
return answer;
sort(reserve.begin(), reserve.end());
sort(lost.begin(), lost.end());
/*
가져왔지만 도난당한 학생 처리
lost 에서 삭제 = -1
reserve 에서 삭제 = -100
*/
for (int i = 0; i<lost.size(); i++) {
for (int j=0; j<reserve.size(); j++) {
if (lost[i] == reserve[j]) {
answer++;
lost[i] = -1;
reserve[j] = -100;
break;
}
}
}
/*
이미 처리한 애가 아니라면 작은 애한테 먼저 빌리기
작은 애가 없다면 큰 애한테 빌리기
*/
for (int i = 0; i < lost.size(); i++) {
int curr_lost = lost[i];
for (int j = 0; j < reserve.size(); j++) {
int curr_reserve = reserve[j];
if (curr_lost != -1 && curr_lost - curr_reserve == 1) {
answer++;
reserve[j] = -100;
break;
}
if (curr_lost != -1 && curr_lost - curr_reserve == -1) {
answer++;
reserve[j] = -100;
break;
}
}
}
return answer;
}