본문 바로가기
Softeer 연습 문제

[Softeer C++] 인증평가(5차) 기출 성적 평가

by code_killer 2023. 2. 5.
728x90
반응형

1. 문제

https://softeer.ai/practice/info.do?idx=1&eid=1309&sw_prbl_sbms_sn=143186 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

2. 알고리즘 분류

  • 정렬

 

3. 소스 코드

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

vector<pair<int, int>> scores[4];
vector<pair<int, int>> total_scores;
vector<int> result;

int main(int argc, char** argv)
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	// input
	int N;
	cin >> N;

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < N; j++) {
			int score;
			cin >> score;

			scores[i].push_back({ score, j });	// score와 인덱스 값을 저장
		}
	}

	// 최종 점수 합산
	for (int i = 0; i < N; i++) {
		scores[3].push_back({ 0, i });
	}

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < N; j++) {
			int score = scores[i][j].first;
			int index = scores[i][j].second;
			scores[3][index].first += score;
		}
	}

	// 순위를 저장할 vector 선언
	for (int i = 0; i < N; i++)
		result.push_back(0);


	// 1. 점수를 오름차순으로 정렬
	// 2. 오름차순 정렬된 vector를 확인하면서 등수 선정
	for (int i = 0; i < 4; i++) {

		sort(scores[i].begin(), scores[i].end(), greater<>());	// 점수 오름차순으로 정렬

		// 공동 순위 파악을 위해 이전 점수와 등수 체크
		int prev_score = scores[i][0].first;
		int prev_rank = 1;

		// 오름차순 정렬된 vector 확인하면서 등수 체크
		for (int j = 0; j < N; j++) {
			int score = scores[i][j].first;
			int idx = scores[i][j].second;
			int rank = j + 1;

			// 점수가 같다면, 공동 순위
			if (score == prev_score) {
				rank = prev_rank;
				result[idx] = rank;
			}
			else {
				result[idx] = rank;
				prev_rank = rank;
			}

			prev_score = score;
		}

		for (int j = 0; j < N; j++) {
			cout << result[j] << " ";
		}

		cout << "\n";
	}

	return 0;
}

 

4.  유용한 문법 및 알고리즘

4-1) sort를 통한 오름차순 정렬

include <vector>

sort(scores[i].begin(), scores[i].end(), greater<>());	// 점수 오름차순으로 정렬
 
728x90