본문 바로가기
알고리즘/백준

백준 2108번 자바 java

by 클로드 2020. 12. 24.
반응형

문제

www.acmicpc.net/problem/2108

 

풀이

산술평균, 중앙값, 범위의 값을 구현하는 코드는 간단하지만

최빈값을 구현하는게 조건 때문에 까다로웠다 (양수와 음수 입력 값, 중복되는 입력값과 갯수를 카운팅, 갯수가 같다면 두번째로 작은 값을 출력)

 

산술평균

산술평균 값 = 입력 값의 총합 / 입력 값 갯수

 

중앙값

중앙값은 입력 값의 배열을 오름차순으로 정렬한 다음

인덱스값을 2로 나눈 값을 출력

 

최빈값

양수, 음수의 입력 값의 빈도를 담을 배열을 생성하고 입력할때 배열에 넣어줍니다 (countPlusNum, countMinusNum)

 

빈도수가 같은 값들만 비교하기 위해서 배열 arrModeNum 생성합니다

temp 변수에 가장 높은 빈도수를 비교해서 넣어줍니다

만약 temp에 이전에 빈도수 보다 크다면 arrModeNum 초기화를 합니다

 

arrModeNum에 배열의 수가 1개밖에 없다면 최빈값은 한개밖에 없으므로 arrModeNum.get(0) 출력

arrModeNum에 배열의 수가 입력한 수와 같다면 동일하게 1개씩 입력했다는 것으로 기존에 정렬했던 num[1] 출력

그외 나머지 조건에선 arrModeNum을 정렬한 다음 arrModeNum.get(1) 출력

 

범위

입력한 수가 1개면 0을 출력하고

그외인 경우 num 배열을 정렬했음으로 인덱스 0엔 제일 작은 값이 인덱스 제일 마지막 (N - 1) 에는 제일 큰 값이 있음으로

num[N - 1] - num[0] 출력

 

코드

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) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[] num = new int[N];
        int total = 0;
        int[] countPlusNum = new int[4001];
        int[] countMinusNum = new int[4001];
        int temp = 0;
        ArrayList<Integer> arrModeNum = new ArrayList<>();

        for (int i = 0; i < N; i++) {
            num[i] = sc.nextInt();

            total += num[i];

            if (num[i] >= 0) {
                countPlusNum[num[i]]++;
            } else {
                countMinusNum[num[i] * -1]++;
            }
        }

        Arrays.sort(num);

        //산술 평균
        System.out.println(Math.round((double)total / (double)N));

        //중앙값
        System.out.println(num[N / 2]);

        //최빈값
        for (int i = 0; i < countPlusNum.length; i++) {
            if (countPlusNum[i] == 0 && countMinusNum[i] == 0) {
                continue;
            }

            if (temp <= countPlusNum[i]) {
                if (temp < countPlusNum[i]) {
                    arrModeNum.clear();
                }
                temp = countPlusNum[i];
                arrModeNum.add(i);
            }

            if (temp <= countMinusNum[i]) {
                if (temp < countMinusNum[i]) {
                    arrModeNum.clear();
                }
                temp = countMinusNum[i];
                arrModeNum.add(i * -1);
            }
        }

        if (arrModeNum.size() == 1) {
            System.out.println(arrModeNum.get(0));
        } else if (arrModeNum.size() == N) {
            System.out.println(num[1]);
        } else {
            Collections.sort(arrModeNum);
            System.out.println(arrModeNum.get(1));
        }

        //범위
        if (N == 1) {
            System.out.println(0);
            return;
        }

        System.out.println(num[N - 1] - num[0]);
    }
}

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

백준 11653 문제 자바 java  (0) 2021.02.15
백준 10814 문제 자바 java  (0) 2021.01.12
백준 10989번 자바 java  (0) 2020.12.23
백준 2751번 자바 java  (0) 2020.12.17
백준 2447번 자바 java  (0) 2020.12.17

댓글