살아가는 이유_EU
내가 살아가는 이유, 삶
살아가는 이유_EU
전체 방문자
오늘
어제
  • 삶 (159)
    • 이유's EATERY (16)
      • 맛집 (10)
      • 까페 (4)
      • 맛있는 Recipe (1)
    • 이유's LIFE (16)
      • 국내여행 (5)
      • 해외여행 (2)
      • 운동 (1)
      • 취업정보 (0)
      • 끄적끄적 (5)
      • 일기쟝 (3)
      • 세상 이야기 (0)
      • 결혼 준비 (0)
    • 이유's Programming (43)
      • JavaScript (6)
      • Java (7)
      • C++ (0)
      • DBMS (24)
      • Spring (3)
      • til (1)
      • HTTP (2)
    • 이유's REVIEW (13)
      • BOOK (6)
      • PROGRAM or MOVIE (5)
      • PRODUCT 제품리뷰 (2)
    • 이유's STUDY (31)
      • 수업 관련 (2)
      • IT 시사 (2)
      • IT NEWS (2)
      • IVIEW (0)
      • IOS 앱 만들기 (0)
      • 알고리즘 문제풀이 (23)
      • PM data literacy (2)
    • 이유's ENGLISH (13)
      • Writing about something! (12)
      • Feedback (1)
      • TIL (0)
    • 이유's DB 공부 (1)
      • MySQL DB (0)
      • Postgre (1)
    • Computer 공부 (17)
      • Backend question (10)
      • Clean architecture (2)
      • Operating system (2)
      • Network (3)
      • 항해 (0)

블로그 메뉴

  • 홈
  • EATERY's 맛집
  • CAFE 까페
  • Recipe 레시피
  • IT 공부
  • 방명록
  • 태그

공지사항

인기 글

태그

  • 자바스크립트
  • 스쿤브레드
  • 맛집
  • 고메커피
  • have something to do with
  • 흑임자 크림
  • Array로 접근
  • 스테이크
  • 영어공부
  • map 하는 법
  • 송계옥
  • 인절미 티라미수
  • go hand in hand
  • 용인맛집
  • 어게인마이라이프
  • 파스타맛집
  • 용인추천
  • 용인까페
  • React.memo
  • key 로 접근
  • 현명하게 리액트
  • 자세요정
  • 묵리
  • 피지오필로소피
  • have something to do with뜻
  • 삼돈식탁
  • 렌더링 수 줄이기
  • 아메리카토노
  • 고메동 카페
  • memoziation

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
살아가는 이유_EU

내가 살아가는 이유, 삶

[ 백준 ] 2108 번 통계학 - Java 이용
이유's STUDY/알고리즘 문제풀이

[ 백준 ] 2108 번 통계학 - Java 이용

2021. 7. 26. 16:48
728x90
반응형

 

정말 문제 그대로 - 산술평균, 중앙값, 최빈값, 범위를 구하는 문제

 

좀 헷갈렸던 포인트

  • 출력에서 최빈값을 출력하는 것이 좀 까다로웠다. 두 번째로 작은 값을 출력해야한다고 해서
    array 를 다시 만들어서 값을 집어 넣어야하는지 혹은 이게 두 번째인지 아닌지 확인하는 방법을 생각하기가 어려웠다.
    • Solution : flag 를 사용하여 해당 count 가 두번째인지 아닌지 체크할 수 있다. 
  • 또한, 중간값 구하는 것도 헷갈렸는데 이 역시 처음에 break; 로 해서 나오는 걸로 했는데
    이게 아니라 flag 를 통해서 middleValue 가 구해지면 바로 해당 value 저장만 하고
    그대로 계속 진행하는 걸로 고쳤다. 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // counting 정렬을 이용해서 풀어보기.
        // 풀어야할 것. 산술평균 ( O ) , 최빈값, , 범위
        int N = Integer.parseInt(br.readLine());
        int[] cnt = new int[8001]; // 정수의 절대값은 -4000~에서 4000까지 n=4000 이 0 으로 기준점.
        int sum = 0;
        int max=-4001;
        int min=4001;
        for (int i = 0; i < N; i++) {
            int T = Integer.parseInt(br.readLine());
            // 저장 완료
            cnt[(T+4000)]++;
            sum+=T;
            if(max<T) {
                max = T;
            }
            if (min > T) {
                min = T;
            }
        }

        // 저장된 cnt 배열에서 산술평균, 중앙값, 최빈값, 범위 등을 구하기.
        // 최빈값은 여기서~
        int maxFreq=0;
        // count 정렬 다 합친 것 구하기.
        int cntSum=0;
        int[] arr = new int[8001];
        double overMiddle = (double)(Math.ceil((double) N/2));
//        System.out.println("N = " + N/2);
//        System.out.println("overMiddle = " + overMiddle);
        int middleValue=0;
        int cntMax=0;
        int cntValue = 0;
        int modeValue = 0;
        boolean middleFlag = false;
        boolean modeFlag = false; // 최빈값 두번 이상 나올경우를 고려해주어야 하므로
        for(int i =0; i<8001; i++) {
            if(cnt[i]>0) {
                cntSum+=cnt[i];
                if(overMiddle <= cntSum && middleFlag!= true) {
                    middleValue = i-4000;
                    middleFlag = true;
                }

                if(cntMax < cnt[i]) {
                    cntMax = cnt[i];
                    modeFlag = true;
                    modeValue = i-4000;
                }
                else if(cntMax == cnt[i] && modeFlag == true) {
                    // 2 번째 값 저장
                    modeFlag = false;
                    modeValue = i-4000;
                }
            }
        }


        // 산술평균
        System.out.println((int)(Math.round((double) sum/N)));
        // 중앙값
        System.out.println(middleValue);
        // 최빈값
        System.out.println(modeValue);
        // 범위
        System.out.println((max-min));

    }
}
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'이유's STUDY > 알고리즘 문제풀이' 카테고리의 다른 글

[ 백준 ] 11651- 좌표 정렬하기 2  (0) 2021.07.27
[ 백준 ] 11650 - 좌표 정렬하기, Java 이용  (0) 2021.07.27
[ 백준 ] 10989번 수 정렬하기3 / [ Java 이용 ]  (0) 2021.07.25
[ 백준 ] 2751번 - 수 정렬하기2 / [Java 이용 ]  (0) 2021.07.25
[ 백준 ] 2750번 수 정렬하기 - Java 이용  (0) 2021.07.22
    '이유's STUDY/알고리즘 문제풀이' 카테고리의 다른 글
    • [ 백준 ] 11651- 좌표 정렬하기 2
    • [ 백준 ] 11650 - 좌표 정렬하기, Java 이용
    • [ 백준 ] 10989번 수 정렬하기3 / [ Java 이용 ]
    • [ 백준 ] 2751번 - 수 정렬하기2 / [Java 이용 ]
    살아가는 이유_EU
    살아가는 이유_EU
    안녕하세요. 초보개발자의 일상을 담은 블로그입니다.

    티스토리툴바