코딩테스트

[이코테/JAVA] Greedy - 큰 수의 법칙

Eun 2022. 1. 23. 14:54

문제

 

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

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

 

입력
배열의 크기 N, 숫자가 더해지는 횟수 M, 연속해서 숫자를 최대로 더할 수 있는 횟수 K

 

출력
큰 수의 법칙에 따라 더해진 답

 

예시

  • 순서대로 2, 4, 5, 4, 6으로 이루어진 배열이 있을 때 M=8, K=3이라고 가정하자. 특정한 인덱스의 수를 연속해서 3번까지 더할 수 있으므로 큰 수의 법칙에 따라 결과는 6+6+6+5+6+6+6+5=46이 된다. 
  • 다른 예시로 3, 4, 3, 4, 3으로 이루어진 배열이 있을 때 M=7, K=2라고 가정하면, 결과는 4+4+4+4+4+4+4=28이 된다. (다른 인덱스의 4이기 때문에 계속 4를 더할 수 있다)

풀이

문제를 단순하게 만들면, 더해서 최대한 큰 수를 만드는 것이다. 최대한 큰 수를 만들기 위해서는 가장 큰 수를 최대한 많이 더하는 것이 좋다. 따라서

1. 오름차순으로 배열을 정렬하고 배열의 끝을 가져와서 a변수에 저장.

2. a를 k번만큼 더한다. 이때, 더할 때마다 count값을 더하고 m이 넘지않는지 검사를 해준다. 

3. 그 다음 큰 수를 b에 저장하고 count값을 더하고 m을 넘지않으면 b를 한번만 더해준다.

(한번만 더해주는 이유는 a를 최대한 많이 더해줘야하기때문)

4.  최종 값을 출력한다.

코드

package Week08;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class NDB_큰수의법칙 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		int k = Integer.parseInt(st.nextToken());
		
		st = new StringTokenizer(br.readLine());
		
		int num[] = new int[n];
		
		for(int i=0;i<n;i++) {
			num[i]=Integer.parseInt(st.nextToken());
		}
		
		Arrays.sort(num);	// 오름차순 정렬
		
		int a = num[n-1];	// 가장 큰 수 
		int b = num[n-2];	// 그다음 큰 수
		
		int ans=0;
		int count=0;
		
		while(count<=m) {
			
			for(int i=0;i<k;i++) {
				count++;			// 더한 횟수 더해주기
				if(count>m) break;	// m번을 초과했을 경우
				else {
					ans+=a;
				}
			}
			count++;
			if(count>m) break;
			else ans+=b;
			
		}
			
		
		
		System.out.println(ans);
		
	}

}

'코딩테스트' 카테고리의 다른 글

[이코테/JAVA] Greedy - 만들 수 없는금액  (0) 2022.01.25
[BOJ_1107/JAVA] 리모컨  (0) 2022.01.25
[BOJ_3085/JAVA] 사탕 게임  (0) 2022.01.22
[BOJ_1309/JAVA] 동물원  (0) 2022.01.21
[BOJ_2225/JAVA] 합분해  (0) 2022.01.21