[백준,BOJ 2108] 통계학(JAVA 구현, 재풀이)
코테/백준 온라인 저지(BOJ)

[백준,BOJ 2108] 통계학(JAVA 구현, 재풀이)

반응형

  이전에 풀었던 적이 있는 통계학 문제이다. 당시에는 다른 블로그 분의 글을 참고해서 풀었었는데, 이번엔 혼자 힘으로 풀어보았다. 그래서 그런지 코드가 좀 지저분하기는 하지만 제대로 작동하기는 한다.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

class Main {
  
  public static void main(String[] args)  {
	Scanner in = new Scanner(System.in);
	
	int n = in.nextInt(); // n개의 수
	int sum = 0; // 산술평균을 위한 합 변수
	int max = Integer.MIN_VALUE; // 최빈값을 찾기 위한 변수
	
	ArrayList<Integer> many = new ArrayList<Integer>(); // 최빈값이 여러 개일 경우 저장 할 변수
	
	int arr[] = new int[n]; // 데이터 저장 변수
	int cnt[][] = new int[4001][2]; // 데이터 등장 횟수를 저장할 배열, 2차원 배열로 양수 음수를 구분
	
	
	
	for(int i = 0 ;i<arr.length;i++) {
		arr[i] = in.nextInt(); // 데이터 입력
		if(arr[i]>0) // 데이터가 양수이면
			cnt[arr[i]][0]++; // 0번째 열에 데이터를 저장
		else // 음수이면
			cnt[Math.abs(arr[i])][1]++; // 1번째 열에 데이터를 저장
	}
	 
	Arrays.sort(arr); // 데이터가 저장된 배열을 오름차순 정렬
	
	//  산술 평균
	for(int i =0;i<arr.length;i++) {
		sum+=arr[i]; // 데이터의 합
	}
	System.out.println(Math.round((double)sum/n)); // 실수형으로 산술평균을 구한 뒤 반올림 처리
	
    // 중앙값	
	System.out.println(arr[arr.length/2]); // n이 홀수이기 때문에 중앙값은 데이터의 수 / 2를하면 해당 인덱스가 나온다.
	
	
	// 최빈값
	for(int i =0;i<cnt.length;i++) { // 등장횟수 배열을 탐색해 최빈값에 해당하는 등장횟수를 구한다.
		for(int j=0;j<cnt[i].length;j++) {
			if(cnt[i][j] == 0) continue;
			if(cnt[i][j]>max) {
				max = cnt[i][j];				
			}
		}
	}
    
	for(int i =0;i<cnt.length;i++) { // 다시 한 번 탐색해 위에서 구한 최빈값의 등장횟수와 일치하는 경우를 찾는다.
		for(int j=0;j<cnt[i].length;j++) {
			if(cnt[i][j] == 0) continue; // 데이터가 0인건 고려할 필요 없으므로 넘기고
			if(cnt[i][j]==max) { // 최빈값일 경우
				if(j==0) // 양수는 그대로 arrayList에 저장
					many.add(i);
				else // 음수일 경우 -1을 곱해주고 arrayList에 저장
					many.add(i * -1);
			}
		}
	}
    
	Collections.sort(many); // arrayList를 정렬한 뒤
	
	if(many.size()>1) // 최빈값이 1개 이상일 경우
		System.out.println(many.get(1)); // 정렬되어있기 때문에 1번 인덱스가 두 번째로 작은 최빈값이 된다.
	else // 최빈값이 1개인 경우는 0번 인덱스를 그대로 출력하면 된다.
		System.out.println(many.get(0));
	
    // 범위
	System.out.println(arr[arr.length-1] - arr[0]); // 정렬된 데이터 배열의 최대값과 최솟값을 빼주면 된다.
    
  }
}

  주의해야 할 점은 최빈값이 여러 개일 경우 두 번째로 작은 값을 출력해야 한다는 점이다. 필자는 이를 위해 최빈값을 별도의 ArrayList에 저장하여 두 번째로 작은 경우를 찾는 방식으로 풀이했다. 

반응형