특별 미션) 실수로 워밍업 클럽 출석을 빼먹었는데 우연히 데이터를 수정할 수 있는 권한이 주어졌습니다. 러너분의 이름(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 <vector>
#include <string>
using namespace std;
// 사용자 정보를 나타내는 구조체
struct User {
string name;
int count;
};
// 퀵소트 함수 선언
void quickSort(vector<User>& arr, int left, int right);
int partition(vector<User>& arr, int left, int right);
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;
}
// 퀵소트 함수 정의
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; // 피벗의 최종 위치 반환
}