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