728x90
반응형
정말 문제 그대로 - 산술평균, 중앙값, 최빈값, 범위를 구하는 문제
좀 헷갈렸던 포인트
- 출력에서 최빈값을 출력하는 것이 좀 까다로웠다. 두 번째로 작은 값을 출력해야한다고 해서
array 를 다시 만들어서 값을 집어 넣어야하는지 혹은 이게 두 번째인지 아닌지 확인하는 방법을 생각하기가 어려웠다.- Solution : flag 를 사용하여 해당 count 가 두번째인지 아닌지 체크할 수 있다.
- 또한, 중간값 구하는 것도 헷갈렸는데 이 역시 처음에 break; 로 해서 나오는 걸로 했는데
이게 아니라 flag 를 통해서 middleValue 가 구해지면 바로 해당 value 저장만 하고
그대로 계속 진행하는 걸로 고쳤다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// counting 정렬을 이용해서 풀어보기.
// 풀어야할 것. 산술평균 ( O ) , 최빈값, , 범위
int N = Integer.parseInt(br.readLine());
int[] cnt = new int[8001]; // 정수의 절대값은 -4000~에서 4000까지 n=4000 이 0 으로 기준점.
int sum = 0;
int max=-4001;
int min=4001;
for (int i = 0; i < N; i++) {
int T = Integer.parseInt(br.readLine());
// 저장 완료
cnt[(T+4000)]++;
sum+=T;
if(max<T) {
max = T;
}
if (min > T) {
min = T;
}
}
// 저장된 cnt 배열에서 산술평균, 중앙값, 최빈값, 범위 등을 구하기.
// 최빈값은 여기서~
int maxFreq=0;
// count 정렬 다 합친 것 구하기.
int cntSum=0;
int[] arr = new int[8001];
double overMiddle = (double)(Math.ceil((double) N/2));
// System.out.println("N = " + N/2);
// System.out.println("overMiddle = " + overMiddle);
int middleValue=0;
int cntMax=0;
int cntValue = 0;
int modeValue = 0;
boolean middleFlag = false;
boolean modeFlag = false; // 최빈값 두번 이상 나올경우를 고려해주어야 하므로
for(int i =0; i<8001; i++) {
if(cnt[i]>0) {
cntSum+=cnt[i];
if(overMiddle <= cntSum && middleFlag!= true) {
middleValue = i-4000;
middleFlag = true;
}
if(cntMax < cnt[i]) {
cntMax = cnt[i];
modeFlag = true;
modeValue = i-4000;
}
else if(cntMax == cnt[i] && modeFlag == true) {
// 2 번째 값 저장
modeFlag = false;
modeValue = i-4000;
}
}
}
// 산술평균
System.out.println((int)(Math.round((double) sum/N)));
// 중앙값
System.out.println(middleValue);
// 최빈값
System.out.println(modeValue);
// 범위
System.out.println((max-min));
}
}
728x90
반응형
'이유's STUDY > 알고리즘 문제풀이' 카테고리의 다른 글
[ 백준 ] 11651- 좌표 정렬하기 2 (0) | 2021.07.27 |
---|---|
[ 백준 ] 11650 - 좌표 정렬하기, Java 이용 (0) | 2021.07.27 |
[ 백준 ] 10989번 수 정렬하기3 / [ Java 이용 ] (0) | 2021.07.25 |
[ 백준 ] 2751번 - 수 정렬하기2 / [Java 이용 ] (0) | 2021.07.25 |
[ 백준 ] 2750번 수 정렬하기 - Java 이용 (0) | 2021.07.22 |