블램의 일상 IT카페

[C]백준 1546번 [평균] - 풀이 본문

IT/알고리즘 문제 풀이

[C]백준 1546번 [평균] - 풀이

ble_ram 2022. 11. 22. 19:21

문제.


 

 

 

 

 

내가 틀린 이유.


우선 첫번째 문제는 문제에서 최고점까지 점수를 고쳤다는 건지 최고점을 빼고 고쳤단건지 몰라서 대충 계산기로 예제 돌려보니 전부 점수를 고친다는 걸 알게됐다.

 

대충 이문제는 평소 풀던 문제들 처럼 n값주고 scanf 돌린다음 수식을 만들어 출력해내면 되는 문제라고 생각했다.

그러나 전 문제들과 다른점은 '최대값'을 구해야한다는 것.

 

파이썬과 다르게 c는 따로 최소 최대 함수가 없어서 수식을 직접 짜야했다.

 

물론 난 짜는 법 몰라서 웹서핑하면서 공부했다...

 

결국 코드를 따다보니 몇시간을 박아도 잘 안되길래 

 

백준 게시판의 질문을 올려서 솔루션을 받았다.

 

내가 지금 처한 상황은 출력값은 제대로 나오는데.. 자꾸 백준에서 틀렸다 뜨질 않나.

 

처음보는 런타임 에러까지 보았다.

 

대충 요약하자면 배열크기가 안맞을때 나오는거라고 한다..(이때 새벽이라 도저히 버틸힘이 없어서 공부는 안했음..)

 

코드에서 딱 이부분만 바꿔주면 됐다!

 

내 코드에서 int형을 double형으로...

 

하.. ㅋㅋㅋㅋㅋ 분명 상대오차나오고 예제에서도 75.0 이렇게 나오는데 내가 대체 저걸 왜 못봤을까 싶다...

근데 뭐 double형 말고 float형으로 쓰다가 한방 먹은거라..

 

다시 한 번 배우게됐다...

 

총 종합해보자면

 

1. int 형 사용

2. float형보단 double형이 오차범위 더 적다!

3. 최대값을 구하는 수식을 이해하자!

 

이 3개가 나의 원인이였다고 보시면 된다..

 

 

 

 

 

풀이.


 

#include <stdio.h>
int main() {
    //1. N값을 입력한다.
    int N = 0, i;
    double M[1001]={0};
    double De, fina=0;
    scanf("%d", &N);
    
    //2. M값을 배열에 넣는다.
    for (i = 0; i < N; i++) {
        scanf("%lf", &M[i]);
    }
    
    //3. 최대값을 구해준다.
    double max = M[0];
    for (i = 0; i < 1001; i++) {
      if(M[i] > max) max = M[i];        
    }
    
    //4. M값들 / 최대값*100 을 i번 만큼
    //   fina 변수에 대입하여 더해준다.
    De = max;
    for (i = 0; i < N; i++) {
      fina += M[i]/De*100;
    }
    
    //.5. 더한 값들을 N값으로 나눠준다.
    printf("%lf", fina/N);  
    return 0;
}

 

.최대값 수식.

double max = M[0];
    for (i = 0; i < 1001; i++) {
      if(M[i] > max) max = M[i];        
    }

이 부분이 최대값 수식인데 대충 작동방식은

 

1. M[i]보다 max가 작다면 max에 M[i] 대입

여기서 M[i]는 배열이므로 M[i]의 인덱스마다 40, 60, 80이 들어간다고 가정 시

 

max = 0 보다 입력값 40이 더 크기에 max = 40,

다시 반복해서 80이 40보다 더 크기에 max = 80,

다시 반복해서 60은 80보다 작기에 

 

최대값은 80으로 마무리.

즉 최대값 max = 80

 

이외에 나머지는 간단한 수식들로 대입해주면 된다.

 


아무래도 시작한지 얼마안됐고 언어 이해도가 부족하다보니

더 효율적인 코드를 짤 수준은 안되는 것 같다.

 

아! 나도 빨리 플레가고싶다!!!


Comments