일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 환경설정
- Subscribe
- 오늘도 우라라 공략
- 기초
- 데이터 베이스
- C언어
- ros
- 오늘도 우라라
- 그랑사가
- LeetCode
- 반복문
- 리눅스
- topic
- 토픽
- Linux
- MSG
- 등차수열
- 오늘도 우라라 펫 공략
- 우분투
- ubuntu
- JungOl
- mysql
- C++
- while
- 오늘도 우라라 펫
- mariaDB
- 마리아 DB
- 프로그래밍
- install opencv-4.4.0 on ubuntu 22.04
- publish
- Today
- Total
하루의 쉼터
[BAEKJOON] 4344. 평균은 넘겠지 본문
Title :
4344. 평균은 넘겠지
Question :
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다.
당신은 그들에게 슬픈 진실을 알려줘야 한다.
Condition :
입력
첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
출력
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
Example :
입력 :
5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91
출력 :
40.000%
57.143%
33.333%
66.667%
55.556%
Limited - Time :
1 초
Limited - Space :
256 MB
전체 Flow Chart :
Code :
cl_solution.hpp
#include<iostream>
#include<cstring>
class cl_solution{
public :
void fn_run(int num);
};
cl_solution.cpp
#include "cl_solution.hpp"
void cl_solution::fn_run(int num){
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int i = 0, j = 0, user_data_size = 0, sum = 0, result_cnt= 0 ;
double avg=0;
while (i < num) {
std::cin >> user_data_size;
if(1<=user_data_size&&user_data_size<=1000){
int* arr_data = new int[user_data_size];
memset(arr_data, 0, sizeof(int) * user_data_size);
while (j < user_data_size) {
std::cin>>arr_data[j];
if(0<=arr_data[j]&&arr_data[j]<=100){
sum += arr_data[j];
j++;
}
}
j = 0;
avg = (double)sum / (double)user_data_size;
while (j < user_data_size) {
if (arr_data[j] > avg) {
result_cnt++;
}
j++;
}
std::cout <<std::fixed;
std::cout.precision(3);
std::cout << ((double)result_cnt / (double)user_data_size) * 100 <<"%\n";
result_cnt=j= sum = 0;
avg = 0;
delete arr_data;
i++;
}
}
}
main.cpp
#include "cl_solution.hpp"
int main() {
cl_solution sol;
int num = 0;
std::cin >> num;
if(num>0){
sol.fn_run(num);
}
return 0;
}
코드&문제 분석 :
합산, 평균 도출, 평균 보다 높은 학생 수 체크로 크게 세가지로 볼수 있다.
사용 변수 :
Type | 변수 명 | 설명 |
int | i | loop문을 제어하기 위해 사용 - 초기 num 관련 |
int | j | loop문을 제어하기 위해 사용 - 학생 수 관련 |
int | user_data_size | 학생 몇 명을 할지 사용자에게 크기를 입력 받는 변수 |
int | sum | 학생 점수의 합 |
int | result_cnt | 평균 보다 넘는 학생 수를 체크하는 변수 |
double | avg | 학생 점수의 평균 |
int* | arr_data | 학생 점수를 담기 위한 배열 |
1. 조건
1. 첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
2. 둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고,
이어서 N명의 점수가 주어진다.
3. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
4. 각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
1.1. 필자는 여기서 0보다 적은 테스트 케이스 C를 주어진다면 종료 하게 하였다.
2. 문제 해결
2.1 합산
사용자에게 학생 인원을 입력 받아 조건을 체크하고 배열의 크기를 정하고, 초기화 시켜 준 후 점수를 합산한다.
std::cin >> user_data_size;
if(1<=user_data_size&&user_data_size<=1000){
int* arr_data = new int[user_data_size];
memset(arr_data, 0, sizeof(int) * user_data_size);
while (j < user_data_size) {
std::cin>>arr_data[j];
if(0<=arr_data[j]&&arr_data[j]<=100){
sum += arr_data[j];
j++;
}
}
2.2 평균 도출
avg = (double)sum / (double)user_data_size;
2.3 평균 보다 높은 학생 수 체크
while (j < user_data_size) {
if (arr_data[j] > avg)
result_cnt++;
j++;
}
3. 소수점 셋째 자리까지 출력
std::cout <<std::fixed;
std::cout.precision(3);
std::cout << ((double)result_cnt / (double)user_data_size) * 100 <<"%\n";
4. 초기화
result_cnt=j= sum = 0;
avg = 0;
delete arr_data;
Result :
BackJoon :
https://www.acmicpc.net/problem/4344
GitHub :
'Coding Test > BaekJoon' 카테고리의 다른 글
[BAEKJOON] 2557. Hello World (0) | 2021.11.25 |
---|---|
[BAEKJOON] 1065. 한수 - Feat. C++ (0) | 2021.10.30 |
[BAEKJOON] 1100. 더하기 사이클 (0) | 2021.10.17 |
[BAEKJOON] 10871. X보다 작은 수 (0) | 2021.10.11 |
[BAEKJOON] 2884. 알람 시계 (0) | 2021.10.11 |