-
[백준/BOJ] 2108번 : 통계학 (JAVA / 자바)백준 2022. 2. 27. 23:54
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/2108
- 문제 -
난이도 실버 3 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
풀이 방법
어렵지 않은 문제이다. 아마 틀린다면 최빈값을 구하는 과정에서 틀리는 사람이 많지 않나 싶다.
필자도 많이 틀리긴했는데 최빈값때문은 아니고 배열을 사용하지 않고, list로 풀었는데. 이래저래해도 계속 틀려서 혹시나해서 list를 배열로 바꿨는데 맞았다. 왜 list는 틀리는건지 모르겠다...
평균, 중앙값, 범위 전부다 쉬우니 중요한 것만 말하겟다. 이 모든걸 그냥 입력값 그대로 풀려면 할 순있지만 번거롭다. 그렇기때문에 Arrays.sort를 이용해 정렬을 하면 쉽게 풀 수 있을 것이다.
이제 최빈값인데 최빈값도 어렵진 않다.
누구나 생각할 그런 방법. 반복문으로 같은수가 나오면 개수를 세고, 그 개수가 제일 큰 값을 구한다. 그런데 여기서 최빈값이 여러개일 경우 두번째를 구하라고 한다. 그럼 2번째 값을 어떻게 구하나. 최댓값을 저장 할 변수와 해당하는 최빈값을 저장 할 변수, 그리고 지금 최빈값이 개수가 같은 최빈값들 중 첫번째인지 두번째인지 판단해줄 boolean형 변수.
방금 말한대로 boolean 변수가 키포인트다.
이미 정렬을 했기때문에 인덱스 기준으로 앞뒤로 비교해서 같으면 개수를 세어준다. 달라질때까지 개수를 세서 제일 큰 값을 개수중 최댓값을 저장 할 변수에 저장하고. 최빈값을 변수에 저장한다. boolean변수는 true로 바꿔준다.
그리고 다음 조건에 값의 개수가 이전 최댓값과 같고, boolean 변수가 true면 아직 첫번째이기에 최빈값을 저장해준다. 저장 한 뒤 boolean변수도 false로 바꿔준다. 이제 두번째가 저장 되었으니 그 뒤로 최댓값이 같은 값이 나와도 저장 되지 않을 것이다.
코드로 보자.
-풀이-
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; 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()); int[] arr = new int[N]; double sum = 0; for(int i = 0; i < N; i++) { arr[i] = Integer.parseInt(br.readLine()); sum += arr[i]; } //정렬 Arrays.sort(arr); int count = 0; int max = -1; //for문 한개로 돌리는 방식이기에 값이 1개이면 반복문이 돌지 않는다. //그렇기에 처음 최빈값은 배열의 첫번째 값으로 저장해 준다. int mod = arr[0]; boolean check = false; //최빈값 구하는 반복문 for(int i = 0; i < N - 1; i++) { if(arr[i] == arr[i + 1]) { count++; }else { count = 0; } if(max < count) { max = count; mod = arr[i]; check = true; }else if(max == count && check == true) { mod = arr[i]; check = false; } } System.out.println(Math.round(sum / N)); System.out.println(arr[(N - 1) / 2]); System.out.println(mod); System.out.println(arr[N - 1] - arr[0]); } }
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.
'백준' 카테고리의 다른 글
[백준/BOJ] 2231번 : 분해합 (JAVA / 자바) (0) 2022.02.28 [백준/BOJ] 2164번 : 카드2 (JAVA / 자바) (0) 2022.02.28 [백준/BOJ] 1978번 : 소수 찾기 (JAVA / 자바) (0) 2022.02.27 [백준/BOJ] 1966번 : 프린터 큐 (JAVA / 자바) (0) 2022.02.27 [백준/BOJ] 1929번 : 소수 구하기 (JAVA / 자바) (0) 2022.02.27