From b9d7d97861450f8f8e81f77e98ff6d8431f4216b Mon Sep 17 00:00:00 2001 From: "YeJun, Jung" Date: Sun, 25 Jan 2026 19:17:18 +0900 Subject: [PATCH] add p42862 solutions --- problems/programmers/others/p42862/main.cpp | 35 ++++++++ problems/programmers/others/p42862/main2.cpp | 89 ++++++++++++++++++++ problems/programmers/others/p42862/main3.cpp | 64 ++++++++++++++ 3 files changed, 188 insertions(+) create mode 100644 problems/programmers/others/p42862/main.cpp create mode 100644 problems/programmers/others/p42862/main2.cpp create mode 100644 problems/programmers/others/p42862/main3.cpp diff --git a/problems/programmers/others/p42862/main.cpp b/problems/programmers/others/p42862/main.cpp new file mode 100644 index 0000000..964590d --- /dev/null +++ b/problems/programmers/others/p42862/main.cpp @@ -0,0 +1,35 @@ +/* + * (42862) 체육복 + * https://school.programmers.co.kr/learn/courses/30/lessons/42862 + */ + +#include + +#include +using namespace std; + +int solution(int n, vector lost, vector reserve) { + int answer = n; + + vector students(n + 2, 1); + for (int i : reserve) students[i] = 2; + for (int i : lost) --students[i]; + + for (int s = 1; s <= n; ++s) { + if (students[s] > 0) continue; + if (students[s - 1] > 1) --students[s - 1]; + else if (students[s + 1] > 1) --students[s + 1]; + else --answer; + } + return answer; +} + +int main() { + cout << "#1 " << solution(5, {2, 4}, {1, 3, 5}) << endl; // 5 + cout << "#2 " << solution(5, {2, 4}, {3}) << endl; // 4 + cout << "#3 " << solution(3, {3}, {1}) << endl; // 2 + cout << "#4 " << solution(5, {4, 2}, {3, 5}) << endl; // 5 + + return 0; +} + diff --git a/problems/programmers/others/p42862/main2.cpp b/problems/programmers/others/p42862/main2.cpp new file mode 100644 index 0000000..54dd8aa --- /dev/null +++ b/problems/programmers/others/p42862/main2.cpp @@ -0,0 +1,89 @@ +/* + * (42862) 체육복 + * https://school.programmers.co.kr/learn/courses/30/lessons/42862 + */ + +#include + +#include +#include +using namespace std; + +// A, B의 교집합 +vector intersection(vector A, vector B) { + vector result; + + for (int a : A) for (int b : B) + if (a == b) result.push_back(a); + + return result; +} + +// target에서 remove_items 요소 삭제 +vector remove_all(vector remove_items, vector target) { + vector result; + + for (int item : target) { + result.push_back(item); + + for (int check : remove_items) { + if (item == check) { + result.pop_back(); + break; + } + } + } + + return result; +} + +int solution(int n, vector lost, vector reserve) { + // lost, reserve 교집합 산출 후 제거 + vector common = intersection(lost, reserve); + lost = remove_all(common, lost); + reserve = remove_all(common, reserve); + + // 오름차순 정렬 + sort(lost.begin(), lost.end()); + sort(reserve.begin(), reserve.end()); + + // 일단 (전체 학생 수) - (도둑 맞은 학생) 으로 answer 초기화 + // 여기서 도둑 맞은 학생이라도 여분이 있다면 수업에 참가할 수 있음에 주의 + int answer = n - lost.size(); + + vector check_arr(2); + for (int student : lost) { + // 도둑 맞은 학생은 앞, 뒤의 학생에게 운동복을 빌릴 수 있다 + check_arr[0] = student - 1; + check_arr[1] = student + 1; + + for (int check : check_arr) { + // reserve 에서 check 값 찾기 + auto iter = reserve.begin(); + for (; iter != reserve.end(); ++iter) { + if (check == *iter) { + break; + } + } + + // reserve에 check 값이 존재한다면 + if (iter != reserve.end()) { + reserve.erase(iter); + ++answer; // answer 수정 + break; + } + } + } + + return answer; +} + +int main() { + cout << "#1 " << solution(5, {2, 4}, {1, 3, 5}) << endl; // 5 + cout << "#2 " << solution(5, {2, 4}, {3}) << endl; // 4 + cout << "#3 " << solution(3, {3}, {1}) << endl; // 2 + cout << "#4 " << solution(5, {4, 2}, {3, 5}) << endl; // 5 + + return 0; +} + diff --git a/problems/programmers/others/p42862/main3.cpp b/problems/programmers/others/p42862/main3.cpp new file mode 100644 index 0000000..f583112 --- /dev/null +++ b/problems/programmers/others/p42862/main3.cpp @@ -0,0 +1,64 @@ +/* + * (42862) 체육복 + * https://school.programmers.co.kr/learn/courses/30/lessons/42862 + */ + +#include + +#include +#include +#include +#include + +using namespace std; + +int solution(int n, vector lost, vector reserve) { + // lost, reserve를 set 컨테이너로 복사(정렬 및 삭제연산 유리함) + set lost_set(lost.begin(), lost.end()); + set reserve_set(reserve.begin(), reserve.end()); + + // lost, reserve 교집합 찾기 + vector common; + + // set_intersection 함수는 호출전에 대상 배열들이 정렬되어 있어야 한다 + set_intersection( + lost_set.begin(), lost_set.end(), reserve_set.begin(), reserve_set.end(), + back_inserter(common)); + + // 교집합 삭제 + for (int it : common) { + lost_set.erase(it); + reserve_set.erase(it); + } + + // 일단 (전체 학생 수) - (도둑 맞은 학생) 으로 answer 초기화 + // 여기서 도둑 맞은 학생이라도 여분이 있다면 수업에 참가할 수 있음에 주의 + int answer = n - lost_set.size(); + + vector check_arr(2); + for (int student : lost_set) { + // 도둑 맞은 학생은 앞, 뒤의 학생에게 운동복을 빌릴 수 있다 + check_arr[0] = student - 1; + check_arr[1] = student + 1; + + for (int check : check_arr) { + if (auto iter = reserve_set.find(check); iter != reserve_set.end()) { + reserve_set.erase(iter); + ++answer; // answer 수정 + break; + } + } + } + + return answer; +} + +int main() { + cout << "#1 " << solution(5, {2, 4}, {1, 3, 5}) << endl; // 5 + cout << "#2 " << solution(5, {2, 4}, {3}) << endl; // 4 + cout << "#3 " << solution(3, {3}, {1}) << endl; // 2 + cout << "#4 " << solution(5, {4, 2}, {3, 5}) << endl; // 5 + + return 0; +} +