[인프런 워밍업클럽 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;
}
댓글을 작성해보세요.