본문 바로가기
알고리즘/백준

2108번 문제 : 통계학

by son_i 2023. 3. 29.
728x90

2108번: 통계학 (acmicpc.net)

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

뭘로 구현해야할까

배열, 해시맵, 리스트를 사용하였댜 !

여기서 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)

 

자바 기초5. Map

갑자기 공부하던 링크의 순서에서 벗어났다... 일단 자료형 부터 다 공부하고 가자... 깊이우선탐색, 넓이...

blog.naver.com

stream 개념정리해야겠다

참고 사이트

[Java] 백준 2108번 [통계학] 자바 (velog.io)

 

[Java] 백준 2108번 [통계학] 자바

[Java] 백준 2108번 [통계학] 자바

velog.io

자바(JAVA) 반복문 - Stream (스트.. : 네이버블로그 (naver.com)

 

자바(JAVA) 반복문 - Stream (스트림)

람다식을 공부하다보면 스트림이라는 것을 만나보시게 될겁니다. 그렇다면 이 스트림은 또 뭘까요? 스트림(...

blog.naver.com

자바(Java) 반복문 - Iterator(이.. : 네이버블로그 (naver.com)

 

자바(Java) 반복문 - Iterator(이터레이터)

이전 포스팅에서 컬렉션 프레임워크에 대해 포스팅을 했었던 적이 있습니다. https://blog.naver.com/cjy21...

blog.naver.com

자바(JAVA) - Collection (컬렉.. : 네이버블로그 (naver.com)

 

자바(JAVA) - Collection (컬렉션) / Collection Framework (컬렉션 프레임워크)

이번 포스팅에는 자바를 하다보면 종종 많이 듣게되는 Collection 에 대해 포스팅 해보도록 하겠습니다. ...

blog.naver.com

[자바-람다와 스트림] 스트림, 스트림 특징 : 네이버 블로그 (naver.com)

 

[자바-람다와 스트림] 스트림, 스트림 특징

(책 '자바의 정석 3rd', 유튜브 '남궁성의 정석코딩'을 참고하여 작성) 스트림 (strea...

blog.naver.com

[Java] 자바 스트림(Stream) 사용법 및 예제 (tistory.com)

 

[Java] 자바 스트림(Stream) 사용법 및 예제

자바 스트림(Stream) 자바의 스트림(Stream)은 'Java 8'부터 지원되기 시작한 기능이다. 컬렉션에 저장되어 있는 엘리먼트들을 하나씩 순회하면서 처리할 수 있는 코드패턴이다. 람다식과 함께 사용되

hbase.tistory.com

[프로그래머스 Lv1] 평균 구하기 - jav.. : 네이버블로그 (naver.com)

 

[프로그래머스 Lv1] 평균 구하기 - java/javascript 풀이

https://programmers.co.kr/learn/courses/30/lessons/12944 문제 설명 정수를 담고 있는 배열 arr의 평균...

blog.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