4개의 통계값을 출력하는 문제입니다
산술평균 = (전체합)/(표본 수) 반올림함수를 이용합시다
중앙값 = sort하여 중앙에 있는 값을 출력합시다
최빈값 = "가장 많이 나온 값" 여러개인경우 "두번째로 작은 값" <-어려운 부분이네요
범위 = sort하거나 입력할때 min max를 찾읍시다
코드입니다
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
ArrayList<Integer> numbers = new ArrayList<>();
int sum=0;
for(int i=0; i<n; i++) {
int t = scan.nextInt();
numbers.add(t);
sum += t;
}
double average = (double) sum / n;
double roundedAverage = Math.round(average);
Collections.sort(numbers);
int length = numbers.get(n-1) - numbers.get(0);
Map<Integer, Integer> frequencyMap = new HashMap<>();
for (int num : numbers) {
frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
}
int mode = 0;
int maxFrequency = 0;
for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) {
int num = entry.getKey();
int frequency = entry.getValue();
if (frequency > maxFrequency) {
maxFrequency = frequency;
mode = num;
}
}
int secondSmallestMode = findSecondSmallestMode(numbers);
System.out.println((int)roundedAverage);
System.out.println(numbers.get((n-1)/2));
System.out.println(secondSmallestMode);
System.out.println(length);
}
public static int findSecondSmallestMode(ArrayList<Integer> numbers) {
Map<Integer, Integer> frequencyMap = new HashMap<>();
for (int num : numbers) {
frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
}
int maxFrequency = 0;
for (int frequency : frequencyMap.values()) {
if (frequency > maxFrequency) {
maxFrequency = frequency;
}
}
List<Integer> modes = new ArrayList<>();
for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) {
int num = entry.getKey();
int frequency = entry.getValue();
if (frequency == maxFrequency) {
modes.add(num);
}
}
if (modes.size() == 1) {
return modes.get(0);
}else {
modes.sort(null);
return modes.get(1);
}
}
}
findSecondSmallestMode 함수가 두번째로 작은 최빈값을 구하는 함수입니다
frequencyMap으로 빈도수를 체크합니다
최대값을 찾은 다음
List<Integer> modes = new ArrayList<>();
에 최대값을 갖는 수들을 넣어줍니다
modes.size() == 1
최빈값을 갖는 수가 1개인 경우
else 라면
sort하고 get(1)을 합니다
컴퓨터는 0부터 시작하기 때문에
1이 두번째로 작은 값 입니다
'백준 문제풀기 > JAVA' 카테고리의 다른 글
[백준 2204 JAVA 자바] 도비의 난독증 테스트 (0) | 2023.07.31 |
---|---|
[백준 2164 JAVA 자바] 카드2 (0) | 2023.07.31 |
[백준 1009 JAVA 자바] 분산처리 (0) | 2023.07.31 |
[백준 1978 JAVA 자바] 소수 찾기 (0) | 2023.07.31 |
[백준 1934 JAVA 자바] 최소공배수 (0) | 2023.07.31 |