문제 링크
주의사항
- JAVA를 사용하여 프로그램을 사용하였습니다.
- 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{
public static void main(String[] args){
}
}
문제 설명
접근 방법
최빈값을 구하는 부분에서 일반적인 정렬을 하면 복잡해질 수 있다고 생각하여 Counting(계수)정렬을 사용하였습니다.카운팅 정렬은 배열에 인덱스가 해당하는 숫자이며 배열에 값은 반복한 횟수를 저장하는 형식에 정렬입니다.예를 들어 0~10까지 중복되어 수를 받는다고 하면 배열[11]을 만들어서 입력되는 횟수를 배열에 저장하는 방식입니다.
- 통계학 지표들을 알 수 있는 함수 statistics를 만들었습니다.
- BufferedReader를 사용하여 입력 값을 받았습니다.
- 계수 정렬을 위하여 arr을 만들어 for문을 통해 배열에 값을 저장하였습니다.
- 산술 평균과 범위를 구하기 위하여 배열에 값을 저장할 때 같이 합과 최대값, 최소값을 구하였습니다.
- 최대값은 Math.max를 사용하였으며, 최소값은 Math.min을 사용하였습니다.
- 중앙값은 입력개수의 절반이 넘었을 때 중앙값으로 저장하도록 하였습니다.
- 최빈값은 여러개일 때를 위해 boolean형을 사용해서 구분하도록 하여 구하였습니다.
- 지표들의 값을 bw에 저장하였습니다.
- BufferedWriter를 통해 저장된 결과를 출력하였습니다.
결과 코드
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
statistics();
}
public static void statistics() throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//BufferedReader를 통해 입력 값 받기
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//BufferedWriter를 통해 결과 출력
int index = Integer.parseInt(br.readLine()); //숫자 개수
int[] arr = new int[8001];
int sum = 0, max = -4001, min = 4001;
for(int i=0;i<index;i++) { //배열 초기화 및 합/최대값/최소값 구하기
int num = Integer.parseInt(br.readLine());
sum+=num;
arr[num+4000]++;
max = Math.max(max, num);
min = Math.min(min, num);
}
bw.write(Math.round((double)sum/index) + "\n"); //산술 평균
int count=-1; //중앙값 구하기 위한 횟수
int median=0, mode=0, repeatNum = 0; //중앙값,최빈값,반복횟수
boolean check=false;
for(int i=0;i<arr.length;i++) {
if(arr[i]==0)
continue;
//중앙값 구하기
if(index==1) {
median = i-4000;
}else {
if(count<(index/2)) {
count +=arr[i];
if(count>=index/2)
median = i-4000;
}
}
//최빈값 구하기
if(check) {
if(arr[i]>repeatNum) {
repeatNum = arr[i];
mode = i-4000;
}else if(arr[i]==repeatNum) {
check = false;
mode = i-4000;
}
}
if(!check && arr[i]>repeatNum) {
check = true;
repeatNum = arr[i];
mode = i-4000;
}
}
bw.write(median + "\n"); //중앙값 저장
bw.write(mode + "\n"); //최빈값 저장
bw.write(max-min + "\n"); //범위 저장
bw.flush(); //결과 출력
bw.close();
br.close();
}
}
'백준' 카테고리의 다른 글
[백준] 단계별로 풀어보기(단계:12,정렬,JAVA)11650번, 좌표 정렬하기 (0) | 2022.01.14 |
---|---|
[백준] 단계별로 풀어보기(단계:12,정렬,JAVA)1427번, 소트인사이드 (0) | 2022.01.13 |
[백준] 단계별로 풀어보기(단계:12,정렬,JAVA)10989번, 수 정렬하기 3 (0) | 2022.01.13 |
[백준] 단계별로 풀어보기(단계:12,정렬,JAVA)2751번, 수 정렬하기 2 (0) | 2022.01.13 |
[백준] 단계별로 풀어보기(단계:12,정렬,JAVA)2750번, 수 정렬하기 (0) | 2022.01.11 |
댓글