[인프런 워밍업클럽 2기] CS전공지식_Special Mission [한번 풀어보기]
결석한 적은 없는 그냥 풀이가 보이길래 한번 풀어보자 생각했다. 하지만 잘 못 건드렸다.. 난 아직도 실력이 더 필요하구나.. 어렵다. 이거 푼다고 map 알아보다가. map은 기본적으로 오름차순 정렬되어버려서. 의미가 없었다...퀵정렬로 풀라고 했으니까. .일단.. 알아보다 도저히 안되서.. 어떻게 해야하지 하다가. 그냥 알아보았다..;; 졸기를 반복하다가... 쩝... 특별미션특별 미션) 실수로 워밍업 클럽 출석을 빼먹었는데 우연히 데이터를 수정할 수 있는 권한이 주어졌습니다. 러너분의 이름(name)과 출석수(count)가 저장된 배열에서 여러분(나)의 데이터를 퀵정렬을 이용해 오름차순 정렬하고 가장 첫 번째 데이터인 여러분의 출석수를 변경하도록 코드를 작성해주세요. (퀵정렬 구현 부분도 변경)문제// 퀵소트 구현 부분...(생략) let user1 = { name: "홍길동", count: 5 }; let user2 = { name: "임꺽정", count: 4 } let user3 = { name: "이순신", count: 3 } let user4 = { name: "나", count: 1 } let user5 = { name: "짱구", count: 5 } let arr = [user1, user2, user3, user4, user5] console.log("===== 정렬 전 ====="); console.log(arr); quickSort(arr, 0, arr.length - 1); console.log("===== 정렬 후 ====="); console.log(arr);[예상 결과] ===== 정렬 전 ===== [ { name: '홍길동', count: 5 }, { name: '임꺽정', count: 4 }, { name: '이순신', count: 3 }, { name: '나', count: 1 }, { name: '짱구', count: 5 } ] ===== 정렬 후 ===== [ { name: '나', count: 5 }, { name: '이순신', count: 3 }, { name: '임꺽정', count: 4 }, { name: '홍길동', count: 5 }, { name: '짱구', count: 5 } ] 처음 풀었던 미친방식... #include <iostream> #include <algorithm> #include <map> #include <vector> using namespace std; /*map은 기본적으로 키를 기준으로 오름차순한다. */ struct Student { char name[20]; int count; map<string, int> m = { {"홍길동", 5}, {"임꺽정", 4}, {"이순신", 3}, {"나", 1}, {"짱구", 5}}; map<string, int>::iterator miter; }; // 오름차순 정렬을 위한 static bool cmp(const pair<string, int>& a, const pair<string, int>& b) { if (a.second == b.second) return a.first > b.first; return a.second < b.second; } int main() { struct Student s; // vector<pair<string,int>> v(s.m.begin(), s.m.end()); // 구조체 안에 있는 map으로 호출 for (s.miter = s.m.begin(); s.miter != s.m.end(); ++s.miter) { cout << s.miter->first << ' ' << s.miter->second << endl; } cout << endl; // sort(v.begin(), v.end(), cmp); s.m["나"] = 5; // vector 선언된 map 형식을 가져온다. for (s.miter = s.m.begin(); s.miter != s.m.end(); ++s.miter) { cout << s.miter->first << ' ' << s.miter->second << endl; } return 0; } #include <iostream> #include <vector> #include <string> using namespace std; // 사용자 정보를 나타내는 구조체 struct User { string name; int count; }; // 퀵소트 함수 정의 void quickSort(vector<User>& arr, int left, int right) { if (left < right) { int pivotIndex = partition(arr, left, right); quickSort(arr, left, pivotIndex - 1); quickSort(arr, pivotIndex + 1, right); } } // 분할 함수 정의 int partition(vector<User>& arr, int left, int right) { int pivot = arr[right].count; // 피벗을 오른쪽 끝 요소의 count로 설정 int i = left - 1; // i는 피벗보다 작은 요소의 마지막 인덱스 for (int j = left; j < right; j++) { // 현재 요소가 피벗보다 작거나 같은 경우 if (arr[j].count < pivot || (arr[j].count == pivot && arr[j].name < arr[right].name)) { i++; swap(arr[i], arr[j]); // i와 j 요소를 교환 } } swap(arr[i + 1], arr[right]); // 피벗을 올바른 위치로 이동 return i + 1; // 피벗의 최종 위치 반환 } int main() { // 사용자 객체 초기화 User user1 = { "홍길동", 5 }; User user2 = { "임꺽정", 4 }; User user3 = { "이순신", 3 }; User user4 = { "나", 1 }; User user5 = { "짱구", 5 }; // 사용자 객체를 담을 벡터 vector<User> arr = { user1, user2, user3, user4, user5 }; cout << "===== 정렬 전 =====" << endl; for (auto& user : arr) { cout << "이름: " << user.name << ", count: " << user.count << endl; } // 퀵소트 호출 quickSort(arr, 0, arr.size() - 1); cout << "===== 정렬 후 =====" << endl; for (auto& user : arr) { if (user.name == "나") { user.count = 5; } cout << "이름: " << user.name << ", count: " << user.count << endl; } return 0; }