티스토리 뷰
728x90
문제
- N은 홀수
- N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램
1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이
- 산술평균은 소수점 이하 첫째 자리에서 반올림한 값을 출력
- 최빈값이 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력
해결방법
1. 산술평균 - 숫자들을 입력 받으면서 sum 변수를 두어 모든 합을 저장해두고 sum을 주어진 입력의 개수로 나누어 평균을 구할 수 있도록 하였다. 이 때, 소수점 이하 첫째 자리에서 반올림한 값을 출력하라고 하여 Math.round() 메서드를 이용하여 반올림할 수 있도록 하였다.
2. 중앙값 - 입력받은 배열을 정렬시킨 뒤 해당 배열 내에서 중앙값을 찾아 출력하였다.
3. 최빈값 - 2차원 배열을 두어 음수, 양수를 구분하여 빈도수를 체크할 수 있는 배열을 하나 생성하였고, 숫자를 입력받으면서 음수, 양수에 따라 행을 다르게, 입력된 숫자에 따라 열을 다르게 하여 빈도수를 체크할 수 있도록 하였다. 이렇게 체크된 빈도수를 가지고 전체를 탐색하면서 빈도수가 가장 큰 값을 찾아낼 수 있도록 하였다.
4. 범위 - 입력받은 배열을 정렬시킨 뒤 해당 배열 내에서 최댓값과 최솟값을 구해 그 차이를 출력하였다.
코드
import java.io.*;
import java.util.*;
class Main{
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine()); // 숫자의 개수
int[] nums = new int[N]; // 입력받은 숫자 배열
int[][] check = new int[4001][2]; // 빈도 수 체크 배열(0: 음수 관리 / 1: 양수 관리)
int sum = 0; // 숫자 합
int max = 0; // 빈도 수 최댓값
for(int i = 0; i<N; i++){
nums[i] = Integer.parseInt(br.readLine()); // 각각의 숫자를 입력 받음
sum += nums[i]; // 산술평균을 구하기 위해 숫자들의 합을 구함
if(nums[i] < 0) { // 입력받은 숫자가 음수라면
check[Math.abs(nums[i])][0]++; // 빈도 수 체크 배열 첫 번째 행(0)에 관리
// 최빈값을 찾는 것이므로 빈도 수 최댓값을 갱신할 수 있도록 함
if(max < check[Math.abs(nums[i])][0]) max = check[Math.abs(nums[i])][0];
}
else if(nums[i] >= 0) { // 입력받은 숫자가 양수라면
check[nums[i]][1]++; // 빈도 수 체크 배열 두 번째 행(1)에 관리
// 최빈값을 찾는 것이므로 빈도 수 최댓값을 갱신할 수 있도록 함
if(max < check[nums[i]][1]) max = check[nums[i]][1];
}
}
// 중앙값과 범위를 구하기 위해 배열을 정렬
Arrays.sort(nums);
// 1. 산술평균 구하기
// Math.round() 메서드를 이용하여 반올림
sb.append(Math.round((double) sum / N)).append("\n");
// 2. 중앙값 구하기
// 정렬된 배열 내에서 중앙값을 찾아 출력
sb.append(nums[N/2]).append("\n");
// 3. 최빈값 구하기
int count = 0; // 최빈값이 여러 개라면 두 번째로 작은 값을 출력해야하므로 카운팅
int num = 0; // 최빈값 저장 변수
// 음수일 경우
for(int i = 4000; i>=0; i--){
if(check[i][0] == max){ // 빈도수가 최대라면
num = -i; // 음수로 최빈값 변수에 저장
count++; // 최빈값 카운팅
}
if(count >=2) break; // 두 번째로 작은 최빈값이라면 break;
}
if(count<2){ // 두 번째로 작은 최빈값을 찾은 것이라면 양수일 경우를 고려할 필요가 없음
// 양수일 경우
for(int i = 0; i<4001; i++){
if(check[i][1] == max){ // 빈도수가 최대라면
num = i; // 최빈값 변수에 저장
count++; // 최빈값 카운팅
}
if(count >=2) break; // 두 번째로 작은 최빈값이라면 break;
}
}
// 최빈값 출력
sb.append(num).append("\n");
// 4. 범위 구하기
// 정렬된 배열 내에서 최댓값과 최솟값을 구해 그 차이를 구함
sb.append(nums[N-1]-nums[0]).append("\n");
System.out.println(sb);
br.close();
}
}
728x90
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 2231번 분해합(JAVA) (0) | 2022.07.17 |
---|---|
[백준] 2164번 카드2(JAVA) (0) | 2022.07.17 |
[백준] 1978번 소수 찾기(JAVA) (0) | 2022.07.14 |
[백준] 1966번 프린터 큐(JAVA) (0) | 2022.07.13 |
[백준] 1929번 소수 구하기(JAVA) (0) | 2022.07.12 |
댓글