인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다!
치훈이의 전공평점을 계산해주는 프로그램을 작성해보자.
전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.
인하대학교 컴퓨터공학과의 등급에 따른 과목평점은 다음 표와 같다.
| 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 |
P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.
과연 치훈이는 무사히 졸업할 수 있을까?
20줄에 걸쳐 치훈이가 수강한 전공과목의 과목명, 학점, 등급이 공백으로 구분되어 주어진다.
치훈이의 전공평점을 출력한다.
정답과의 절대오차 또는 상대오차가 10−4(10^{-4}) 이하이면 정답으로 인정한다.
1.0,2.0,3.0,4.0중 하나이다.A+,A0,B+,B0,C+,C0,D+,D0,F,P중 하나이다.P가 아님이 보장된다.
#include <iostream>
using namespace std;
int main()
{
//C++의 입출력 성능 향상을 위한 설정
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
double tot_credit = 0, total = 0;// tot_credit: 내가 들은 학점들의 총합
//total: 받은 성적과 과목 학점 곱의 총합
for (int i = 0; i < 20; ++i)
{
string name;
cin >> name;//과목이름 입력
double credit;
cin >> credit;//들은 과목의 학점 입력
string grade;
cin >> grade;//받은 학점 입력
if (grade == "P")//p를 받은 경우 나머지 건너 뛰기
continue;
else if (grade == "A+")//학점에 대한 총 점수와 총 들은 학점 수 계산
{
total += credit * 4.5;
tot_credit += credit;
}
else if (grade == "A0")
{
total += credit * 4.0;
tot_credit += credit;
}
else if (grade == "B+")
{
total += credit * 3.5;
tot_credit += credit;
}
else if (grade == "B0")
{
total += credit * 3.0;
tot_credit += credit;
}
else if (grade == "C+")
{
total+= credit * 2.5;
tot_credit += credit;
}
else if (grade == "C0")
{
total += credit * 2.0;
tot_credit += credit;
}
else if (grade == "D+")
{
total += credit * 1.5;
tot_credit += credit;
}
else if (grade == "D0")
{
total += credit * 1.0;
tot_credit += credit;
}
else if (grade == "F")
{
tot_credit += credit;
}
}
double answer = total / tot_credit;// 학점평균 구하는 코드
cout << answer;
return 0;
}
❣️ 문제 요약: 전공명, 전공과목의 학점, 내가 받은 학점을 입력받아서 총 전공평점을 구하는 것이다.
⚠️ C++의 입출력 성능 향상을 위한 설정
ios_base::sync_with_stdio(false);:
- C++의 표준 입출력(
cin,cout)과 C 표준 입출력 함수(scanf,printf)를 더 효율적으로 함께 사용할 수 있고 , C++ 스트림과 C 스트림 간의 동기화를 끈다.- 특히, 대량의 입출력이 발생하는 경우에 성능 향상을 가져올 수 있다.
cin.tie(nullptr);:
cin과cout이 동기화되는 것을 방지하는데 이 동기화는 출력할 때마다 입력 버퍼를 비우는 작업을 동반하므로, 이를 막아서 성능을 향상시킨다.cout.tie(nullptr);:
cout의 출력 버퍼를 끄게 하여 성능 향상시키고cout이 출력을 할 때마다cin버퍼를 비워주지 않도록 한다.
https://velog.io/@itsantiago/백준-25206번-너의-평점은map-문자열
제어문을 사용하지 않고 map을 사용해서 학점에 점수를 편하게 맵핑한 점이 인상적이어서 참고하고자 가져왔습니다.
#include <bits/stdc++.h>
using namespace std;
int main()
{
map<string,float> m;
m["A+"]= 4.5;
m["A0"]= 4.0;
m["B+"]= 3.5;
m["B0"]= 3.0;
m["C+"]= 2.5;
m["C0"]= 2.0;
m["D+"]= 1.5;
m["D0"]= 1.0;
m["F"]= 0.0;
int n;
string s,g;
float a,tot;
while(cin >> s >> a >> g){
if (g == "P") continue;
tot+=a*m[g];
n+=a;
}
cout << tot/n;
return 0;
}
⚠️ C++ Map 속성
map은 각 노드가 key와 value 쌍으로 이루어진 트리로특히, 중복을 허용하지 않는다.따라서 map은 first, second가 있는 두개의 객체로 저장되는 데 first는 key로 second는 value로 저장된다.C++의 map의 내부 구현은 검색, 삽입, 삭제가 O(logn) 인레드블랙트리로 구성되어 있다.
#include <map>
map<string, int> m;
if (m.find("Alice") != m.end()) {
cout << "find" << endl;
}
else {
cout << "not find" << endl;
}