<문제>
<오답>
#include<stdio.h>
int main(void)
{
int arr[1000];
int T,student,score,i,j,k;
int sum = 0,avg = 0;
double result =0;
scanf("%d", &T);
for (i = 0; i < T; i++)
{
scanf("%d", &student);
for (j = 0; j < student; j++)
{
scanf("%d", &score);
arr[j] = score;
sum += arr[j];
}
avg = sum / student;
for (k = 0; k < student; k++)
{
if (avg < arr[k])
{
arr[k] = 1;
result += arr[k];
}
}
printf("%.3lf%%\n", result / student);
}
return 0;
}
printf("%.3lf%%\n", result / student);
마지막 출력시에 *100을 해주어야 학생들의 비율을 출력 예제와 같이 소수점 셋째 자리까지 표현을 해줄 수 있다.
오 출력의 원인이 처음에는 배열 요소 값을 0으로 초기화시켜주지 않아서 일까 라는 생각이 들었다. 더 자세히는 앞선 배열의 길이가 더 길다면 뒤에 오는 배열의 길이에 해당하는 길이까지는, 뒤에 오는 배열 요소 값으로 초기화가 되지만, 남아있는 길이에 해당하는 요소 값들은 초기화가 되지 않은 채 그대로 남아있는 것이 출력 결과에 영향을 미치지 않을까 생각을 했었다.
<위 오출력 원인 추측에 대한 코드>
#include<stdio.h>
int main(void)
{
int arr[1000] ={0};
int T, student, score, i, j,k;
scanf("%d", &T);
for (i = 0; i < T; i++)
{
scanf("%d", &student);
for (j = 0; j < student; j++)
{
scanf("%d", &score);
arr[j] = score;
}
for (k = 0; k < 5; k++)
{
printf("%d\n", arr[k]);
}
}
return 0;
}
T = 2를 입력하였다. i = 0 일 때 student = 5, score = 50으로 통일하여 준다. 그러면, 출력 결과는 50이 5개가 출력이 되는 것을 볼 수 있다. 그리고, i = 1일 때(반복문 2회 차일 때) student = 3을 입력하고, score = 10으로 3번 입력하여 준다. 그러면 출력 결과는 10 10 10 50 50이 나오는 것을 확인할 수 있다. 추측한 대로 앞선 배열이 뒤에 다시 초기화시켜줄 배열의 길이보다 길다면, 출력 결과에 영향을 끼치는 것을 확인할 수 있다.
그러면 문제에서 arr[ j ]에 대해 다시 0으로 초기화를 시켜주는 코드를 추가하여 준다면, 정답이 될까? 그렇지 않다. 이 코드가 틀린 근본적인 이유는 출력을 한뒤, sum = 0, result = 0 값이 되게끔 해주는 코드를 작성해주지 않았기 때문이다. 이 코드가 없다면 sum과 result값이 전에 있던 값에 더해 계속 누적이 되기 때문에 제대로 된 출력 결과를 볼 수 없다.
avg값은 sum의 값에 의해 파생되기 때문에, sum을 0으로 초기화 해주는 것으로 충분하다.
밑의 코드를 보면 알 수 있듯이 배열의 길이가 길든 짧든에 관계없이 그 해당 배열의 길이를 기준으로 문제의 조건에 따른 연산을 진행하기 때문에 앞 뒤에 오는 배열의 길이에 관한 문제는 신경 쓰지 않아도 된다.
<정답>
#include<stdio.h>
int main(void)
{
int arr[1000] = {0,};
int T,student,score,i,j,k;
int sum = 0,avg = 0;
double result =0;
scanf("%d", &T);
for (i = 0; i < T; i++)
{
scanf("%d", &student);
for (j = 0; j < student; j++)
{
scanf("%d", &score);
arr[j] = score;
sum += arr[j];
}
avg = sum / student;
for (k = 0; k < student; k++)
{
if (avg < arr[k])
{
arr[k] = 1;
result += arr[k];
}
}
printf("%.3lf%%\n",(result/student)*100);
sum = 0;
avg = 0;
result = 0;
}
return 0;
}