Exercises

백준 1654

sysout.초코우유 2018. 12. 18. 21:21

랜선 자르기


문제

집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다.


이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm 은 버려야 한다.(이미 자른 랜선은 붙일 수 없다.)


편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정하자. 그리고 자를 때는 항상 센티미터 단위로 정수길이만큼 자른다고 가정하자. 이때 만들 수 있는 최대 랜선의 길이를 구하는 프로그램을 작성하시오.


입력

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다. 랜선의 길이는 231-1보다 작거나 같은 자연수이다.


출력

첫째 줄에 N개를 만들 수 있는 랜선의 최대 길이를 센티미터 단위의 정수로 출력한다.



아직 오류를 해결하지 못한 문제. 런타임 오류가 나는 것으로 봐서 인덱스 참조를 잘못 하고 있는 것 같은데 어디서 참조를 잘못 하고 있는 지 모르겠다.

아니면 메모리 오버가 나는것일수도 있는데, 최대크기 10000짜리 int array2개를 쓰고 다중 for문을 쓰는 것도 아니라 128메가의 메모리 제한을 넘을 것 같지는 않다. 왜인지는 잘 모르겠으나 오늘은 찾을 수가 없을 듯.


코드는, 일단 전체 랜선 길이의 합을 원하는 갯수의 케이블 수로 나누어 기준이 되는 길이를 1차로 구한 후에 거기서 몇 개의 랜선이 나오는지 구한 후 추가로 필요한 랜선의 갯수를 보정하는 방식으로 풀었다.

단순히 길이를 하나씩 바꾸어가면서 찾을 수도 있으나, 계산을 통해 찾는 방법을 선택.


아래는 코드 

import java.util.*;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int demandNum = sc.nextInt();
		int[] cableArray = new int[num];
		int[] cableNumArray = new int[num];
		System.out.println(cableNumArray.length +" "+cableArray.length);
		long totalCabLen = 0;
		for(int i = 0; i < num; i++) {
			cableArray[i] = sc.nextInt();
//			cableArray[i] = (int)(Math.random()*Integer.MAX_VALUE);
			totalCabLen += cableArray[i];
		}
		Arrays.sort(cableArray);
		int maxLen = (int) (totalCabLen/demandNum);
		int curNum=0;
		for(int j = 0; j < num; j++) {
			curNum += cableArray[j]/maxLen;
			cableNumArray[j] = cableArray[j]/maxLen +1;
			cableNumArray[j] = cableArray[j]/cableNumArray[j];
		}
		if(curNum == demandNum) {
			System.out.println(maxLen);
		}
		else {
			Arrays.sort(cableNumArray);
			System.out.println(cableNumArray[num-demandNum+curNum]);
		}
	}
}