M개의 긴 파이프의 숫자와 길이가 주어지고 N개의 짧은 파이프의 숫자와 길이가 주어질 때
N개의 파이프 중 만들 수 있는 최댓값을 구하는 문제이다.
인풋, 아웃풋은 txt파일을 수정해야 해서 class내에서 random함수를 돌려 파이프의 갯수와 길이를 생성하도록 하였다.
문제는, return값이 계속 1이 나온다는 것인데
중간값을 모조리 출력해 보니 최댓값이 잘 증가하다가 마지막에 내리막을 타고 1까지 다시 감소하고 있다.
실제 변수들을 써가면서 따라가봐야 할 것 같다.
코드의 어느 부분이 잘못되었는지 아직 발견하지 못하는 중
아래는 결과가 제대로 출력되지 않는 코드.
public class Pipe {
int[] longPipe, shortPipe;
public Pipe(int[] longPipe, int[] shortPipe) {
this.longPipe=longPipe;
this.shortPipe=shortPipe;
}
public Pipe gotOneFromLong (Pipe pipe, int i, int j) {
pipe.longPipe[i]=pipe.longPipe[i]-pipe.shortPipe[j];
pipe.shortPipe[j]=0;
return pipe;
}
public int maximizePipe(Pipe pipe, int numberOfCurrentPipe) {
int l=pipe.longPipe.length, s=pipe.shortPipe.length;
int maxNumOfPipe=numberOfCurrentPipe;
for(int i=0;i<l;i++) {
for(int j=0;j<s;j++) {
if(pipe.shortPipe[j]==0 || pipe.longPipe[i]<pipe.shortPipe[j])
continue;
if(maxNumOfPipe<maximizePipe(gotOneFromLong(pipe,i,j),numberOfCurrentPipe+1))
maxNumOfPipe=maximizePipe(gotOneFromLong(pipe,i,j),numberOfCurrentPipe+1);
}
}
return maxNumOfPipe;
}
public static void main(String[] args) {
long start=System.currentTimeMillis();
int numOfLong, numOfShort;
numOfLong=(int)(Math.random()*50)+1;
numOfShort=(int)(Math.random()*1023)+1;
int[] longPipe=new int[numOfLong], shortPipe=new int[numOfShort];
for(int i=0;i<numOfLong;i++) {
longPipe[i]=(int)(Math.random()*10000)+90000;
System.out.printf("%d ", longPipe[i]);
}
System.out.println();
for(int i=0; i<numOfShort;i++) {
shortPipe[i]=(int)(Math.random()*128)+1;
System.out.printf("%d ",shortPipe[i]);
}
System.out.println();
Pipe pipe=new Pipe(longPipe, shortPipe);
System.out.println(pipe.maximizePipe(pipe, 0));
System.out.println((System.currentTimeMillis()-start)/1000.0);
}
}