Exercises/파이프 자르기
백준:Pipe 자르기2
sysout.초코우유
2018. 4. 23. 22:26
조금 수정한 코드.
복사를 deep copy로 수정하고, 빠르게 check하는 알고리즘을 한 군데 추가.
하지만 여전히 실행 속도가 느림.
최악의 경우에도 효율이 좋은 방향을 찾아야 함.
package defaultpackage; public class Pipe implements Cloneable{ int[] longPipe, shortPipe; public Pipe(int[] longPipe, int[] shortPipe) { this.longPipe=longPipe; this.shortPipe=shortPipe; } public int arraySum(int[] array) { int sum=0; for(int temp:array) sum+=temp; return sum; } // the input array is treated a sorted one find the first nonzero location public int countNonZero(int[] array) { int counter=0; for(int temp:array) { counter++; if(temp!=0) return array.length-counter; } return counter; } public Pipe clone() { return new Pipe(longPipe.clone(),shortPipe.clone()); } public void print() { int sum1=0, sum2=0; for(int temp:longPipe) { System.out.printf("%d ", temp); sum1+=temp; } System.out.println(); for(int temp2:shortPipe) { System.out.printf("%d ", temp2); sum2+=temp2; } System.out.printf("%n==============%n"); System.out.printf("Long: %d, Short: %d",sum1,sum2); } public boolean fastCheck() { if(arraySum(longPipe)<arraySum(shortPipe)) return false; int l=longPipe.length, s=shortPipe.length; int counter=0; for(int i=0;i<s;i++) { for(int j=0;j<l;j++) { if(longPipe[j]>=shortPipe[i]) { longPipe[j]=longPipe[j]-shortPipe[i]; counter++; break; } } } return counter==shortPipe.length; } public int maximizer(int curNumOfPipe) { int l=longPipe.length, s=shortPipe.length; int maxNumOfPipe=curNumOfPipe; int temp=0; Pipe copy=this.clone(); if(copy.fastCheck()) return shortPipe.length; copy=this.clone(); for(int i=0;i<l;i++) { for(int j=0;j<s;j++) { if(shortPipe[j]!=0 && longPipe[i]>=shortPipe[j]) { copy.longPipe[i]=copy.longPipe[i]-copy.shortPipe[j]; copy.shortPipe[j]=0; temp=copy.maximizer(curNumOfPipe+1); if(maxNumOfPipe<temp) maxNumOfPipe=temp; copy.longPipe[i]=copy.longPipe[i]+shortPipe[j]; copy.shortPipe[j]=shortPipe[j]; } } } return maxNumOfPipe; } public static void main(String[] args) { int numOfLong, numOfShort; Sort s=new Sort(); numOfLong=(int)(Math.random()*50)+1; numOfShort=(int)(Math.random()*100)+1; int[] longPipe=new int[numOfLong], shortPipe=new int[numOfShort]; for(int i=0;i<numOfLong;i++) longPipe[i]=(int)(Math.random()*1000); for(int i=0; i<numOfShort;i++) shortPipe[i]=(int)(Math.random()*128)+1; long start=System.currentTimeMillis(); Pipe pipe=new Pipe(s.sort(longPipe), s.sort(shortPipe)); pipe.print(); System.out.println(pipe.maximizer(0)); System.out.println((System.currentTimeMillis()-start)/1000.0); } }