728x90
https://www.acmicpc.net/problem/2108
조건
N은 홀수
average 평균
중앙값은 나열했을 때 가운데 값
최빈값 : 가장 빈도가 많은 값 && 여러 숫자일 경우 두번째로 작은 값
최대 - 최소
- <평균>
이번에는 stream을 이용해서 배열의 합을 쉽게 구해주었다.
double sum = Arrays.stream(array).sum();
if (avg < 0) {
// 반올림하는 Math.round함수
return (int) Math.round(Math.abs(avg) * -1); 평균이 음수일때는 반올림 해줘서 근사값을 구해줘야한다.
} else {
return (int) Math.round(avg);
}
- <최빈값>
최빈값 구하는게 헷갈리는 문제였다.
우선 나는 해시맵을 사용해서 얼만큼 나왔는지를 구해줬다.
Map<Integer, Integer> mp = new HashMap<>();
if (N == 1) {
return array[0];
}
for (int i = 0; i < N; i++) {
if (mp.containsKey(array[i])) {
mp.put(array[i], mp.get(array[i]) + 1);
} else {
mp.put(array[i], 1);
}
}
원소가 하나라면 최빈값을 구할 필요가 없으므로 원소 하나를 return해준다
그리고 그 map안의 가장 큰 값을 찾아준다. 만약 큰 value를 갖고 있는것이 여러개일 수 있으므로 key값을 arrayList안에 넣어줬다. 그리고 arrayList를 오름차순으로 정렬해준다.
만약, arrayList안의 원소가 하나라면( 가장 많이 나온 값이 하나라면) 첫번째 원소를 보내준다.
arrayList안의 원소가 여러개라면 arrayList.get(1)로 가장 많이 나온 값 중 두번째 작은 값을 보내준다.
int maxValue = Collections.max(mp.values());
ArrayList<Integer> arrayList = new ArrayList<>();
// 가장 많이 나온 값
for (Map.Entry<Integer, Integer> m : mp.entrySet()) {
if (m.getValue() == maxValue) {
arrayList.add(m.getKey());
}
}
Collections.sort(arrayList);
// 가장 많이 나온 값이 여러개일 경우 두번째로 작은 값
if (arrayList.size() > 1)
return arrayList.get(1);
else // 가장 많이 나온 값이 하나면
return arrayList.get(0);
package 통계학;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static int N;
public static int[] array;
public static int getAverage() {
// 배열을 다 합해주는 stream
double sum = Arrays.stream(array).sum();
double avg = (double) sum / N;
if (avg < 0) {
// 반올림하는 Math.round함수
return (int) Math.round(Math.abs(avg) * -1);
} else {
return (int) Math.round(avg);
}
}
public static int countFreq() {
Map<Integer, Integer> mp = new HashMap<>();
if (N == 1) {
return array[0];
}
for (int i = 0; i < N; i++) {
if (mp.containsKey(array[i])) {
mp.put(array[i], mp.get(array[i]) + 1);
} else {
mp.put(array[i], 1);
}
}
int maxValue = Collections.max(mp.values());
ArrayList<Integer> arrayList = new ArrayList<>();
// 가장 많이 나온 값
for (Map.Entry<Integer, Integer> m : mp.entrySet()) {
if (m.getValue() == maxValue) {
arrayList.add(m.getKey());
}
}
Collections.sort(arrayList);
// 가장 많이 나온 값이 여러개일 경우 두번째로 작은 값
if (arrayList.size() > 1)
return arrayList.get(1);
else // 가장 많이 나온 값이 하나면
return arrayList.get(0);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
N = scan.nextInt();
array = new int[N];
for (int i = 0; i < N; i++) {
array[i] = scan.nextInt();
}
// 산술평균
System.out.println(getAverage());
Arrays.sort(array);
// 중앙값
System.out.println(array[N / 2]);
// 최빈값
System.out.println(countFreq());
// 범위
System.out.println(array[N - 1] - array[0]);
scan.close();
}
}
728x90
'CS > Algorithm' 카테고리의 다른 글
[ JAVA / 백준 : 11723] 집합 (0) | 2021.07.30 |
---|---|
[ JAVA / 백준 : 7568 ] 덩치 (0) | 2021.07.30 |
[JAVA / 백준 : 2941] 크로아티아 알파벳 (0) | 2021.07.28 |
[JAVA / 백준 : 4673] 셀프넘버 (0) | 2021.07.28 |
[JAVA / 백준 : 10775] 공항 (0) | 2021.07.25 |