산술평균 , 중앙값, 최빈값, 최대값과 최소값의 차이 를 구하는 문제이다.
*산술평균
- 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]);
}
}
반응형
'Algorithm' 카테고리의 다른 글
[ 백준 / 1032 ] 명령 프롬프트 ( 자바 ) (0) | 2021.01.14 |
---|---|
[ 백준 / 13460 ] 구슬 탈출 2 ( 자바 ) (0) | 2021.01.14 |
[ 백준 / 1100 ] 하얀 칸 ( 자바 ) (0) | 2021.01.14 |
[ 백준 / 14500 ] 테트로미노 ( 자바 ) (0) | 2021.01.14 |
[ 백준 / 3780] 네트워크 연결 ( JAVA ) (0) | 2021.01.12 |