https://www.acmicpc.net/problem/2108
[풀이]
(average) : 평균을 계산해야하므로 double형을 사용해야 한다. 이후, 반올림을 사용해서 값을 반환하면 된다.
(median) : 중위수를 계산한다. 리스트 크기의 반에 해당하는 인덱스를 반환하면 된다.
(mode) : 최빈수를 계산한다. 이 부분이 문제를 푸는 가장 어려운 부분..?? 이었다. 과정을 하나씩 살펴보면
- 입력 받은 값이 음수일 경우 절대값, 그리고 4000을 더해야한다. (제한 사항으로 4000보다 작은 수가 나오기 때문이다.)
- 최빈수를 찾을 수 있도록 배열을 하나 만든 후, 최빈수 값을 찾는다.
- 이후, 음수를 변환한 방식 그대로 다시 음수로 만든 후, 최빈수일 경우 반환할 리스트에 담는다. 양수는 그대로 리스트에 담는다.
- 리스트의 사이즈가 2개 이상일 경우 2번째 값을, 하나의 값일 경우 첫번째 값을 반환한다.
(range) : 범위는 가장 큰 값에서 가장 작은 값을 뺀 값을 반환한다.
[주의할 점]
문제를 시도한 사람 대부분이 아마 최빈수를 구하는 것이 어려웠을 것 같다. 음수에 대한 인덱스를 체크하는 것이 첫번째 어려운 부분, 그리고 최빈수의 값을 구하는 부분이 두번째, 마지막으로 반환할 값에 답을 담을 수 있도록 하는 과정이 어려웠다고 생각한다. 음수를 해결하는 방법을 생각해보는 것이 중요하다고 생각한다!
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
static int average(List<Integer> list) {
double result = 0;
double sum = 0;
for (int value : list) {
sum += value;
}
result = Math.round(sum / list.size());
return (int) Math.ceil(result);
}
static int median(List<Integer> list) {
return list.get(list.size() / 2);
}
static int mode(List<Integer> list) {
int[] count = new int[8001];
List<Integer> result_list = new ArrayList<>();
int max_value = -1;
for (int value : list) {
if (value < 0) {
count[Math.abs(value) + 4000]++;
} else {
count[value]++;
}
}
for (int i = 0; i < count.length; i++) {
if (count[i] != 0 && count[i] > max_value) {
max_value = count[i];
}
}
for (int i = 0; i < count.length; i++) {
int temp_value = i;
if (count[i] == max_value) {
if (i <= 4000) {
result_list.add(i);
} else {
temp_value -= 4000;
temp_value *= -1;
result_list.add(temp_value);
}
}
}
Collections.sort(result_list);
if (result_list.size() > 1) {
return result_list.get(1);
} else {
return result_list.get(0);
}
}
static int range(List<Integer> list) {
return list.get(list.size() - 1) - list.get(0);
}
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(bf.readLine());
List<Integer> arr = new ArrayList<>();
for (int i = 0; i < N; i++) {
arr.add(Integer.parseInt(bf.readLine()));
}
Collections.sort(arr);
int average = average(arr);
int median = median(arr);
int mode = mode(arr);
int range = range(arr);
System.out.println(average);
System.out.println(median);
System.out.println(mode);
System.out.println(range);
}
}
'Algorithm > 백준' 카테고리의 다른 글
백준 1874번 : 스택 수열(Java) (0) | 2021.08.01 |
---|---|
백준 11279번 : 최대 힙(Java) (0) | 2021.08.01 |
백준 2941번 : 크로아티아 알파벳(Java) (0) | 2021.07.30 |
백준 3085번 : 사탕 게임(Java) (0) | 2021.07.29 |
백준 11719번 : 그대로 출력하기 2(Java) (0) | 2021.07.28 |