[백준] 25206번 너의 평점은? -C++

potatoj11n·2024년 1월 20일

백준

목록 보기
9/36

🌱 문제 설명

25206번 너의 평점은?

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다!

치훈이의 전공평점을 계산해주는 프로그램을 작성해보자.

전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.

인하대학교 컴퓨터공학과의 등급에 따른 과목평점은 다음 표와 같다.

A+4.5
A04.0
B+3.5
B03.0
C+2.5
C02.0
D+1.5
D01.0
F0.0

P/F 과목의 경우 등급이 P또는 F로 표시되는데, 등급이 P인 과목은 계산에서 제외해야 한다.

과연 치훈이는 무사히 졸업할 수 있을까?


입력

20줄에 걸쳐 치훈이가 수강한 전공과목의 과목명, 학점, 등급이 공백으로 구분되어 주어진다.


출력

치훈이의 전공평점을 출력한다.

정답과의 절대오차 또는 상대오차가 10−4(10^{-4}) 이하이면 정답으로 인정한다.


제한

  • 1 ≤ 과목명의 길이 ≤ 50
  • 과목명은 알파벳 대소문자 또는 숫자로만 이루어져 있으며, 띄어쓰기 없이 주어진다. 입력으로 주어지는 모든 과목명은 서로 다르다.
  • 학점은 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;
}
  • 코드 설명

❣️ 문제 요약: 전공명, 전공과목의 학점, 내가 받은 학점을 입력받아서 총 전공평점을 구하는 것이다.

  • tot_credit: 내가 들은 학점들의 총합
  • total: 받은 성적과 과목 학점 곱의 총합
  • name: 전공 이름
  • credit: 들은 전공의 학점
  • grade : 내가 받은 학점
  • answer: 학점 평균

⚠️ C++의 입출력 성능 향상을 위한 설정

  • ios_base::sync_with_stdio(false); :
    • C++의 표준 입출력(cin, cout)과 C 표준 입출력 함수(scanf, printf)를 더 효율적으로 함께 사용할 수 있고 , C++ 스트림과 C 스트림 간의 동기화를 끈다.
    • 특히, 대량의 입출력이 발생하는 경우에 성능 향상을 가져올 수 있다.
  • cin.tie(nullptr); :
    • cincout이 동기화되는 것을 방지하는데 이 동기화는 출력할 때마다 입력 버퍼를 비우는 작업을 동반하므로, 이를 막아서 성능을 향상시킨다.
  • 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) 인레드블랙트리로 구성되어 있다.

  • Map 사용
  1. 헤더 포함
    #include <map>
  1. 맵 선언
    map<string, int> m;
  1. 맵에 찾는 데이터가 있는지 확인
    if (m.find("Alice") != m.end()) {
    	cout << "find" << endl;
    }
    else {
    	cout << "not find" << endl;
    }

0개의 댓글