문제 자체는 어렵지 않지만, C/C++ 자료형 때문에 애먹은 문제
부동소수점을 표기하기 위해
scanf
와printf
를 사용하여 풀려고 하다보니 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);
}
}
항상 분석하면서 느끼는 건 숏코딩 특성 상 변수명이 한 문자라서 쉬운 로직이라도 이해하기가 굉장히 어려운 것 같다..ㅠ
무엇을 실수 자료형으로 하고, 정수 자료형으로 선언할지 시행착오가 있었는데
숏코딩을 보면 결국 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);
}
}