


문제가 길지만, 결국 학점을 계산하는 문제이다.
A+,A0,B+,,,D0,F,P 등의 학점을 어떻게 숫자에 매핑시킬지가 관건이다.
(또한 자료형을 double을 써야한다. 평균 내야하므로)
#include <iostream>
#include <string>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s1,s2,s3;
double grade=0;
double temp_grade;
int div=0;
for(int i=0;i<20;i++) {
cin >> s1 >> s2 >> s3;
if(s3 == "P") continue;
else if(s3 == "F") div+=stoi(s2);
else {
temp_grade = 4.5-(s3[0]-'A');
if (s3[1] == '0') temp_grade-=0.5;
div+=stoi(s2);
grade+=stoi(s2)*temp_grade;
}
}
cout << grade/div;
return 0;
}
숫자의 규칙성을 기반으로 풀이했다.
예를들어 4.5-'B'-'A' 를 하면 3.5 가 나온다. 이를 이용해서 별도의 매핑없이 수식으로 문자 -> 숫자 매핑을 진행했다.
#include <iostream>
#include <string>
using namespace std;
int main() {
string s1, s2, s3;
double total_point=0;
double total_grade=0;
double temp_grade;
for(int i=0;i<20;i++) {
cin >> s1 >> s2 >> s3;
if(s3[0] == 'P') continue;
total_point += stoi(s2);
if(s3[0] == 'F') continue;
if(s3[0] == 'A') temp_grade=4.0;
else if(s3[0] == 'B') temp_grade = 3.0;
else if(s3[0] == 'C') temp_grade = 2.0;
else temp_grade = 1.0;
if(s3[1]=='+') temp_grade+=0.5;
total_grade += stoi(s2)*temp_grade;
}
cout << total_grade/total_point;
return 0;
}
훨씬 직관적인 풀이이다.
P,F 성적은 continue로 처리하고 -> 다른 성적의 경우에는 앞 글자로 정수 부분을 맞춰준다. 이후에 뒷 부분이 +면 0.5를 더해준다.
이렇게 if-else if-else 문을 활용해 문자->숫자 매핑을 진행하는 풀이이다.
나의 코드보다 훨씬 더욱 직관적이고 좋은 코드인듯하다.
(1) string s="dfa" 일때 s[0] 을 하면 s[0]은 'd'가 된다.
(2) 만약 s[0]='a'와 같이 대입 연산자의 좌변에 s[0] 이 쓰이는 경우 원본 수정도 가능하다.
평규내는 문제는 a/b에서 a또는 b중 하나라도 double이나 float이어야 실수 계산값을 반환한다.
코딩테스트를 준비함에있어, 문법을 하나 하나 다 완벽히 숙지할수는 없다.
그냥 내가 알고있는 코드 블럭들을 잘 조합해서 문제를 해결해 나가는 것이다.