상세 컨텐츠

본문 제목

[Softeer] 성적 평가 (C++)

PROGRAMMING/Algorithm

by koharin 2023. 9. 5. 22:31

본문

728x90
반응형

입출력

  • 입력: N(참가자 수), 세 개의 줄에 각 대회의 결과
  • 출력: 각 참가자의 대회별 등수,  각 참가자의 최종 등수

문제풀이 과정

  1. 한 대회마다 등수 매기기
    • 이때 max를 구하고 max인 모든 사람은 현재 등수를 주고 현재 등수인 모든 사람 카운팅
    • 현재 등수인 모든 사람 카운팅 후 다음 등수 = 현재등수 + (현재 등수인 사람 수)
    • 현재 max는 -1을 넣어서 다음 max로 고려되지 않게 하기
    • 현재 대회의 모든 값이 -1이면 다음 대회로 넘어가도록 check 변수로 확인
  2. 참가자의 3개 대회에서 등수 구하기
    • 3개 대회에서 등수는 (대회1 점수 + 대회2 점수 + 대회3 점수) 큰 순서로 출력
    • 먼저 각 참가자의 각 대회에서의 모든 점수 구한 후
    • 총점에서 max를 구하고 max가 동일한 사람을 동일한 등수 부여, max 동일한 사람 카운팅.
    • 다음 등수 = 현재등수 + (현재 등수인 사람 수)
    • 현재 max는 -1로 해서 다음 max로 고려되지 않게 하기
    • 모든 점수가 -1, 즉 모든 사람의 점수를 고려하고 등수 부여했으면 끝

 

정답 코드

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

using namespace std;

int main(int argc, char** argv)
{
	int N;
	cin >> N;
	vector<int> grade[3];
	vector<int> result[3];
	bool check;
	vector<int> cur;
	vector<int> total(N,0);
	vector<int> final(N,0);
	int num;

	for(int i=0; i<3; i++){
		for(int j=0; j<N; j++){
			int g;
			cin >> g;
			grade[i].push_back(g);
			result[i].push_back(0);
		}
	}

	for(int i=0; i<3; i++){
		num=1;
		check=false;
		cur = grade[i];
		//copy(grade[i].begin(), grade[i].end(), back_inserter(cur));

		while(check!=true){
			int max = *max_element(cur.begin(), cur.end());; // value of max
			int count=0; // 동점 카운팅

			for(int j=0; j<N; j++){
				if(cur[j] == max) { 
					result[i][j] = num; 
					cur[j] = -1;
					count++;
				}		
			}
			//cout << endl;
			num=num+count; // 다음 등수 = “나보다 점수가 큰 사람”의 수 + 1
            
			check = all_of(cur.begin(), cur.end(), [](int k) { return k == -1; }); // 현재 대회에서 참가자의 점수 모두 체크했는지 확인
		}
	}

	// 대회별 참가자 성적에 대한 등수 출력
	for(int i=0; i<3; i++){
		for(int j=0; j<N; j++) cout << result[i][j] << " ";
		cout << endl;
	}
	
	// 각 참가자의 점수합 구하기
	for(int i=0; i<N; i++){
		for(int j=0; j<3; j++){
			total[i] += grade[j][i];
		}
	}

	// 각 참가자의 등수 구하기
	num=1; 
	check=false;

	while(check!=true) {
		int count=0;
		int max = *max_element(total.begin(), total.end());
		for(int i=0; i<N; i++){
			if(total[i] == max) { 
				final[i] = num; 
				count++; 
				total[i] = -1;
			}
		}
		num=num+count; // 다음 등수 = “나보다 점수가 큰 사람”의 수 + 1
		check = all_of(total.begin(), total.end(), [](int i){ return i == -1; });
	}
	// 최종 등수 출력
	for(int n : final) cout << n << " ";
	
	return 0;
}

 

제출 결과

728x90
반응형

관련글 더보기