문제 출처: https://softeer.ai/practice/info.do?idx=1&eid=389
문제
N명의 학생들의 성적이 학번순서대로 주어졌다.
학번 구간 [A, B]가 주어졌을 때 이 학생들 성적의 평균을 구하는 프로그램을 작성하라.
제약조건
1 ≤ N ≤ 106 인 정수
1 ≤ K ≤ 104 인 정수
1 ≤ Si ≤ 100 인 정수
1 ≤ Ai ≤ Bi ≤ N
입력형식
첫 번째 줄에 학생 수 N과 구간 수 K가 주어진다.
두 번째 줄에는 학생의 성적 Si (1 ≤ i ≤ N)가 주어진다. i + 2 (1 ≤ i ≤ K)번째 줄에는 i번째 구간 Ai, Bi가 주어진다.
출력형식
i번째 줄에 i번째 구간의 성적평균(소수셋째자리에서 반올림)을 출력한다.
차이가 0.01이하이면 정답으로 채점됨.
분석:
단순 구현문제인데,
소수점 반올림과 소수점 출력에서 애를 먹었다.
소스 코드:
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
using namespace std;
int main(int argc, char** argv)
{
int N, K;
cin >> N >> K;
vector<int> v;
for(int i=0; i<N; i++){
int num;
cin >> num;
v.push_back(num);
}
int a,b,sum=0;
double average=0;
for(int i=0; i<K; i++){
cin >> a >> b;
for(int j = a-1; j<b; j++){
sum += v[j];
}
average = (double)(sum)/(b-a+1);
// 소수점 둘째자리까지 반올림하기 위한 코드
average *= 100;
average = round(average);
average /= 100;
// 26.67 은 정상 출력되지만, 45.00 or 90.00 값의 경우 45, 90 으로 출력이 됨
// 자연수 값이더라도 소수점 둘째자리까지(ex. 45.00) 출력하기 위한 방법
cout << setprecision(2) << fixed; // 소수점 둘째자리까지 고정(fixed)
cout << average << "\n";
sum = 0;
average =0;
}
return 0;
}