[JAVA/백준] 정렬: 통계학

👀 문제

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

👊 도전

풀이 방법 1

1. 설계

  1. 산술평균은 소수점 이하 첫째 자리에서 반올림하여 출력한다.
  2. 입력받은 숫자를 배열에 넣고 오름차순 정렬하여 중앙값을 출력한다.
  3. ArrayList를 이용하여 가장 많이 나타나는 값들을 저장한 후, 두개이상이라면 두 번째로 작은 값을 출력한다.
  4. 범위는 정렬된 배열의 마지막 원소와 첫 번째 원소의 차이를 출력한다.

2. 구현 (성공 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

/**
 * 
 * @author HEESOO
 *
 */
public class Main {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();
		int[] number=new int[n];
		int[] cntArray=new int[8001];
		int sum=0, max=0;;
		int x;
		for(int i=0;i<n;i++){
			x=input.nextInt();
			number[i]=x;
			sum+=x;
			if(x<=0){
				cntArray[-x]++;
				if(cntArray[-x]>max)
					max=cntArray[-x];
			}
			else{
				cntArray[x+4000]++;
				if(cntArray[x+4000]>max)
					max=cntArray[x+4000];
			}
		}
		Arrays.sort(number);
		System.out.println(Math.round((double)sum/n));
		System.out.println(number[n/2]);
		ArrayList<Integer> list=new ArrayList<Integer>();
		for(int i=0;i<8001;i++){
			if(max==cntArray[i]){
				if(i<4001)
					list.add(-i);
				else
					list.add(i-4000);
			}
		}
		if(list.size()==1)
			System.out.println(list.get(0));
		else if(list.size()>1){
			Collections.sort(list);
			System.out.println(list.get(1));
		}
		System.out.println(number[n-1]-number[0]);
	}
	
}

 

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 산술평균
    • 숫자를 입력받을 때 sum에 값을 저장하여 총합을 구한 후, n으로 나누되 앞에 sum 또는 n을 double로 형변환하여 결과값이 소수점을 가지도록 한다.
    • Math.round()를 통해 소수점 첫째 자리에서 반올림한 값을 출력한다.
  2. 중앙값
    • 입력받은 수들을 배열에 저장하여 Arrays.sort()로 오름차순 정렬한 뒤, n/2로 중앙값을 출력한다.
  3. 최빈값
    • 처음 숫자를 입력받아 배열에 저장할 때, 가장 빈도가 높은 갯수가 얼마인지 max에 저장한다.
    • 이를 가지고 8001배열을 순회하며 max와 같은 빈도를 가지고 있는 수를 ArrayList에 저장한다.
    • 8001배열은 0은 그대로 0, 1~4000까지는 음수가 사용하고, 그 이상은 양수가 사용한다.
    • ArrayList를 사용하는 이유는, 빈도수가 max인 숫자가 몇 개인지 알 수 없기 때문에 배열을 만들 수 없기 때문이다.
    • ArrayList에 값이 하나라면 해당 값을 출력하고, 두 개 이상이라면 두 번째로 작은 값을 출력해야하므로 Collections.sort()를 통해 오름차순 정렬한 후 1번째 인덱스의 값을 출력한다.
  4. 범위
    • 정렬된 배열 number의 첫 번째 인덱스 값이 최솟값, 마지막 인덱스가 최댓값이므로 이를 이용하여 범위를 구한다.

👏 해결 완료!