n은 홀수니까 중앙값을 구할 때 홀짝을 구별할 필요가 없다.
우선 입력된 수를 정렬한 뒤에 산술평균, 중앙값, 최빈값, 범위를 구한다.
제일 까다로운 부분은 최빈값인데, 만약 빈도수가 동일하다면 두번째로 작은 값을 출력해야한다.
따라서, 딕셔너리를 이용하여 TryAdd를 통해 이미 딕셔너리 내에 존재한다면 빈도값에 해당하는 값을 1 증가시켜준다.
이후, 딕셔너리에서 가장 큰 밸류값과 동일한 밸류값을 가진 세트들을 찾고, 이 세트를 정렬해서 만약 세트의 크기가 1이라면(즉, 최빈값이 하나라면) 해당 키값을, 아니라면(최빈값이 여러개라면) 2번째 수(즉, 두번째로 큰 수) 를 출력하도록 한다.
namespace SongE
{
public class Program
{
static void Main(string[] args)
{
using var input = new System.IO.StreamReader(Console.OpenStandardInput());
using var print = new System.IO.StreamWriter(Console.OpenStandardOutput());
int intInput() => int.Parse(input.ReadLine());
//int[] intsInput() => Array.ConvertAll(input.ReadLine().Split(), s => int.Parse(s));
int sum = 0;
int n = intInput();
int[] ints = new int[n];
Dictionary<int, int> fq = new();
for (int i = 0; i < n; i++)
{
ints[i] = intInput();
sum += ints[i];
if (!fq.TryAdd(ints[i], 0)) fq[ints[i]]++;
}
//최빈값
var fqMax = fq.Where(x => x.Value == fq.MaxBy(y => y.Value).Value);
fqMax = fqMax.OrderBy(x => x.Key);
Array.Sort(ints);
//산술평균
double mean = Math.Round((float)sum / n);
print.WriteLine(mean == -0 ? 0 : mean);
//중앙값
print.WriteLine(ints[n / 2]);
//최빈값
print.WriteLine(fqMax.Count() == 1 ? fqMax.First().Key : fqMax.ElementAt(1).Key);
//범위
print.WriteLine(ints[n - 1] - ints[0]);
}
}
}
근데 틀렸다.
사유: 평균이....... float이 아니라 double로 해야했었다 ㅋㅋㅋㅋ
아!!
namespace SongE
{
public class Program
{
static void Main(string[] args)
{
using var input = new System.IO.StreamReader(Console.OpenStandardInput());
using var print = new System.IO.StreamWriter(Console.OpenStandardOutput());
int intInput() => int.Parse(input.ReadLine());
//int[] intsInput() => Array.ConvertAll(input.ReadLine().Split(), s => int.Parse(s));
int sum = 0;
int n = intInput();
int[] ints = new int[n];
Dictionary<int, int> fq = new();
for (int i = 0; i < n; i++)
{
ints[i] = intInput();
sum += ints[i];
if (!fq.TryAdd(ints[i], 1)) fq[ints[i]]++;
}
Array.Sort(ints);
//산술평균
double mean = Math.Round((double)sum / n);
print.WriteLine(mean == -0 ? 0 : mean);
//중앙값
print.WriteLine(ints[n / 2]);
//최빈값
var fqMax = fq.Where(x => x.Value == fq.MaxBy(y => y.Value).Value);
fqMax = fqMax.OrderBy(x => x.Key);
print.WriteLine(fqMax.Count() == 1 ? fqMax.First().Key : fqMax.ElementAt(1).Key);
//범위
print.WriteLine(ints[n - 1] - ints[0]);
}
}
}
+)추가.
string.Format("{0:#; -#;0}", -0) 으로 하면 -0이 아니게 되는게 해결됨.