728x90
반응형
#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
반응형
'컴퓨터 > 알고리즘' 카테고리의 다른 글
[SWEA] 1974 스도쿠검증 (비트마스크) (0) | 2021.01.29 |
---|---|
[SWEA] 1979 어디에 단어가 들어갈 수 있을까 (0) | 2021.01.28 |
[SWEA] 2001 파리 퇴치 (0) | 2021.01.26 |
[SWEA] 2005 파스칼의 삼각형 (0) | 2021.01.25 |
[SWEA] 2056 연월일달력(야비한수법) (0) | 2021.01.22 |