[인프런 워밍업클럽 2기] CS전공지식_Special Mission [한번 풀어보기]

[인프런 워밍업클럽 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;
}

댓글을 작성해보세요.

채널톡 아이콘