백준 - 4344번 평균은 넘겠지(사칙연산, 자료형)

Kiwoong Park·2023년 5월 17일
0

문제 자체는 어렵지 않지만, C/C++ 자료형 때문에 애먹은 문제

문제

C++ 풀이

부동소수점을 표기하기 위해 scanfprintf를 사용하여 풀려고 하다보니 double 을 활용할 일이 적어 구현 간 어려움이 있었다.

#include <bits/stdc++.h> // 다른 자료구조를 쓰지는 않지만 외울겸 그냥 써봄
using namespace std;

int main()
{
    int C,N;
    scanf("%d",&C);
    while(C--){
        double avg=0,n=0; // 평균과 평균이 넘는 인원 수를 double로 선언
        scanf("%d",&N);   
        double arr[N]={0}; // double 학생들의 점수 저장 배열 선언
        for(int i=0;i<N;i++){  // 하나씩 점수를 받으며 배열에 넣고, 평균을 구하기 위해 해당 수를 더해줌
            scanf("%lf",&arr[i]);
            avg+=arr[i];        
        }
        avg/=N;
        for(int i=0;i<N;i++) 
        	if (arr[i]>avg) n++; 
        printf("%.3f%\n",100*n/N);
    }
}

C++ 숏코딩 분석하기

항상 분석하면서 느끼는 건 숏코딩 특성 상 변수명이 한 문자라서 쉬운 로직이라도 이해하기가 굉장히 어려운 것 같다..ㅠ

무엇을 실수 자료형으로 하고, 정수 자료형으로 선언할지 시행착오가 있었는데
숏코딩을 보면 결국 d(=평균)와 e(=percent)만 실수 자료형으로 선언하면 된다.

#import<iostream>
int a,b[1000],c,f;
float d,e;
main(){
	std::cin>>f; //f는 테스트 케이스 수
    while(f--){
    	for(std::cin>>a,c=a,d=e=0;c--;d+=b[c]) //학생 수 인 a를 정수로 받고, 
        	std::cin>>b[c]; // 인덱스인 c에 a를 할당 후 증감연산자(--)로 0이 될 때까지 순회
            // 평균을 계산하기 위해 합계 변수인 d에 b[c], 즉 점수 값 누적 계산
        for(c=a;c--;) // 학생 수 인 a부터 시작해서 하나씩 줄여가면서 
        	b[c]>d/a?e++:0; // 점수값과 평균값(=d/a)을 삼항연산자로 비교하며 변수 e를 늘림
        printf("%.3f%%\n",e/a*100);
        }
}
profile
You matter, never give up

0개의 댓글