알고리즘/그리디(Greedy)

[JAVA] 이.코.테(Greedy) - 큰수의 법칙

hongeeii 2021. 7. 29.
728x90
반응형

Q1) 큰 수의 법칙

velmash는 큰 수의 법칙을 본인만의 방식으로 다르게 사용하고 있다. velmash의 큰 수의 법칙은 다양한 수로 이루어진 배열이 있을 때 주어진 수들을 M번 더하여 가장 큰수를 만드는 법칙이다. 단 배열의 특정한 인덱스(번호)에 해당하는 수가 연속해서 K번을 초과하여 더해질 수 없는 것이 이 법칙의 특징이다.

예를 들어 순서대로 2, 4, 5, 4, 6으로 이루어진 배열이 있을 때 M이 8이고, K가 3이라고 가정하자. 이 경우 특정한 인덱스의 수가 연속해서 세 번까지만 더해질 수 있으므로 큰 수의 법칙에 따른 결과는 6+6+6+5+6+6+6+5인 46이 된다.

# 문제

배열의 크기 N, 숫자가 더해지는 횟수 M, 그리고 K가 주어질 때 velmash의 큰 수의 법칙에 따른 결과를 출력하시오

# 입력 조건

  • 첫째 줄에 N(2 <= N <= 1,000), M(1 <= M <= 10,000), K(1 <= K <= 10,000)의 자연수가 주어지며, 각 자연수는 공백으로 구분한다.
  • 둘째 줄에 N개의 자연수가 주어진다. 각 자연수는 공백으로 구분한다. 단, 각각의 자연수는 1 이상 10,000 이하의 수로 주어진다.
  • 입력으로 주어지는 K는 항상 M보다 작거나 같다

# 출력조건

  • 첫째 줄에 큰 수 의 법칙에 따라 더해진 답을 출력한다

# 입력예시

입력

5 8 3 2 4 5 4 6

# 출력예시

출력

46

 

 

 

풀이

public class LargeNumberRule {

	public static int rule(int n, int m, int k, int arr[]) {
		int first = 0; // 제일 큰수
		int second = 0;/// 두번째로 큰수

		Arrays.sort(arr); // 배열 오름차순 정렬

		first = arr[n - 1];
		second = arr[n - 2];

		int sum = 0;
		int temp = 0;  ///최대값 반복 횟수
		for (int i = 0; i < m; i++, temp++) {
			if (temp >= k) {  ///최대값 반복횟수가 k이상이면
				sum += second; ///두번째로 큰 값을 더한후
				temp = 0;  ////반복횟수 0으로 초기화
				continue;  
			}
			sum += first;   
		}
		return sum;
	}

출력 : 46

 

아이디어 : 가장 큰 수와 두번째로 큰 수만 구하면 풀 수 있을것이라고 생각 했습니다.

              배열을 오름차순으로 정렬시키고 가장 큰 수와 두번째로 큰 수를 구했고,

              최대값 반복횟수에 따라 값을 더해주었습니다.

728x90
반응형

추천 글