[백준] 2108

당당·2023년 5월 11일
0

백준

목록 보기
96/179

https://www.acmicpc.net/problem/2108

📔문제

수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
  4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이

N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.


📝입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.


📺출력

첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.


📝예제 입력 1

5
1
3
8
-2
2

📺예제 출력 1

2
2
1
10

📝예제 입력 2

1
4000

📺예제 출력 2

4000
4000
4000
0

📝예제 입력 3

5
-1
-2
-3
-1
-2

📺예제 출력 3

-2
-2
-1
2

📝예제 입력 4

3
0
0
-1

📺예제 출력 4

0
0
0
1

(0 + 0 + (-1)) / 3 = -0.333333... 이고 이를 첫째 자리에서 반올림하면 0이다. -0으로 출력하면 안된다.


🔍출처

-데이터를 추가한 사람: bjh3502, bsyun0571, djm03178, jungyh1509, kongum, palilo, YunGoon
-문제의 오타를 찾은 사람: jh05013, skynet


🧮알고리즘 분류

  • 수학
  • 구현
  • 정렬

📃소스 코드

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.*;

public class Code2108 {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();
        HashMap<Integer,Integer> map =new HashMap<>();
        int sum=0;


        int[] num=new int[N];
        for(int i=0;i<N;i++){
            num[i]=sc.nextInt();
            sum+=num[i];
            map.put(num[i],0);//최빈값 탐색을 위함
        }

        for(int i=0;i<N;i++){
            map.put(num[i],map.get(num[i])+1);
        }

        int max=0;
        for(int i=0;i<N;i++){
            if(max<map.get(num[i])){//값이 max보다 크면
                max=map.get(num[i]);
            }
        }

        HashSet<Integer> maxs=new HashSet<>();
        int count=0;
        for(int i=0;i<N;i++){
            if(max==map.get(num[i])){
                maxs.add(num[i]); //3이 3번 들어가도 3 하나만 있음
            }
        }

        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        double first=(double)sum/(double)N;
        int t=0;
        if(first<0){
            if(Math.abs(first)-Math.abs((int)first)>=0.5){
               t=(int)first-1;
            }
            else{
                t=(int)first;
            }
        }
        else{
            t= (int) Math.round(first);
        }
        bw.write(String.valueOf(t)+"\n"); //산술평균
        Arrays.sort(num);
        bw.write(String.valueOf(num[N/2])+"\n");

        ArrayList<Integer> so=new ArrayList<>(maxs);
        Collections.sort(so);
        if(so.size()>=2){
            bw.write(String.valueOf(so.get(1))+"\n");
        }
        else{
            bw.write(String .valueOf(so.get(0))+"\n");
        }

        int n=num[num.length-1]-num[0];
        bw.write(String.valueOf(n));

        bw.flush();
        bw.close();

    }
}


📰출력 결과


📂고찰

자바의 round함수 때문에 얘들이 -3.5-3으로 반올림 해서 (원래는 -4) 그거에 대한 조건을 추가하느라 좀 헤맸다.

최빈값은 HashSet을 이용했고, ArrayList에 저장해서 추출했다.

profile
MySQL DBA 신입 지원

0개의 댓글