728x90
문제
: 입력 수 중에 다음 4가지 값을 순서대로 출력
- 산술평균 : N개의 수들의 합을 N으로 나눈 값
- 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
- 최빈값 : N개의 수들 중 가장 많이 나타나는 값
- 범위 : N개의 수들 중 최댓값과 최솟값의 차이
문제 링크 : https://www.acmicpc.net/problem/2108
원리
1. N개의 수 합 / N
[ 주의 : 소수점 이하 첫째자리 반올림 = double로 값 구하기 ]
2. N개의 수 정렬 후 N/2 인덱스의 값
[ 주의 : 어차피 N은 무조건 홀수 ]
3. N개의 수를 같은 값마다 해시맵으로 밸류에 count 후 최대 밸류값인 키값 출력
[ 주의 : 최빈값이 여러개 일 때, 최빈값(키값) 리스트를 만들어서 그 중 두번째로 큰 값 출력 ]
4. N개의 수 중 최대값의 절대값 + 최솟값의 절대값
[ 주의 : 단순히 최대값 - 최솟값 하면 오류날 수 있음 ]
나의 코드
: 로컬에서 통과하고 이상은 없어 보이는데, 왜인지 통과를 못함.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class no2108 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
/**
* 입력값을 숫자로 변환하여 arr에 오름차순으로 정렬 저장
* 동시에 모든 값의 총 합을 구함
*/
int[] arr = new int[T]; // 모든 수를 담을 arr
int sum = 0; // 모든 수의 합
for (int i = 0; i < T; i++) {
int temp = Integer.parseInt(br.readLine());
arr[i] = temp;
sum += temp;
}
Arrays.sort(arr); // arr 오름차순 정렬
/**
* HashMap을 이용해, 각 값의 빈도수를 파악
*/
Map<Integer, Integer> hm = new HashMap<>();
for (int num : arr) {
if (hm.containsKey(num)) hm.put(num, hm.get(num) + 1);
else hm.put(num, 1);
}
/**
* HashMap에 저장된 밸류값으로 가장 많이 나온 애들(key값)만 추려서 keyList에 저장
*/
List<Integer> keyList = new ArrayList<>();
Integer max = Collections.max(hm.values());
for (Map.Entry<Integer, Integer> entry : hm.entrySet()) {
if (entry.getValue().equals(max)) {
keyList.add(entry.getKey());
}
}
/**
* 산술평균값
* 소수점 1번째 자리에서 반올림 후 출력
* 만약 합산(sum)이 음수면, -1해줘서 출력
*/
double ave = sum / T;
if (ave < 0) ave -= 1;
String result = String.format("%.0f", ave);
System.out.println(result);
/**
* 중앙값
* 수의 개수는 항상 홀수이므로, 홀수를 2로 나눈 몫에 해당하는 값을 출력
* 몫은 홀수인 int값이기때문에 절반에서 소수점을 내림하고, arr도 0부터 시작하기 때문에 arr.length의 절반 -1위치의 값이 중앙값
*/
System.out.println(arr[T / 2]);
/**
* 최빈값
* keyList의 요소가 한 개면 바로 출력 (=최빈값)
* keyList를 오름차순 정렬 후 두 번째로 작은 값(1번째) 출력 (=같은 최빈값 중 2번째로 작은 수)
*/
if (keyList.size() > 1) {
Collections.sort(keyList);
System.out.println(keyList.get(1));
} else {
System.out.println(keyList.get(0));
}
/**
* 범위값
* 최대값 - 최소값
*/
System.out.println(Math.abs(arr[T - 1]) + Math.abs(arr[0]));
}
}
레퍼런스 코드
참고 링크 : https://st-lab.tistory.com/108
728x90
'알고리즘 저장소 (일반방식과 나만의 풀이) > JAVA' 카테고리의 다른 글
[백준] no2775: 부녀회장이 될끼야 (0) | 2023.01.23 |
---|---|
[코딩테스트] 줌 인터넷 (ZUM) (0) | 2023.01.22 |
[백준] no10989: 수 정렬하기 3 (0) | 2023.01.21 |
[백준] no2839: 설탕 배달 (0) | 2023.01.20 |
[백준] no7568: 덩치 (0) | 2023.01.19 |