티스토리 뷰

728x90

문제

- N은 홀수

- N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램

   1. 산술평균 : N개의 수들의 합을 N으로 나눈 값

   2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값

   3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값

   4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이

- 산술평균은 소수점 이하 첫째 자리에서 반올림한 값을 출력

- 최빈값이 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력

 

해결방법

1. 산술평균 - 숫자들을 입력 받으면서 sum 변수를 두어 모든 합을 저장해두고 sum을 주어진 입력의 개수로 나누어 평균을 구할 수 있도록 하였다. 이 때, 소수점 이하 첫째 자리에서 반올림한 값을 출력하라고 하여 Math.round() 메서드를 이용하여 반올림할 수 있도록 하였다.

2. 중앙값 - 입력받은 배열을 정렬시킨 뒤 해당 배열 내에서 중앙값을 찾아 출력하였다.

3. 최빈값 - 2차원 배열을 두어 음수, 양수를 구분하여 빈도수를 체크할 수 있는 배열을 하나 생성하였고, 숫자를 입력받으면서 음수, 양수에 따라 행을 다르게, 입력된 숫자에 따라 열을 다르게 하여 빈도수를 체크할 수 있도록 하였다. 이렇게 체크된 빈도수를 가지고 전체를 탐색하면서 빈도수가 가장 큰 값을 찾아낼 수 있도록 하였다.

4. 범위 - 입력받은 배열을 정렬시킨 뒤 해당 배열 내에서 최댓값과 최솟값을 구해 그 차이를 출력하였다.

 

코드

import java.io.*;
import java.util.*;

class Main{
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(br.readLine());    // 숫자의 개수
        int[] nums = new int[N];                    // 입력받은 숫자 배열
        int[][] check = new int[4001][2];           // 빈도 수 체크 배열(0: 음수 관리 / 1: 양수 관리)
        int sum = 0;        // 숫자 합
        int max = 0;        // 빈도 수 최댓값

        for(int i = 0; i<N; i++){
            nums[i] = Integer.parseInt(br.readLine());    // 각각의 숫자를 입력 받음
            sum += nums[i];        			  // 산술평균을 구하기 위해 숫자들의 합을 구함
           
            if(nums[i] < 0) {    			// 입력받은 숫자가 음수라면
                check[Math.abs(nums[i])][0]++;    	// 빈도 수 체크 배열 첫 번째 행(0)에 관리
                // 최빈값을 찾는 것이므로 빈도 수 최댓값을 갱신할 수 있도록 함
                if(max < check[Math.abs(nums[i])][0]) max = check[Math.abs(nums[i])][0];
            }
            else if(nums[i] >= 0) {    		// 입력받은 숫자가 양수라면
                check[nums[i]][1]++;    	// 빈도 수 체크 배열 두 번째 행(1)에 관리
                // 최빈값을 찾는 것이므로 빈도 수 최댓값을 갱신할 수 있도록 함
                if(max < check[nums[i]][1]) max = check[nums[i]][1];
            }
        }
        
        // 중앙값과 범위를 구하기 위해 배열을 정렬
        Arrays.sort(nums);
        
        // 1. 산술평균 구하기
        // Math.round() 메서드를 이용하여 반올림
        sb.append(Math.round((double) sum / N)).append("\n");
        
        // 2. 중앙값 구하기
        // 정렬된 배열 내에서 중앙값을 찾아 출력
        sb.append(nums[N/2]).append("\n");
        
        // 3. 최빈값 구하기
        int count = 0;    	// 최빈값이 여러 개라면 두 번째로 작은 값을 출력해야하므로 카운팅
        int num = 0;        	// 최빈값 저장 변수
        
        // 음수일 경우
        for(int i = 4000; i>=0; i--){
            if(check[i][0] == max){    	// 빈도수가 최대라면
                num = -i;        	// 음수로 최빈값 변수에 저장
                count++;        	// 최빈값 카운팅
            }
            if(count >=2) break;    // 두 번째로 작은 최빈값이라면 break;
        }

        if(count<2){        // 두 번째로 작은 최빈값을 찾은 것이라면 양수일 경우를 고려할 필요가 없음
            // 양수일 경우
            for(int i = 0; i<4001; i++){
                if(check[i][1] == max){    	// 빈도수가 최대라면
                    num = i;        		// 최빈값 변수에 저장
                    count++;        		// 최빈값 카운팅
                }
                if(count >=2) break;    // 두 번째로 작은 최빈값이라면 break;
            }
        }
        // 최빈값 출력
        sb.append(num).append("\n");
        
        // 4. 범위 구하기
        // 정렬된 배열 내에서 최댓값과 최솟값을 구해 그 차이를 구함
        sb.append(nums[N-1]-nums[0]).append("\n");

        System.out.println(sb);
        br.close();
    }
}
728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

[백준] 2231번 분해합(JAVA)  (0) 2022.07.17
[백준] 2164번 카드2(JAVA)  (0) 2022.07.17
[백준] 1978번 소수 찾기(JAVA)  (0) 2022.07.14
[백준] 1966번 프린터 큐(JAVA)  (0) 2022.07.13
[백준] 1929번 소수 구하기(JAVA)  (0) 2022.07.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday