일상 코딩
[C++/inflearn C++ 코딩테스트 강의] 석차 구하기(브루트포스) 본문
728x90
C++ 온라인 컴파일러 사이트
- https://replit.com/~
- https://www.onlinegdb.com/online_c++_compiler
- https://cpp.sh/
- https://www.tutorialspoint.com/compile_cpp_online.php
25. 석차 구하기
N명의 학생의 수학점수가 입력되면 각 학생의 석차를 입려된 순서대로 출력하는 프로그램을 작성하세요.
입력설명
첫 줄에 N(1<= N <= 100)이 입력되고, 두 번째 줄에 수학점수를 의미하는 N개의 정수가 입력된다.
같은 점수가 입력될 경우 높은 석차로 동일 처리한다.
즉, 가장 높은 점수가 92점인데, 92점이 3명 존재하면 1등이 3명이고, 그 다음 학생은 4등이 된다.
점수는 100점 만점이다.
입력예제
5
90 85 92 95 90
출력예제
3 5 2 1 3
#include<fstream>
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
ifstream cin;
//ofstream cout;
cin.open("input.txt");
int N(0); // 명수
int a(0); // 점수
vector< pair<int,int> > score; // 점수 리스트
vector< pair< pair<int,int>, int > > rank; // 등수 리스트
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> a;
score.push_back(make_pair(i+1, a));
}
auto desc = [](pair<int, int> a, pair<int, int> b) { return a.second > b.second; };
std::sort(score.begin(), score.end(), desc);
for (auto e : score)
cout << e.first << " " << e.second << endl;
cout << endl;
int pre_score = score.at(0).second;
int pre_rank = 1;
for (int i = 0; i < N; i++)
{
if (score.at(i).second == pre_score)
// python과 같이 튜플(입력된 순서, 점수, 점수로 정렬한 등수)로 사용하기 위해
// C++에서 구현하려하니 이렇게 복잡해졌을뿐, python에선 간단히 해결됨
rank.push_back(make_pair(make_pair(score.at(i).first, score.at(i).second), pre_rank));
else
rank.push_back(make_pair(make_pair(score.at(i).first, score.at(i).second), i+1));
pre_score = score.at(i).second;
pre_rank = i + 1;
}
for (auto e : rank)
cout << e.first.first << " " << e.first.second << " " << e.second << endl;
cout << endl;
std::sort(rank.begin(), rank.end());
for (auto e : rank)
cout << e.second << " ";
cout << endl;
return 0;
}
인강 답안
#include<fstream>
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
ifstream cin;
//ofstream cout;
cin.open("input.txt");
int N(0); // 명수
int a(0); // 점수
int i(0); // 1st index
int j(0); // 2nd index
cin >> N;
// array 동적 배열
int *score = new int[N+2]; // 점수 배열
int *rank = new int[N+2]; // 등수 배열
// rank 1로 초기화
for ( i = 1; i <= N; i++)
{
rank[i] = 1;
}
// score 입력
for (i = 1; i <= N; i++)
{
cin >> a;
score[i] = a;
}
// 2중 for문으로 rank update
for (i = 1; i <= N; i++)
{
for (j = 1; j <= N; j++)
{
if (score[i] < score[j])
{
rank[i]++;
}
}
}
for (i = 1; i <= N; i++)
{
cout << rank[i] << " ";
}
cout << endl;
delete[] score;
delete[] rank;
return 0;
}
728x90
'코딩테스트 > inflearn C++ 코딩테스트' 카테고리의 다른 글
[C++/CPP] C++ 코딩테스트용 gcd / lcm, 최대공약수, 최소공배수 (1) | 2023.12.30 |
---|---|
[C++/CPP] C++ 코딩테스트용 set() (0) | 2023.12.28 |
[C++/CPP] C++ 코딩테스트용 split() (0) | 2023.12.28 |
[C++/CPP] C++ 코딩테스트 용 순열 및 조합 next_permutation, next_combination (0) | 2023.12.28 |
[C++/inflearn 코딩테스트] N!의 표현법 (소인수 분해 응용) (0) | 2022.08.28 |