본문 바로가기
코딩테스트 준비/백준 C#

백준 C# - 2108 +) 풀이

by 코딩하는 돼징 2024. 3. 24.
반응형

01 산술평균

소수점 이하 첫째 자리에서 반올림한 값을 출력한다. Math.Round를 사용했다.

(int)Math.Round(sum / n)

02 중앙값

문제에서 N이 홀수인 조건이 있다. 홀수가 아니였으면 푸는게 복잡했을텐데 홀수이므로 입력받은 값들을 정렬시키고 중간위치에 있는애를 출력하면 된다.

(int)list[n/2]

03 최빈값

제일 구하기 복잡했던 최빈값 먼저 생각했던 방법은 Dictionary를 사용해서 입력받은 m이 있는 경우 해당 Value값을 증가시키고 없는 경우 Key가 m, Value가 1인 값을 추가한다.

for(int i = 0; i<n;i++)
{
    double m = double.Parse(Console.ReadLine());
    if (dict.ContainsKey(m)) dict[m]++;
    else dict.Add(m, 1);
}

그리고 Value를 기준으로 내림차순으로 정렬하고 ThenBy를 이용해 같이 동일한 경우 오름차순으로 정렬되도록 하였다.

var dict2 = dict.OrderByDescending(x => x.Value).ThenBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);

 

여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다는 조건이 있는데 이러한 경우를 대비해서 ElementAt를 이용해서 두번째 작은값을 출력하도록한다.

double mode = 0;
if(dict2.Count > 1)
{
    if (dict2.Values.ElementAt(1) == dict2.Values.ElementAt(0)) mode = dict2.Keys.ElementAt(1);
    else mode = dict2.Keys.ElementAt(0);
}

04 범위

list를 정렬시킨 후 마지막에 위치한 요소에서 첫번째 요소를 뺀 값을 출력한다.

(int)(list[n-1]-list[0])

코드 전문

using System;
using System.Collections.Generic;
using System.Linq;

namespace baek2
{
    class Program
    {
        public static void Main()
        {
            int n = int.Parse(Console.ReadLine());
            List<double> list = new List<double>();
            Dictionary<double, double> dict = new Dictionary<double, double>();
            double sum = 0;
            for(int i = 0; i<n;i++)
            {
                double m = double.Parse(Console.ReadLine());
                list.Add(m);
                if (dict.ContainsKey(m)) dict[m]++;
                else dict.Add(m, 1);
                sum += m;
            }
            list.Sort();
            // 최빈값 구하기
            var dict2 = dict.OrderByDescending(x => x.Value).ThenBy(x => x.Key).ToDictionary(x => x.Key, x => x.Value);
            double mode = 0;
            if(dict2.Count > 1)
            {
                if (dict2.Values.ElementAt(1) == dict2.Values.ElementAt(0)) mode = dict2.Keys.ElementAt(1);
                else mode = dict2.Keys.ElementAt(0);
            }
            else mode = dict2.Keys.ElementAt(0);
            Console.WriteLine((int)Math.Round(sum / n));
            Console.WriteLine((int)list[n/2]);
            Console.WriteLine((int)mode);
            Console.Write((int)(list[n-1]-list[0]));
        }
    }
}
반응형

'코딩테스트 준비 > 백준 C#' 카테고리의 다른 글

백준 C# - 1021 +) 풀이  (0) 2024.03.31
백준 C# - 14425  (0) 2024.03.31
C# - 1966 +) 풀이  (0) 2024.03.17
백준 C# - 11286 +) 눈물의 풀이  (2) 2024.03.17
백준 C# - 1235 +) 풀이  (0) 2024.03.13

댓글