코딩 공부 - 프로그래머스 - 체육복
문제
설명
- 체육복을 잃어버린 사람과 여벌을 갖고 있는 사람을 적절히 분배하여 최대한 많이 체육수업을 들을 수 있는 사람의 수를 구하는 문제
- 단, 체육복은 본인 번호의 +-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;
}
공유하기
Twitter Facebook LinkedIn댓글을 남기시려면 Github 로그인을 해주세요