개발후라이
개발후라이
개발후라이
  • 분류 전체보기 (286)
    • Web Front End (75)
      • Javascript & Typescript (26)
      • React (12)
      • Vue (4)
      • Nodejs (1)
      • HTML (6)
      • CSS (7)
      • HTTP (6)
      • 책 - Review (8)
    • TIL (0)
    • Problem Solved (135)
      • 알고리즘 (4)
      • BOJ (67)
      • Programmers (8)
      • HackerRank (33)
      • LeetCode (23)
    • 회고 (4)
      • 오늘의 회고 (16)
      • 주간 회고 (15)
      • 월간 회고 (7)
      • WakaTime (9)
    • Git (3)
    • 기타 (15)
      • 취업 (5)
      • 자격증 (1)

블로그 메뉴

  • GitHub
  • LinkedIn
  • 홈

인기 글

태그

  • JavaScript
  • 프론트엔드
  • 오늘의회고
  • 개발자
  • 릿코드
  • 노개북
  • TypeScript
  • 노마드북클럽
  • 자바스크립트
  • 회고

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
개발후라이

개발후라이

Problem Solved/BOJ

[BOJ][Java] 2108번 - 통계학

2019. 12. 8. 23:02
반응형

문제

  • 백준 2108번: 통계학
  • 산술평균, 중앙값, 최빈값, 범위를 구하는 문제

풀이 설명

  • 최빈값을 구하는 조건이 까다로워서 두가지 방법으로 풀었다.
  • 첫번째 방법은 필요 이상으로 복잡해서 시간제한에도 아슬아슬하게 맞았다.
    1) 최빈값 구할 때 HqshMap, LinkedList, Comparator 사용
    2) 최빈값 구할 때 ArrayList 사용 (참고: https://qlyh8.tistory.com/139)

성공 코드

1) 최빈값 구할 때 HqshMap, LinkedList, Comparator 사용

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader((System.in))); 
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter((System.out)));
        int n = Integer.parseInt(br.readLine());
        int[] nums = new int[n];

        for (int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(br.readLine());
        }
        br.close();
        Arrays.sort(nums);

        bw.write(mean(nums) + "\n");
        bw.write(median(nums) + "\n");
        bw.write(mode(nums, n) + "\n");
        bw.write(diff(nums) + "\n");
        bw.close();
    }

    public static int mean(int[] nums) {
        double sum = 0.0;
        for (int num : nums)
            sum += num;

        return (int) Math.round(sum / nums.length);
    }

    public static int median(int[] nums) {
        return nums[ nums.length / 2 ];
    }

    public static int mode(int[] nums, int n) {
        boolean visited[] = new boolean[n];
        Arrays.fill(visited, false);

        // 입력숫자, 숫자의 개수
        HashMap<Integer, Integer> modes = new HashMap<>();

        if (n == 1) return nums[0];
        else {
            for (int i = 0; i < n; i++) {
                if (visited[i] == true)
                    continue;

                int cnt = 1;
                for (int j = i+1; j < n; j++) {
                    if (nums[i] == nums[j]) {
                        visited[j] = true;
                        cnt++;
                    }
                }
                modes.put(nums[i], cnt);
            }
            List<Map.Entry<Integer, Integer>> answer = new LinkedList<>(modes.entrySet());

            Collections.sort(answer, new Comparator<Map.Entry<Integer, Integer>>() {
                @Override
                //key: 입력한 숫자 값들
                //value: key 값들의 개수
                public int compare(Entry<Integer, Integer> arg0, Entry<Integer, Integer> arg1) {
                    if (arg0.getValue() == arg1.getValue())
                        return arg0.getKey() - arg1.getKey();
                    return arg1.getValue() - arg0.getValue();
                }
            });

            if (answer.get(0).getValue() == answer.get(1).getValue())
                return answer.get(1).getKey();
            else
                return answer.get(0).getKey();
        }
    }

    public static int diff(int[] nums) {
        // 최댓값, 최솟값 찾기
        int max = -4001;
        int min = 4001;

        for (int i = 0; i < nums.length; i++) {
            if (max < nums[i]) max = nums[i];
            if (min > nums[i]) min = nums[i];
        }
        return max - min;
    }
}

2) 최빈값 구할 때 ArrayList 사용

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader((System.in))); 
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter((System.out)));
        int n = Integer.parseInt(br.readLine());
        int[] nums = new int[n];
         int visited[] = new int[8001];
       double sum = 0.0;

        for (int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(br.readLine());
            visited[nums[i] + 4000]++;
            sum += nums[i];                                                                                                                                                                                                                  
        }
        br.close();
        Arrays.sort(nums);

        bw.write((int) Math.round(sum/n) + "\n");
        bw.write(nums[n/2] + "\n");
        if (n == 1) 
            bw.write(nums[0] + "\n");
        else 
            bw.write(mode(visited) + "\n");
        bw.write(nums[n-1] - nums[0] + "\n");
        bw.close();
    }

    public static int mode(int[] visited) {
        ArrayList<Integer> modes = new ArrayList<>();        
        int maxMode = 0;

        for (int i = 0; i <= 8000; i++) {
            if (visited[maxMode] < visited[i]) {
                maxMode = i;
                modes.clear();
            }
            else if (visited[i] != 0 && visited[i] == visited[maxMode]) {
                modes.add(i - 4000);
            }
        }
        if (modes.size() != 0) 
            return modes.get(0);
        else 
            return maxMode - 4000;
    }
}
반응형
    'Problem Solved/BOJ' 카테고리의 다른 글
    • [BOJ][Java] 2941번 - 크로아티아 알파벳
    • [BOJ][Java] 1316번 - 그룹 단어 체커
    • [BOJ][Java] 11651번 - 좌표 정렬하기 2
    • [BOJ][Java] 11650번 - 좌표 정렬하기
    개발후라이
    개발후라이
    어제보다 오늘 발전하기 위한 공간 https://github.com/choisohyun

    티스토리툴바