알고리즘 문제/SWEA

[SWEA - Java] 1265. [S/W 문제해결 응용] 9일차 - 달란트2

건복치 2021. 10. 21. 16:00
반응형

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV18R8FKIvoCFAZN 

설명

묶음을 어떻게 나눠야 할까? DP? 완전 탐색?

잘 생각해보자.

 

10 달란트를 3묶음으로 나눌 경우 어떻게 나누어야 가장 많은 사탕을 교환할 수 있을까?
각 묶음에 들어있는 달란트 수의 차이가 최소여야 곱했을 때 얻는 사탕의 수가 크다

 

즉, N개를 묶음 P로 나눈 각 묶음의 숫자의 차이가 작아야만 곱했을 때 값이 커진다.

이렇게 되면 문제는 쉬워진다.

 

N개를 말 그대로 N / P만큼으로 나누자.

나머지가 생길 수 도 있고 안 생길 수도 있다.

나머지가 안 생기면 그대로 N / P만큼으로 나누고 끝인 거고,

나머지가 있다면 각 남은 숫자를 각 묶음에 하나씩 더해준다면 가장 작은 차이가 날 것이다.

 

아래 표를 보면 3 * 3 * 4(10 달란트로 얻는 사탕의 수가 가장 큰 경우)로 각 묶음의 차가 0, 0, 1 밖에 나지 않는다.

 

10 달란트
1 * 1 * 8 = 8
3 * 3 * 4 = 36

 

전체 코드

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

class Solution {
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();

		int T = Integer.parseInt(br.readLine());

		for(int test_case = 1; test_case <= T; test_case++) {
			st = new StringTokenizer(br.readLine());

		int N = Integer.parseInt(st.nextToken());
			int P = Integer.parseInt(st.nextToken());
			
			int[] arr = new int[P];
			Arrays.fill(arr, N/P);
			
			int count = N % P;
			for(int i = 0; i < arr.length; i++) {
				if(count != 0) {
					arr[i] += 1;
					count--;
				} else {
					break;
				}
			}
			
			long answer = 1;
			for(long i : arr) {
				answer *= i;
			}

			sb.append("#" + test_case + " " + answer + "\n");
		}

		System.out.println(sb.toString());
	}
	
}

 

반응형