Notice
Recent Posts
Recent Comments
Link
관리 메뉴

거북이처럼 천천히

알고리즘 (6월 10일) 본문

Algorithm/알고리즘 문제 풀이

알고리즘 (6월 10일)

유로 청년 2022. 6. 11. 02:55

1. 문제 (코딩도장, 최빈값 구하기)

https://codingdojang.com/scode/612

 

코딩도장

프로그래밍 문제풀이를 통해서 코딩 실력을 수련

codingdojang.com


2. 생각

리스트에 있는 숫자들의 최빈값을 구하는 프로그램을 만들어라.

 

[12, 17, 19, 17, 23] = 17

[26, 37, 26, 37, 91] = 26, 37

[28, 30, 32, 34, 144] = 없다

 

▶ 최빈값 : 자료의 값 중에서 가장 많이 나타난 값

자료의 값이 모두 같거나 모두 다르면 최빈값은 없다.

 

 

  1. 임의의 숫자들을 입력받는다.
  2. 내림차순으로 정리한다.
    (내림차순 정렬하면 같은 숫자들끼리 그룹별로 뭉쳐있기 때문에 같은 숫자의 빈도 수를 계산하기 편리할 것으로 
     예상되어 내림차순으로 정리한다. 오름차순으로 정리해도 괜찮다.)
  3. for문을 이용해서 이전 값과 현재의 값을 비교한다. 같으면 count 에 1을 더하고, 다르면 최대 빈도수(maxCount)와
    비교한다. 이때, 최대 빈도수와 직전까지의 count가 같으면 빈도수가 같은 것으로 생각하여 result 리스트에 따로 
    저장한다.
  4. 최대 빈도수가 1이면 모든 숫자가 다른 것으로 생각하여 최빈값없다고 출력
  5. 최대 빈도수가 1보다 크면 최빈값이 존재하며, 최빈값들은 result 리스트에 저장되어 있어 리스트를 출력

3. 풀이 및 코드 분석

import java.util.Scanner;
import java.util.ArrayList;

public class test {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		ArrayList<Integer> numbers = new ArrayList<>();
		
		// 입력 받기
		while(true) {
			System.out.print("숫자를 입력하시오: (그만 입력하고 싶으면 !을 입력하시오.)");
			String inputData = scan.next();
			
			if(inputData.equals("!")) {
				break;
			}else {
				numbers.add(Integer.parseInt(inputData));
			}
		}
		
		// 내림차순 정리
		int max, maxidx;
		for(int i=0; i<numbers.size(); i++) {
			max = numbers.get(i);
			maxidx=i;
			for(int j=i+1; j<numbers.size(); j++) {
				if(numbers.get(j)>max) {
					maxidx=j;
					max=numbers.get(j);
				}			
			}
			numbers.set(maxidx, numbers.get(i));
			numbers.set(i, max);
		}
		
		// 최빈값 구하기
		ArrayList<Integer> result = new ArrayList<>();
		result.add(numbers.get(0));
		int count=1, maxCount=1;
		
		for(int i=1; i<numbers.size(); i++) {
			if(numbers.get(i-1)!= numbers.get(i)) {
				if(count>maxCount) {
					maxCount=count;
					result.clear();
					result.add(numbers.get(i-1));
				}else if(count==maxCount) {
					result.add(numbers.get(i-1));
				}
				
				count = 1;
			}else {
				count++;
			}
		}
		
		if(count==maxCount) {
			result.add(numbers.get(numbers.size()-1));
		}
		
		// 빈도수에 따라 결과값 출력
		if(maxCount!=1) {
			System.out.println("최빈값:"+result+"\n");
			System.out.printf("빈도수는 %d입니다.", maxCount);	
		}else {
			System.out.println("최빈값 없다.");
		}
		
			
	}
}

'Algorithm > 알고리즘 문제 풀이' 카테고리의 다른 글

알고리즘 (6월 13일)  (0) 2022.06.13
알고리즘 (6월 12일)  (0) 2022.06.12
알고리즘 (6월 9일)  (0) 2022.06.09
알고리즘 (6월 8일)  (0) 2022.06.08
알고리즘 (6월 7일) - (2)  (0) 2022.06.07