뭘로 구현해야할까
배열, 해시맵, 리스트를 사용하였댜 !
여기서 Math 클래스 안의 메소드들을 많이 사용해봤다 !
Math클래스의 메소드
- Math.abs(x) //x의 절대값
- Math.max(x,y) //x랑 y중에 큰 값
- Math.round(x) //x를 소수점 첫째자리에서 반올림
HashMap인터페이스의 새로운 메소드인 getOrDefault(key,value)도 사용해봤다.
for(int i : arr){
map.put(i,map.getOrDefault(i,0)+1);
}
map에 key 기준으로 검색을 해서 일치하는 key가 있을 시 일치하는 key의 value를 리턴한다.
그러나 일치하지 않을시 작성했던 "값" 을 리턴
HashMap의 메소드들을 다시 노션에 정리해놔야겠다.
이 문제를 Stream으로 풀 수도 있을까?
자바 기초5. Map : 네이버 블로그 (naver.com)
stream 개념정리해야겠다
참고 사이트
[Java] 백준 2108번 [통계학] 자바 (velog.io)
자바(JAVA) 반복문 - Stream (스트.. : 네이버블로그 (naver.com)
자바(Java) 반복문 - Iterator(이.. : 네이버블로그 (naver.com)
자바(JAVA) - Collection (컬렉.. : 네이버블로그 (naver.com)
[자바-람다와 스트림] 스트림, 스트림 특징 : 네이버 블로그 (naver.com)
[Java] 자바 스트림(Stream) 사용법 및 예제 (tistory.com)
[프로그래머스 Lv1] 평균 구하기 - jav.. : 네이버블로그 (naver.com)
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.HashMap;
import java.util.List;
import java.util.Map;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int num = Integer.parseInt(br.readLine());
int arr[] = new int[num];
List <Integer> list = new ArrayList<>();
Map <Integer,Integer> map = new HashMap<>();
double sum = 0;
for(int i=0;i<num;i++) {
arr[i] = Integer.parseInt(br.readLine());
sum += arr[i];
}
Arrays.sort(arr);
int avg = (int)Math.round(sum/arr.length);
int mid = arr[arr.length/2];
int max = arr[arr.length-1];
int min = arr[0];
int range;
if(max > 0 && min >0) // 둘다 양수일 때
range = max-min;
else if(max <0 && min<0 )//둘다 음수일 때
range = Math.abs(min)-Math.abs(max);
else //둘 중에 하나라도 음수거나 0일 때
range = Math.abs(max) + Math.abs(min);
for(int i:arr) {
map.put(i,map.getOrDefault(i, 0) +1);
}
int maxv = 0; //빈도수
for(int key : map.values()) {
maxv = Math.max(maxv, key); //가장많이 나온 빈도수를 maxv에 넣음.
}
for(int key : map.keySet()) {
if(maxv == map.get(key)) { //최대 빈도수를 가지는 key값을 리스트에 저장
list.add(key);
}
}
Collections.sort(list);
int mostv;
if(list.size()>=2) {
mostv = list.get(1);
}
else
mostv = list.get(0);
sb.append(avg+"\n"+mid+"\n"+mostv+"\n"+range);
System.out.println(sb);
}
}
이게 처음에 참고해서 푼 거였고
package algorithm;
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.HashMap;
import java.util.List;
import java.util.Map;
class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
List <Integer> list = new ArrayList<>();
Map <Integer,Integer> map = new HashMap<>();
StringBuilder sb = new StringBuilder();
double sum=0;
for(int i=0;i<num;i++) {
int tmp = Integer.parseInt(br.readLine());
list.add(tmp);
sum+= list.get(i);
}
//산술평균 Math.round(double d)
// int avg = (int)Math.round(sum/list.size());
sb.append(Math.round(sum/list.size())+"\n");
//중앙값
Collections.sort(list);
sb.append(list.get(list.size()/2)+"\n");
// int mid = list.get(list.size()/2);
//범위
int max = Collections.max(list);
int min = Collections.min(list);
int range = 0;
//둘다 음수인 경우
if(max<0 && min <0) {
range = Math.abs(min)-Math.abs(max);
}
//둘다 양수인 경우
else if(max>0 && min>0) {
range = max - min;
}
//하나라도 음수인 경우
else {
range = Math.abs(max) + Math.abs(min);
}
//최빈값
for(int i : list) {
map.put(i, map.getOrDefault(i,0)+1);
}
int numbers = 0;
for(int key : map.values()) { //값 중에서 최댓값을 찾음
numbers = Math.max(numbers, key);
}
list.clear();
for(int key : map.keySet()) {
if(numbers == map.get(key))
list.add(key);
}
Collections.sort(list);
int mostv = 0;
if(list.size()>=2)
sb.append(list.get(1)+"\n");
else
sb.append(list.get(0)+"\n");
sb.append(range);
System.out.println(sb);
}
}
이게 공부해서 다시 한 건데
58684502이게 최후의 코드
58319095 이게 처음 코드
처음 배열을 사용해서 숫자 저장한 코드가 더 빠르네 !
'알고리즘 > 백준' 카테고리의 다른 글
2609번 문제 : 최대공약수와 최소공배수 (0) | 2023.03.30 |
---|---|
2164번 문제 : 카드 2 (0) | 2023.03.29 |
1966번 문제 : 프린터 큐 (0) | 2023.03.24 |
1929번 문제 : 소수구하기 (0) | 2023.03.22 |
1920번 문제 : 수 찾기 (0) | 2023.03.20 |