반응형
[ 문제 ]
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
- 산술평균 : N개의 수들의 합을 N으로 나눈 값
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값
- 범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
[ 코드 ]
1. 내 코드
using System.Text;
StreamReader sr = new StreamReader(new BufferedStream(Console.OpenStandardInput()));
StreamWriter sw = new StreamWriter(new BufferedStream(Console.OpenStandardOutput()));
StringBuilder sb = new StringBuilder();
int n = int.Parse(sr.ReadLine());
Dictionary<int, int> numArray = new Dictionary<int, int>();
List<int> numbers = new List<int>();
int sum = 0;
for (int i = 0; i < n; i++)
{
int num = int.Parse(sr.ReadLine());
sum += num;
numbers.Add(num);
if (numArray.ContainsKey(num))
numArray[num]++;
else
numArray[num] = 1;
}
numbers.Sort();
int median = numbers[n / 2];
int maxFrequency = numArray.Values.Max();
List<int> modes = numArray.Where(kvp => kvp.Value == maxFrequency).Select(kvp => kvp.Key).OrderBy(x => x).ToList();
int mode = modes.Count > 1 ? modes.Skip(1).Min() : modes.FirstOrDefault();
int arithmeticMean = (int)Math.Round((double)sum / n);
int difference = numbers[n - 1] - numbers[0];
sb.Append($"{arithmeticMean}\n{median}\n{mode}\n{difference}");
sw.Write(sb);
sw.Flush();
sw.Close();
sr.Close();
2. 다른 사람 코드
StreamReader sr = new StreamReader(new BufferedStream(Console.OpenStandardInput()));
int maxAbs = 4000;
int maxRange = 2 * maxAbs + 1;
int[] cnt = new int[maxRange];
int n = int.Parse(sr.ReadLine());
int num;
//산술평균
double sum = 0;
//중앙값
int midN = (n + 1) / 2;
int midNum = 0;
int midCnt = 0;
bool midFlag = false;
//최빈값
int freqNum = 0;
int maxFreq = 0;
bool freqFlag = false;
//범위
int maxNum = -maxAbs;
int minNum = maxAbs;
for (int i = 0; i < n; i++)
{
num = int.Parse(sr.ReadLine());
cnt[num + maxAbs]++;
//평균
sum += num;
//범위
if (num > maxNum)
maxNum = num;
if (num < minNum)
minNum = num;
}
sr.Close();
for (int i = 0; i < maxRange; i++)
{
//중앙값
if (!midFlag)
{
midCnt += cnt[i];
if (midCnt >= midN)
{
midNum = i;
midFlag = true;
}
}
//최빈값
if (cnt[i] > maxFreq)
{
maxFreq = cnt[i];
freqNum = i;
freqFlag = false;
}
else if (!freqFlag)
{
if (cnt[i] == maxFreq)
{
freqNum = i;
freqFlag = true;
}
}
}
Console.WriteLine((int)Math.Round(sum / n));
Console.WriteLine(midNum - maxAbs);
Console.WriteLine(freqNum - maxAbs);
Console.Write(maxNum - minNum);
[ 실행화면 ]
문제링크: https://www.acmicpc.net/problem/2108
반응형
'Language > C#' 카테고리의 다른 글
[C#] 백준 25501번 재귀의 귀재 (0) | 2024.04.01 |
---|---|
[C#] 백준 20920번 영단어 암기는 괴로워 (0) | 2024.03.31 |
[C#] 백준 26069번 붙임성 좋은 총총이 (0) | 2024.03.30 |
[C#] 백준 25192번 인사성 밝은 곰곰이 (0) | 2024.03.30 |
[C#] 백준 1037번 약수 (0) | 2024.03.29 |