[C言語]白駿2108:統計学
構想
私が初めて解いた謎(間違い)
#include <stdio.h>
int ft_rep(int arr[], int n)
{
int i;
int rep[8001];
int max, mode = 0;
i = 0;
while (i < n)
{
rep[arr[i]]++; // rep에 arr[i]를 집어넣고 ++로 세줌
i++;
}
max = 0;
i = 0;
while (i < n)
{
if (rep[arr[i]] > max)
{
max = rep[arr[i]];
mode = arr[i]; // max값 찾고, 그 지점 mode로 저장
}
i++;
}
return mode;
}
int ft_aver(int arr[], int n)
{
int i;
int sum = 0;
i = 0;
while (i < n)
{
sum = sum + arr[i];
i++;
}
return sum;
} // sum을 계산
void ft_swap(int arr[], int i, int j)
{
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void ft_sort(int arr[], int n) // 선택정렬
{
int i, j;
i = 0;
while (i < n - 1)
{
j = i + 1;
while (j < n)
{
if (arr[i] > arr[j])
ft_swap(arr, i, j);
j++;
}
i++;
}
}
int main()
{
int n, i;
scanf("%d", &n);
i = 0;
int arr[n];
double dsum;
while (i < n)
{
scanf("%d", &arr[i]);
i++;
}
dsum = ft_aver(arr , n);
dsum = dsum / n;
printf("%.0f\n", dsum); // 1번
ft_sort(arr, n);
printf("%d\n", arr[n / 2]); // 2번
printf("%d\n", ft_rep(arr, n));
printf("%d\n", arr[n - 1] - arr[0]); // 4번
i = 0;
}
ここまで言うと、最低価格はどう計算すればいいか本当に分かりません.結局グーグルで答えを見ましたが、まだ理解できません.疲れた.
ああ、そして選択ソートを使うとタイムアウトするそうです.
明日はクイックソート(内蔵関数)を勉強します.最適値を再理解することを目標としています.
翌日出力1.2.4万
#include <stdio.h>
#include <stdlib.h>
int arr[500001];
int compare(const void *a, const void *b)
{
int num1 = *(int *)a;
int num2 = *(int *)b;
if (num1 < num2)
return -1;
if (num1 > num2)
return 1;
return 0;
}
int main()
{
int i, n;
int sum = 0;
scanf("%d", &n);
i = 0;
while (i < n)
{
scanf("%d", &arr[i]);
sum = sum + arr[i];
i++;
}
qsort(arr, n, sizeof(int), compare);
printf("%.0f\n", sum / (double)n);
printf("%d\n", arr[n / 2]);
printf("%d\n", arr[n - 1] - arr[0]);
}
最低価格を除いて、ペーストは本当に短いです.NULL値を含む解答
#include <stdio.h>
#include <stdlib.h>
int arr[500001];
int count[8001];
int compare(const void *a, const void *b)
{
int num1 = *(int *)a;
int num2 = *(int *)b;
if (num1 < num2)
return -1;
if (num1 > num2)
return 1;
return 0;
}
int maxFinder(int arr[], int size_arr)
{
int max = arr[0];
int i = 0;
while (i < size_arr)
{
if (max < arr[i])
max = arr[i];
i++;
}
return max;
}
int main()
{
int i, n;
int sum = 0, mode = 0, flag = 0;
scanf("%d", &n);
i = 0;
while (i < n)
{
scanf("%d", &arr[i]);
sum = sum + arr[i];
count[arr[i] + 4000]++;
i++;
}
i = 0;
while (i < 8001)
{
if (maxFinder(count, 8001) == count[i])
{
flag++;
}
i++;
}
i = 0;
while (i < 8001)
{
if (flag == 1)
{
if (maxFinder(count, 8001) == count[i])
{
mode = i - 4000;
break;
}
}
else
{
if (maxFinder(count, 8001) == count[i])
{
if (flag == 0)
{
mode = i - 4000;
break;
}
else
flag = 0;
}
}
i++;
}
qsort(arr, n, sizeof(int), compare);
printf("%.0f\n", sum / (double)n);
printf("%d\n", arr[n / 2]);
printf("%d\n", mode);
printf("%d\n", arr[n - 1] - arr[0]);
}
ここでhttps://mjeong9316.tistory.com/172の助けを得ました.簡単に説明すると、絶対値は4000を超えないので、8001に設定します.これは、最大値を設定すると負の値が歪むためです.
したがってiは0から8000まで戻り,+4000で負数を正数にし,最空値を探す.
次に、最大値が見つかったらflagを設定します.
flagが1の場合、最大値は1つしかないので、最初に追加した4000を減算して出力します.1より大きい場合は複数の最大値を表し、最初の最大値が現れる場合はflag=0、2番目の最大値が現れる場合はflag=0、breakとなります.
しかし、このコードをコミットすると85%がエラーになります.比較を続けて、いっそ同じコードを置いても見ましたが、ずっと間違っていました.8回試したようですが...どこが間違っているのか分かりません.
最終コミットコード
https://sedangdang.tistory.com/19
この人をコピーしただけです.
論理も比較したが、どこが問題なのか分からない.
コレクションができた以上、また今度見ましょう.この問題はどれくらい時間がかかったかわからない.
確かに、負の数を正の数に変えてから、その値を減らす考えは確かにいいですね.
また、int型にそれぞれ0.5を入れる方法が不思議です.
Reference
この問題について([C言語]白駿2108:統計学), 我々は、より多くの情報をここで見つけました https://velog.io/@kimmainsain/C언어-백준-2108-통계학テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol