백준 - 단계별로 풀어보기 [4344] 평균은 넘겠지
https://www.acmicpc.net/problem/4344
문제
대학생들의 점수를 입력 받은 후, 평균을 넘는 학생들의 비율을 구하는 문제이다.
입력은 테스트 케이스의 개수 C와 학생들의 수, 학생들의 점수가 주어진다.
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
풀이
이차원 배열의 동적 할당과 반복문을 활용하여 풀 수 있는 문제이다.
문제 자체가 정말 다양한 풀이법이 나올 수 있고, 굳이 이차원 배열이 아니고 다른 방법으로 푸는 방법도 있을 것이라고 생각된다.
먼저 테스트 케이스의 개수 C를 입력받은후, C개 만큼의 이차원배열 행을 동적할당한다.
int c;
scanf("%d",&c);
int **array = new int*[count];
float *means = new float[count]; //평균은 소수이므로 float자료형
그 후 학생의 수는 최대 1000명이라고 했으므로, 열 1000개와 학생 수 1에 해당하는 1001개의 동적할당을 진행해준다.
for (int i = 0; i < count; i++)
{
array[i] = new int[1001];
}
그 후엔, 학생들의 수를 입력받고, 해당하는 수 만큼의 점수를 입력받는다.
그 후 점수의 합을 통해 평균을 구하고, 평균을 넘은 학생들의 수를 세어 비율을 구하면 되는 문제이다.
이 때 소수 셋째자리에서 반올림을 하여 표현하라고 하였으므로,
%.3f 의 형식지정자를 사용하여 출력하면 원하는 출력값을 얻을 수 있다.
코드
#include <cstdio>
int main() {
int count;
scanf("%d",&count);
int **array = new int*[count];
float *means = new float[count];
int sum = 0;
int goodstudent = 0;
for (int i = 0; i < count; i++)
{
array[i] = new int[1001];
}
for (int i = 0; i < count; i++)
{
sum = 0;
scanf("%d",&array[i][0]);
for (int j = 1; j <= array[i][0]; j++)
{
scanf("%d",&array[i][j]);
sum += array[i][j];
}
means[i] = (float)sum / array[i][0];
for (int j = 1; j <=array[i][0]; j++)
{
if(array[i][j] > means[i])
{
goodstudent++;
}
}
printf("%.3f%%\n",(float)goodstudent/array[i][0] * 100);
goodstudent = 0;
}
return 0;
}
평가
이차원 배열 활용을 묻는 문제라고 생각된다.
배열의 첫 인자값이 점수가 아니고 학생의 수를 받아오기 때문에 반복문이 조금 복잡해질수는 있다. 필자의 코드도 완전 효율적인 코드는 아닐 수 있다고 생각한다. 이번 문제의 정답률은 38.361%로 매우 낮은편인데, 개인적으로는 왜 저렇게까지 낮은지는 이해가 되지 않는 문제였다. 본 문제에서는 이차원 배열과 동적할당에 대해서 알아두고 가면 좋을 것 같다고 생각한다.
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준 / BOJ] - 1018번 체스판 다시 칠하기 C++ 풀이 (1) | 2020.02.06 |
---|---|
[백준 / BOJ] - 1157번 단어 공부 C++ 풀이 (0) | 2020.02.03 |
[백준 / BOJ] - 10809번 알파벳 찾기 C++ 풀이 (0) | 2020.01.30 |
[백준 / BOJ] - 10951번 A+B-4 C++ 풀이 (0) | 2020.01.28 |
[백준 / BOJ] - 10172번 개 C++ 풀이 (0) | 2020.01.28 |