본문 바로가기
컴퓨터/알고리즘

[SWEA] 1983 조교의 성적 매기기

by IT황구 2021. 1. 27.
728x90
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PwGK6AcIDFAUq&categoryId=AV5PwGK6AcIDFAUq&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int main(void)
{
	int size;
	int num, k;
	int s1,s2,s3;
	int div;
	int res;
	double temp;
	vector< pair<double, int> > v;
	scanf("%d",&size);
	for(int i = 0; i < size; i++)
	{
		scanf("%d %d",&num,&k);
		for(int j = 0; j < num; j++)
		{
			scanf("%d %d %d",&s1,&s2,&s3);
			temp = s1 * 0.35 + s2 * 0.45 + s3 * 0.2;
			v.push_back( make_pair(temp , j+1));
		}
		sort(v.rbegin(),v.rend());
		//오름차순이면 r.begin, 내림차순이면 v.rbegin 
		div = num / 10;
		for(int x = 0; x < num; x++)
		{
			if(v[x].second == k)
			{
				res = x;
				break;	
			}
		}
		
		switch(res / div)
		{
			case 0:
				printf("#%d A+\n",i+1);
				break;
			case 1:
				printf("#%d A0\n",i+1);
				break;
			case 2:
				printf("#%d A-\n",i+1);
				break;
			case 3:
				printf("#%d B+\n",i+1);
				break;
			case 4:
				printf("#%d B0\n",i+1);
				break;
			case 5:
				printf("#%d B-\n",i+1);
				break;
			case 6:
				printf("#%d C+\n",i+1);
				break;	
			case 7:
				printf("#%d C0\n",i+1);
				break;	
			case 8:
				printf("#%d C-\n",i+1);
				break;	
			default:
				printf("#%d D0\n",i+1);
				break;
				
		}
		
		v.clear();
	}
}

내 풀이 :

벡터에 (점수 , 순서) 넣고 sort 를 한다 (내림차순으로) rbegin,rend

그 다음 순위에 맞는사람을 찾아서 rank를 출력한다. (나머지 이용)

답답했던점 :

1. 처음에 char[10][3] = {"A+", ~} 이렇게 했는데 안하다 보니까 2차원 배열 선언시에 { {"A+}, 이런식만 되는걸로 생각해서 안해버림.

2. 2차원 배열 sort를 찾았는데 앞으로는 그냥 vector 같은 stl 이용해야겠음.

3. C 기초 할때 rank 구하기 처럼 그 방법을 쓰려고 했는데 O(n^2) 이라 말이 안된다고 생각했음. 근데 이 문제를 풀때는 편법이 있었음

문제점 :

배열을 1차원으로 두고 해결할때, sort가 되면 점수를 알고싶은 k번째 학생이 어디였는지 사라지게 된다.

이걸 미리 score = k번째 학생 점수 로 빼놓으면

sort 후에 if( score = arr[k]) 로 N번 안에 찾을 수 있었다.

comparator 의 매개변수에서 type을 안맞춰서 처음에 틀렸다.. 주의해야겠다.

 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool comparator(double i,double j){
	return i>j;
}
int main(void)
{
	int size;
	int num, k;
	int s1,s2,s3;
	int div;
	char grade[10][3] = {"A+","A0","A-","B+","B0","B-","C+","C0","C-","D0"};
	double res[105];
	double score;
	scanf("%d",&size);
	for(int i = 0; i < size; i++)
	{
		scanf("%d %d",&num,&k);
		for(int j = 0; j < num; j++)
		{
			scanf("%d %d %d",&s1,&s2,&s3);
			res[j] = s1 * 0.35 + s2 * 0.45 + s3 * 0.2;
		}
		score = res[k-1];
		sort(res,res+num,comparator);
		for(int x = 0; x < num; x++)
		{
			if(score == res[x]){		
				
				printf("#%d %s\n",i+1,grade[x/(num/10)]);
				break;
			}
		}	
	}
}

메모리와 코드 길이가 비약적으로 감소한다.

====END

 

728x90
반응형