반응형
https://www.acmicpc.net/problem/2108
위의 문제는 BaekJoon Online Judge의 단계별로 풀어보기 중 12단계
정렬의 카테고리에 포함되어 있는 문제이다.
정답률이 27.050%인 문제로 12단계의 정렬 카테고리에 포함된 문제 중
2번 째로 정답률이 낮은 문제이다.
나는 이 카테고리에서 이 문제를 가장 마지막에 풀었으며
정렬 카테고리 문제의 난이도 중에서 가장 어렵다고 생각한다.
N개의 입력된 수로 산술평균, 중앙값, 최빈값, 범위 4가지를 구해야 하기 때문이다.
말하자면 4가지의 문제를 한번에 푸는 것과 같다.
조금 난잡하게 풀었다고 생각한 만큼 메모리와 시간을 남들보다 많이 사용하였다.
나중에 시간날 때, 그리고 실력이 늘었다고 생각될 때 천천히 고쳐봐야겠다.
import java.util.Scanner;
import java.util.Arrays;//정렬
public class Question_2108 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int Total = 0;
int[] Result = new int[4]; // 1.산술평균, 2.중앙값, 3.최빈값, 4.범위
int[] Int_Arrays = new int[N]; // 수의 개수
int[] Much_Number = new int[8001]; // 최빈값을 계산하기 위한 배열
// 음수범위의 배열은 없으므로 -4000 ~ 4000 을 0 ~ 8000으로 바꿔서 계산.
for(int i = 0; i < N; i++) {
Int_Arrays[i] = sc.nextInt();
Total += Int_Arrays[i]; // 입력과 동시에 수들의 총 합을 계산.
Much_Number[Int_Arrays[i] + 4000]++; // 동시에 최빈값도 계산.
}
int min = 0;
for(int i = 0; i < Much_Number.length; i++) {
if(min < Much_Number[i]) {
min = Much_Number[i]; // 최빈값을 계산한다.
}
}
int[] two_min = new int[2]; // 가장 많이 나타나는 값이 여러 개일 경우를 위한 배열
int j = 0;
for(int i = 0; i < Much_Number.length; i++) {
if(two_min[0] != 0 && two_min[1] != 0)
break;
if(min == Much_Number[i]) {
two_min[j] = i;
j++;
}
} // 최빈값중 두 번째로 작은 값을 넣기위함.
if(two_min[1] == 0)
two_min[1] = two_min[0];
Arrays.sort(Int_Arrays); // 정렬
Result[0] = (int) Math.round((double)Total / N); // 산술평균
Result[1] = Int_Arrays[N/2]; // 중앙값
Result[2] = two_min[1] - 4000; // 최빈값
Result[3] = Int_Arrays[N-1] - Int_Arrays[0]; // 범위
System.out.println(Result[0]);
System.out.println(Result[1]);
System.out.println(Result[2]);
System.out.println(Result[3]);
}
}
반응형
'BaekJoon' 카테고리의 다른 글
[백준] 9461번 : 파도반 수열(JAVA) (0) | 2019.12.01 |
---|---|
[백준] 1904번 : 01타일(JAVA) (0) | 2019.11.30 |
[백준] 1003번 : 피보나치 함수(JAVA) (0) | 2019.11.28 |
[백준] 3036번 : 링(JAVA) (0) | 2019.11.28 |
[백준] 2609번 : 최대공약수와 최소공배수(JAVA) (0) | 2019.11.27 |
댓글