본문 바로가기
Blog/Education

99클럽 코테 스터디 10일차 TIL + List/Map

by 코젼 2024. 4. 3.
728x90
반응형

백준

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 


- 오늘의 학습 키워드 : List/Map

- 공부한 내용 본인의 언어로 정리하기

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int N = Integer.parseInt(br.readLine());
    List<Integer> list = new ArrayList<>();
    Map<Integer, Integer> map = new HashMap<>();

    for (int i=0; i<N; i++) {
      int num = Integer.parseInt(br.readLine());
      list.add(num); // 초기 값 세팅
      // 최빈값을 위한 map 값 세팅
      int value = map.getOrDefault(num, 0) + 1; // map에 key가 이미 있으면 그 값에 +1를 하고, 없으면 1값 넣기
      map.put(num, value);
    }
    Collections.sort(list); // 배열 정렬

    // 1) 산술평균 구하기
    double sum = list.stream()
        .mapToInt(Integer::intValue)
        .sum();
    System.out.println(Math.round(sum / N));

    // 2) 중앙값 구하기
    int index = N / 2;
    System.out.println(list.get(index));

    // 3) 최빈값 구하기
    int maxFrequency = Collections.max(map.values());
    List<Integer> frequencies = new ArrayList<>();
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
      if (entry.getValue() == maxFrequency) { // 최빈값이랑 entry의 value와 동일하다면
        // 새로운 map에 최빈값과 동일한 key, value들 저장
        frequencies.add(entry.getKey());
      }
    }
    // 새로운 map 정렬
    Collections.sort(frequencies);
    if (frequencies.size() == 1) { // 최빈값이 하나일 경우는 그대로 출력
      System.out.println(frequencies.get(0));
    } else { // 최빈값이 여러개일 경우는 두 번재로 작은 값 출력
      System.out.println(frequencies.get(1));
    }
    
    // 4) 범위 구하기
    System.out.println(list.get(list.size() - 1) - list.get(0)); // 맨 뒤 - 맨 앞
  }
}

- 오늘의 회고 : 주석 달면서 나만의 알고리즘 풀이법을 정리하는 것은 꽤나 도움이 되었다!
문제를 풀면서 stream, List, Map에 대해서 익숙해짐을 느꼈다 :)

역시 1일 1코딩은 중요해!!


99클럽 1기를 수강하면서 작성한 글입니다.

https://99club.oopy.io/

 

99클럽-1기 모집 중

현직 개발자와 함께하는 코테 스터디

99club.oopy.io

 

728x90
반응형

댓글