교재를 참고하여 코드를 작성하였습니다. 답안을 제출하면 시간 초과가 나오고 있습니다. 일단 테스트케이스 받기전에 너비탐색을 통해 모든 순열에 대한 연산의 수를 계산한 후에 각각에 테스트 케이스의 정답을 solve 함수를 통해 출력하는 방식으로 짰습니다. 혹시 제가 잘못 이해한 부분이 있거나 잘못 코딩한 부분이 있으면 답변부탁드리겠습니다.
importjava.util.Collections;importjava.util.HashMap;importjava.util.LinkedList;importjava.util.Queue;importjava.util.Scanner;importjava.util.Vector;publicclassMain{staticHashMap<Vector<Integer>,Integer>toSort=newHashMap<>();publicstaticvoidmain(String[]args){// TODO Auto-generated method stubScannersc=newScanner(System.in);intT=sc.nextInt();sc.nextLine();inttest_case;for(inti=1;i<=8;i++)precalc(i);for(test_case=0;test_case<T;test_case++){intsize=sc.nextInt();sc.nextLine();Vector<Integer>perm=newVector<Integer>();for(inti=0;i<size;i++)perm.addElement(sc.nextInt());sc.nextLine();intresult=solve(perm);System.out.println(result);}}publicstaticvoidprecalc(intn){Vector<Integer>perm=newVector<Integer>();for(inti=0;i<n;i++)perm.add(i);Queue<Vector<Integer>>q=newLinkedList<Vector<Integer>>();q.offer(perm);toSort.put(perm,0);while(!q.isEmpty()){Vector<Integer>here=q.peek();q.poll();intcost=toSort.get(here);for(inti=0;i<n;i++)for(intj=2;j<=n;j++){reverse(here,i,j);Vector<Integer>there=newVector<Integer>();there.addAll(here);if(!toSort.containsKey(there)){toSort.put(there,cost+1);q.offer(there);}reverse(here,i,j);}}}publicstaticintsolve(Vector<Integer>perm){intn=perm.size();Vector<Integer>fixed=newVector<Integer>();fixed.setSize(n);for(inti=0;i<n;i++){intsmaller=0;for(intj=0;j<n;j++)if(perm.get(j)<perm.get(i))smaller++;fixed.set(i,smaller);}returntoSort.get(fixed);}publicstaticvoidreverse(Vector<Integer>here,intstart,intend){Vector<Integer>temp=newVector<Integer>();for(inti=end-1;i>=start;i--){temp.addElement(here.get(i));}for(inti=0;i<end-start;i++)here.set(i+start,temp.get(i));}}
구현한 해결방법의 방향은 바람직해보입니다. 확인해보니 pre-calculation 과정에서 대부분의 시간이 소요되고 이로 인해 시간초과가 발생하는 것 같습니다. 시도 해보진 않았지만, 해당 방법에 약간의 수정으로 속도의 향상을 기대하는 방법은 reverse 함수를 보다 효율적으로 작성하는 방법이 있습니다. 또한, 통과된 Java solution을 기반하여 봤을 경우 HashMap 대신에 integer로 상태공간을 encoding하는 방법이 있습니다.
모든 테스트 케이스를 다 만들어두고 계산을 하는 방식인듯 보입니다. 그리고 전제를 테스트값이 무조건 8개 들어온다고 잡으신거 같은데요. 테스트값은 1~8개가 들어오도록 되어있습니다.
그리고 테스트 케이스를 다 만든다는건 8^8정도 되는거 같은데요.
테스트 케이스를 만드는시간이 2초는 무조건 넘습니다.
skghtjr2
교재를 참고하여 코드를 작성하였습니다. 답안을 제출하면 시간 초과가 나오고 있습니다. 일단 테스트케이스 받기전에 너비탐색을 통해 모든 순열에 대한 연산의 수를 계산한 후에 각각에 테스트 케이스의 정답을 solve 함수를 통해 출력하는 방식으로 짰습니다. 혹시 제가 잘못 이해한 부분이 있거나 잘못 코딩한 부분이 있으면 답변부탁드리겠습니다.
문제링크
https://algospot.com/judge/problem/read/SORTGAME
8년 전