본문 바로가기
백준

[백준] 단계별로 풀어보기(단계:12,정렬,JAVA)2108번,통계학

by 열정적인 이찬형 2022. 1. 13.

문제 링크

2108번: 통계학
 
www.acmicpc.net

주의사항

  • 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();	
	}
}

댓글