촉촉한초코칩

[백준] 25206(너의 평점은) c언어 본문

Algorithm

[백준] 25206(너의 평점은) c언어

햄친구베이컨 2023. 9. 13. 16:09

문제

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 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 이하이면 정답으로 인정한다.

 


 

#include <stdio.h>
#include <string.h>

typedef struct {
  char name[50];
  float score;
  char s_grade[10];
} class;

typedef struct {
  char s_grade[10];
  float score;
} grade;

int main(void) {

  class c[20] = {};
  float g_sum = 0.0, sum = 0.0;

  grade g[] = {
    {"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}
  };

  for(int i=0; i<20; i++) {
    scanf("%s %f %s", &c[i].name, &c[i].score, &c[i].s_grade);
    if(strcmp(c[i].s_grade, "P")==0 || strcmp(c[i].s_grade, "F")==0)
      continue;
    else
      g_sum += c[i].score;
  }

  //학점 = (c->score * g->score) / g_sum
  for(int i=0; i<20; i++) {
    for(int j=0; j<9; j++) {
      if(strcmp(c[i].s_grade, g[j].s_grade)==0) {
        sum = sum + (c[i].score * g[j].score);
        break;
      } else if(strcmp(c[i].s_grade, "P")==0 || strcmp(c[i].s_grade, "F")==0) 
        continue;
    }
  }

  sum /= g_sum;
  printf("%f\n", sum);
  
  return 0;
}

 

구조체 사용이 편할 것 같아서 입력받는 과목이랑, 학점별 평점을 따로 선언했는데..... 

음 자꾸 틀렸다고 나온다. 

보니까 첫번째 예제는 맞게 잘 나오는데 두번째는 nan으로 나온다. 

 

검색해보니 학점별 평점은 따로 구조체를 사용하지 않고 계산하길래 다시 코드를 짰다....

 

그래도 내가 짠 코드가 계속 틀렸다고 나오길래... 다시 천천히 봤는데....

#include <stdio.h>
#include <string.h>

typedef struct {
  char name[50];
  float score;
  char s_grade[10];
} class;

typedef struct {
  char s_grade[10];
  float score;
} grade;

int main(void) {

  class c[20] = {};
  float g_sum = 0.0, sum = 0.0;

  grade g[] = {
    {"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}
  };

  for(int i=0; i<20; i++) {
    scanf("%s %f %s", &c[i].name, &c[i].score, &c[i].s_grade);
    if(strcmp(c[i].s_grade, "P")==0)
      continue;
    else
      g_sum += c[i].score;
  }

  //학점 = (c->score * g->score) / g_sum
  for(int i=0; i<20; i++) {
    for(int j=0; j<9; j++) {
      if(strcmp(c[i].s_grade, g[j].s_grade)==0) {
        sum = sum + (c[i].score * g[j].score);
        break;
      } else if(strcmp(c[i].s_grade, "P")==0) 
        continue;
    }
  }

  sum /= g_sum;
  printf("%f\n", sum);
  
  return 0;
}

차이점 찾아보실분...ㅋㅋㅋㅋ

 

F에 대해서도 계산을 해야되더라,,,,,,,,,, else if문에서 F continue 해주는 부분만 빼니까 성공했다!!