본문 바로가기
C | C++/Softeer 문제풀이

Softeer [HSAT 5회 정기 코딩 인증평가 기출] 성적 평가 C/C++ 문제풀이 (level 3)

by zyeon 2023. 8. 9.

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

 

Softeer

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

softeer.ai

 

 

 

<cpp 문제풀이>

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

struct Rank {
	int score;
	int num;
};

int compare(Rank a, Rank b) {
	return a.score > b.score;
} //구조체 sort 사용하여 정렬하기위해 필요

int main(int argc, char** argv)
{

	int n;
	int count = 0;
	cin >> n;

	vector<Rank>v(n);
	vector<int>v2(n);
	vector<Rank>total(n);

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < n; j++) {
			cin >> v[j].score;
			v[j].num = j;
			total[j].score += v[j].score;
			total[j].num = j;
		}

		sort(v.begin(), v.end(), compare);

		for (int i = 0; i < n; i++) {
			count++; //같은 점수가 있을경우를 위한 변수
			if (i != 0 && v[i - 1].score == v[i].score) {
				
				v2[v[i].num] = v2[v[i - 1].num];

			}
			else {
				v2[v[i].num] = count;
				
			}
		}

		for (int i = 0; i < n; i++) {
			cout << v2[i] << " ";
		}

		fill(v2.begin(), v2.end(), 1);
		count = 0;

		cout << endl;
	}


	sort(total.begin(), total.end(), compare);

	for (int i = 0; i < n; i++) {
		count++;
		if (i != 0 && total[i - 1].score == total[i].score) {

			v2[total[i].num] = v2[total[i - 1].num];

		}
		else {
			v2[total[i].num] = count;

		}
	}

	for (int i = 0; i < n; i++) {
		cout << v2[i] << " ";
	}

	return 0;
}

처음에는 편하게 for문을 사용하여 O(n*2) 시간복잡도를 가지게 되어서 시간초과가 떴어요.

시간초과를 해결하기 위해 구조체를 사용하여 해결했습니다. (정렬 함수를 사용하였는데, 이때 순서가 바뀌므로 점수와 자신이 몇번째 입력값인지를 저장하는 구조체를 사용했습니다)

 


다른 의견이나 질문 언제나 환영입니다!!

댓글