https://www.acmicpc.net/problem/2108
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 {
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] counting = new int[8001]; //0~8000 -> 1~4000 음수, 4001~8000 양수
int sum = 0;
int max = -4000;
int min = 4001;
//카운팅 배열 생성
for(int i=0; i<N; i++){
int index = Integer.parseInt(br.readLine());
//합
sum += index;
//최댓값
max = Math.max(max, index);
//최솟값
min = Math.min(min, index);
//1~8000
//음수: 인덱스 0~3999 / 0: 인덱스 4000 / 양수 : 인덱스 4001~8000
index += 4000;
counting[index]++;
}
//산술평균
int mean = (int)Math.round((double)sum/N);
//중앙값
// N/2+1 번째 수가 필요?
int medianIndex = 0;
int median =0;
for(int i=0; i<8001; i++){
medianIndex += counting[i];
if(medianIndex >= N/2+1) {
median = i;
break;
}
}
median -= 4000;
//최빈값
// 문제 발생, 1~4000에 -를 곱하면 크기 순서가 역순이 되어버림. 최빈값 두 번째 출력에 문제가 생긴다.
int mode = 0;
int modeIndex = 0;
for(int i=0; i<8001; i++){
modeIndex = Math.max(counting[i], modeIndex);
}
int modeCount = 0;
for(int i=0; i<8001; i++){
if(counting[i] == modeIndex){
mode = i;
modeCount++;
if(modeCount == 2) break;
}
}
mode -= 4000;
//범위
int range = max - min;
//출력
StringBuilder sb = new StringBuilder();
sb.append(mean).append("\n")
.append(median).append("\n")
.append(mode).append("\n")
.append(range);
System.out.println(sb);
}
}
그냥 풀기 위한 코드를 무작정 썼는데, 많이 틀리고 시간도 오래걸리고 코드도 지저분하고... 자괴감이 든다. 참고도 안하고 풀어서 좋은 방법인지 내일 확인해야겠다. 다음엔 더 빨리 풀어봐야겠다.
계수 정렬 중간단계에서 풀어버린 느낌인데 뭔지 모르겠다.
'알고리즘 > 백준' 카테고리의 다른 글
백준 11650번 - 좌표 정렬하기 (Java 8) (0) | 2022.03.04 |
---|---|
백준 1427번 - 소트인사이드 (Java 8) (0) | 2022.03.04 |
백준 10989번 - 수 정렬하기 3 (Java 8) (0) | 2022.03.03 |
백준 2751번 - 수 정렬하기 2 (Java 8) (0) | 2022.03.02 |
백준 2750번 : 수 정렬하기 (Java 8) (0) | 2022.03.02 |
댓글