출처
https://www.acmicpc.net/problem/25206
접근 방식
- 등급에 학점이 대응되고 있으므로, Map STL을 사용하여 등급과 학점을 연관시키려고 했다.
- 입력값의 경우, 과목명, 성적, 학점이 연관되어 있으므로 vector STL을 사용하는데 tuple을 사용하여 pair 처럼 묶어 주었다.
- GPA를 구하는 방식은 성적 * 학점 / 전체 학점으로 구하였다.
소스 코드
#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;
namespace SCORE{
const map<string,double> points{
{"A+",4.5},{"A0",4.0},{"B+",3.5},{"B0",3.0},{"C+",2.5},
{"C0",2.0},{"D+",1.5},{"D0",1.0},{"F",0.0}
};
};
double grade_to_point(const string& grade){
auto it=SCORE::points.find(grade); //Score 이름 공간에서 points에 있는 grade를 가져옴
if(it!=SCORE::points.end()){
return it->second;
} // 성적을 찾으면 등급에 대응하는 학점을 반환함
return 0.0;
}
int main(void){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<tuple<string,double,string>> A;
int credit=0; // 성적 총합
double total=0.0; // 총 수강 학점 수
for(int i=0;i<20;i++){
string subject,grade;
double score;
cin>>subject>>score>>grade;
A.emplace_back(subject,score,grade);
if(grade!="P"){
total+=grade_to_point(grade)*score;
credit+=score;
} // P이면은 학점을 더하지 않고, P가 아니면 학점을 더함
}
cout.precision(6); // 소수점 이하 6자리 까지 표시
cout<<fixed<<total/credit<<endl; // fixed : precision에서 설정한 것을 가져옴
return 0;
}
결과
결론
Map STL과 vector<tuple< , , >>을 활용하기에 아주 좋은 문제인 것 같다.