강의로 돌아가기
안지민

효율성 테스트를 전부 실패하네요, 제귀구현입니다.

시간에서 전부 실패하는데, 어느 부분을 고쳐야 할까요 ㅠㅠ

작성중인 코드―Solution.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.*;
class Solution {


    static ArrayList<Integer> arr = new ArrayList<Integer>();
    static int cnt = 0;
    static boolean[] check;
    public static void dfs(int[] answer, int n, long k){


        if(arr.size() == n){
            cnt++;
            if(cnt == k){
                for(int i = 0 ; i < arr.size(); i++){
                    answer[i]= arr.get(i);
                }
            }
        }
        else{
            for(int i = 1; i <=n; i++){
                if(check[i] == false){
                    check[i] = true;
                    arr.add(i);
                    dfs(answer, n,k);
                    arr.remove(arr.size() - 1);
                    check[i] = false;
                }
            }
        }

    }

  public int[] solution(int n, long k) {


      int[] answer = new int[n];
      ArrayList<Integer> arr = new ArrayList<Integer>();
      check = new boolean[20];
      dfs(answer , n , k);
      return answer;
  }
}
2 개의 답변
정무영

모든 순열을 구하려 하지 마시고

특정 위치의 순열 하나만 구하는 방식으로 해보세요

손으로 직접 숫자 나열해 보시면 규칙이 보이실 거에요

Jang Sungil

이진탐색처럼 순서가 정렬되어 있는 구간마다 탐색을 빨리할 수 있는 방법을 생각하면 효율성이 통과될 것 같습니다.
예시문제처럼 [3,5] 주어지면 답이 [3,1,2] 일때 앞에서부터
모든 경우의 수는 정렬되어 있으므로

[1,x,x]~[3,x,x]에서 k 번째 위치하는 구간을 탐색. 5~6번 위치하는 3선택
-> [3,1,x]~[3,2,x] 아래에서 k 번째 위치하는 구간을 탐색. 5번째 위치하는 1선택
-> [3,1,2] 아래에서 2 을 찾고 종료

  • catnip

    참고가 되었습니다. 감사합니다.

    catnip―2024.05.07 19:05
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.