Sorting Game

  • 음매~@
    음매~@

    안녕하세요. 문제를 풀다가 막히는게 있어서 글을 씁니다.
    Sorting Game ( http://algospot.com/zbxe/?mid=aoj&action=problem&no=169 )
    을 푸는 중인데요.
    TLE가 나와서 더빠른 솔루션으로 바꿔보려고 해도 잘 떠오르지 않네요.
    제가 사용한 방법은 처음 상태(처음에 주어지는 N개의 원소로 이뤄진 수열)에서 k={2~N-1}개를 선택해서 뒤짚을 수 있는 모든 케이스를 BFS로 순회하는 방식으로 사용했습니다. 해는 잘 나오는데 시간이 너무 오래걸리네요.
    더 좋은 알고리즘이나 팁 부탁드립니다.
    아래는 제가 구현한 소스에서 탐색하는 부분을 알수없는 슈도 코드로 표현했습니다.(?)

    // N : 주어진 수열의 길이
    // q : queue< vector<int> >, 초기상태 q.push( 처음에 주어진 수열 )
    // sortedInput : 처음에 주어진 수열을 정렬한 백터
    // state : set<vector<int> >, BFS 사이클 방지
    while( !q.empty() ){
            int qsize = (int)q.size();
            for(int cur=0; cur < qsize; ++cur ){ // depth
                    vector<int> &e = q.front();
                    if( e == sortedInput ) { // find sol
                            return result;
                    }
                    vector<int> newNum = e;
                    for(i=0; i < N; ++i){ // 뒤집을 수 있는 모든 경우      
                            for(j=i+1; j < N; ++j){
                                    reverse(newNum.begin()+i, newNum.begin()+j+1);
                                    set<int>::iterator iter = state.find(newNum);  // 중복 순회 방지
                                    if( iter == state.end() ){
                                            q.push(newNum);
                                            state.insert(newNum);
                                    }
                                    reverse(newNum.begin()+i, newNum.begin()+j+1);
                            }
                    }
                    q.pop();
            }
            ++result;
    }
    

    덧1, 소스코드 하일라이팅은 어떻게 하나요..?

    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]

    14년 전
4개의 댓글이 있습니다.
  • Toivoa
    Toivoa

    소스코드 하일라이팅은 소스코드를 [code cpp] [/code] 사이에 쓰시면 됩니다. 


    14년 전 link
  • 음매~@
    음매~@

    감사합니다.


    14년 전 link
  • JongMan
    JongMan

    최단거리를 찾을 때 BFS 보다 빠른 답은 없는 게 맞습니다. ^^; 이 문제의 최대 난점은 테스트 케이스가 굉장히 많다는 것인데.. "테스트 케이스 간" 중복된 계산이 없는지 한번 고민해 보시면 좋을 거 같아요~


    14년 전 link
  • 음매~@
    음매~@

    아하.. 감이 살짝 오네요.
    댓글 감사드립니다. 다시 해봐야겠네요.


    14년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.