백준 2108번
https://www.acmicpc.net/problem/2108
수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
문제는 4가지 였다.
평균, 중앙값, 최빈값, 범위를 구해야 하기 때문에
Average
, Median
, Mode
, Range
4개의 변수를 생성했다.
평균은 double
로 값을 받아서 Math.round
함수를 이용해서 반올림만 하면 되기 때문에 간단했다.
다음 중앙값은 list
를 정렬 하고 loop
의 절반 값을 index로 주면 해당 list
의 중앙값을 구할 수 있다.
최빈값이 그나마 가장 까다로운 부분이었는데, HashMap
을 이용해서 key
를 값으로 주고 value
를 빈도수 로 정해주면 쉬웠다 어차피 key
값은 중복이 안되니까
굉장히 편했던 것 같다.
마지막 범위는 그냥 가장 작은 값과 가장 큰 값의 경우의 수만 생각하면 된다.
min
이 가장 작은수 max
가 가장 높은 수의 변수로 지정하고,
min
,max
둘다 음수 일 경우, 둘다 양수 일 경우, 둘중에 하나라도 0일 경우
또는 서로 부호가 다를 경우, 4가지 경우의 수로 지정해서 if
문으로 정리해주면 된다.
이번 문제는 비교적 Easy 했던 것 같다
예전에 풀었던 프로그래머스 체육복 문제에서 HashMap
의 사용해서 getOrDefault
를 사용해서 카운팅해봤던 경험이 진짜 크게 작용했던것 같음
최빈수 찾는게 이문제의 가장 까다로운 부분이 아닌가 생각하는데, 체육복때의 HashMap
공부가 진짜 한 건 했다.
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); List<Integer> list = new ArrayList<>(); HashMap<Integer, Integer> hashmap = new HashMap<>(); int loop = Integer.parseInt(br.readLine()); double sum = 0; for(int i=0; i<loop; i++) { int temp = Integer.parseInt(br.readLine()); sum += (double) temp; list.add(temp); } // 중앙값을 찾기 위해 미리 정렬 Collections.sort(list); int max = Collections.max(list); int min = Collections.min(list); // 둘다 음수 일 경우 if(max < 0 && min < 0) { min = Math.abs(min); } // 둘다 양수 일 경우 else if(max > 0 && min > 0) { min = min*-1; } // min, max서로 부호가 다를 때, 둘중에 하나라도 0일 때 else { max = Math.abs(max); min = Math.abs(min); } double dle = sum / loop; int Average = (int) Math.round(dle); int Median = list.get(loop/2); int Mode = 0; int Range = max + min; for(int num : list) { // 숫자가 한번 나올 때마다 1이 추가됨. hashmap.put(num, hashmap.getOrDefault(num, 0) + 1); } int numbers = 0; for(int key : hashmap.values()) { numbers = Math.max(numbers, key); } // 위에서 사용했던 list를 다시 사용하기 위해 clear 처리 // 최빈수를 구하기 최빈수와 같은 빈도의 수를 list에 삽입 list.clear(); for(int key : hashmap.keySet()) { if(hashmap.get(key) == numbers) { list.add(key); } } // 최빈수가 2개 이상일 경우 2번째로 작은 값을 뽑아내야 하기 때문에 list를 정렬 Collections.sort(list); // 최빈수와 빈도수가 같은 수가 2개 이상인경우 index 1의 값을 최빈수로 설정 // 1개일 경우는 그대로 index 0을 최빈수로 설정 if(list.size() >= 2) { Mode = list.get(1); } else { Mode = list.get(0); } System.out.println(Average); System.out.println(Median); System.out.println(Mode); System.out.println(Range); } }