문제
https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
풀이
- 산술평균
- 더해서 나누면 되는데, -1.8인 경우 반올림하면 -1이아닌 -2가 되어야함. 이 부분을 처리하기 위해 나는 나눈 값 절대값으로 바꾼 뒤,
Math.round
를 이용 - 오랜만에 자바를 해서 그런지 나눌때 auto casting되는걸 까먹었당. int / int => int가 된다. 그래서 피연산자 둘중 하나를 명시적으로 double로 casting 후 나눠야한다.
- 중앙값
- ArrayList를 이용해 Collections sort 로 정렬후 중앙값 추출(N: 무조건 홀수)
- 최빈값
- Map을 이용해서 풀었다. Map의 key는 입력받은 수이고, value는 해당 key의 빈도 수를 저장함.
- 문제를 꼼꼼히 읽지않아, 최빈값이 여러개 일 때, 두번째로 큰 값을 출력하는걸 몰랐다.
- 범위
- 위의 정렬된 ArrayList를 재사용함
코드
package baekjoon.구현;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main2108 {
static int N;
static List<Integer> list = new ArrayList<>();
static Map<Integer, Integer> map = new HashMap<>();
static int maxCount = 0;
static int maxKey = -10000;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
for(int i = 0; i < N; i++){
int value = Integer.parseInt(br.readLine());
list.add(value);
if(map.containsKey(value)){
map.put(value, map.get(value) + 1);
}else{
map.put(value, 1);
}
}
Collections.sort(list);
findMaxCountAndMaxKey();
List<Integer> maxLists = getMaxCount();
int sum = list.stream().mapToInt(Integer::intValue).sum();
if(sum < 0){
double result = (double)sum / N;
double value = Math.abs(result);
System.out.println(Math.round(value) * -1);
}else{
System.out.println(Math.round((double)sum / N));
}
System.out.println(list.get(N / 2));
if(maxLists.size() == 1){
System.out.println(maxLists.get(0));
}else{
System.out.println(maxLists.get(1));
}
System.out.println(list.get(N - 1) - list.get(0));
}
static void findMaxCountAndMaxKey(){
for(Map.Entry<Integer, Integer> entry: map.entrySet()){
int value = entry.getValue();
int key = entry.getKey();
if(maxCount < value){
maxCount = value;
maxKey = key;
}
}
}
static List<Integer> getMaxCount(){
List<Integer> maxLists = new ArrayList<>();
for(Map.Entry<Integer, Integer> entry: map.entrySet()){
Integer value = entry.getValue();
if(value == maxCount){
maxLists.add(entry.getKey());
}
}
Collections.sort(maxLists);
return maxLists;
}
}
'algorithm' 카테고리의 다른 글
백준 11723(JAVA) (0) | 2022.06.13 |
---|---|
백준 3980(JAVA) (0) | 2021.11.01 |
백준 2661(JAVA) (0) | 2021.10.31 |
백준 1174(JAVA) (0) | 2021.10.17 |
백준 16987(JAVA) (0) | 2021.10.12 |