본문 바로가기

Algorithm

[ 백준 / 2108 ] 통계학 ( 자바 )

728x90
반응형

www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

 

 

산술평균 , 중앙값, 최빈값, 최대값과 최소값의 차이 를 구하는 문제이다.

 

*산술평균

- Math.round() 를 사용했다. 이것은 소수점 첫째자리에서 반올림하여 숫자를 만들어준다. 이와 같은 방법으로 소수점 첫째자리까지, 둘째자리까지 등등으로 만들 수 있다.

 

Math.round(sum) : 소수점 첫째자리에서 반올림

Math.round(sum*10/10.0) : 소수점 둘째자리에서 반올림

Math.round(sum*100/100.0) : 소수점 셋째자리에서 반올림

 

sum은 float보다는 double을 사용하도록 한다. 이 문제도 float를 double로 수정하였더니 맞았다.

 

*중앙값

Arrays.sort()를 통해 오름차순을 만들고 중앙값을 출력하였다.

 

*최빈값

map.merge() 메소드를 사용하였다. 여기서 Integer::sum을 통해 값에 대해서 계속 value를 1씩 증가시켰다.

이후 map을 순회하면서 가장 많이 나타나는 값을 answer로 저장하는데, 혹시 중복이 될 수 있으므로 list에 저정한다.

중복이면 list.get(1)을, 1개이면 list.get(0)으로 답을 출력한다.

 

*범위

이 또한 위에서 이용한 Arrays.sort()를 통해서 맨 뒤에값-맨 앞의값 을 통해서 출력하였다.

 

시간복잡도가 썩 맘에 들지는 않았지만 그렇다고 잘못된 방법이라고 생각하지 않는다. 특히 3번에서 이용한 map.merge()는 여러 문제에서 쏠쏠하게 이용하고 있다.

 

 

import java.util.*;
//2108 통계학
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		
		int[] array = new int[N];
		for(int i=0;i<N;i++) {
			array[i] = sc.nextInt();
		}
		
		Arrays.sort(array);
		
		float sum=0;
		for(int i=0;i<N;i++) {
			sum +=array[i];
		}
		
		System.out.println(Math.round(sum/N));
		System.out.println(array[N/2]);
		
		Map<Integer,Integer> map = new HashMap<>();
		for(int i=0;i<N;i++) {
			map.merge(array[i], 1, Integer::sum);
		}
		
		int ans = 0;
		List<Integer> list = new ArrayList<>();
		for(int key : map.keySet()) {
			if(map.get(key)>=ans) { //횟수가 같거나 많을 때
				if(map.get(key)==ans) list.add(key); //똑같으면 추가
				else { //많으면 list clear 이후 최신화
					list.clear();
					list.add(key);
					ans = map.get(key);
				}
			}
		}
		Collections.sort(list);
		
		if(list.size()==1) {
			System.out.println(list.get(0));
		} else {
			System.out.println(list.get(1));
		}
		
		System.out.println(array[N-1]-array[0]);
	}

}
728x90
반응형