문제 : https://www.acmicpc.net/problem/1722
Key Point
N의 범위 : 0<=N<=20
그래서 next_permutation 함수를 구현해서 문제를 풀려고 하였는데, 시간초과가 발생하여서
다른 방식으로 풀어야 한다.
Explain
Code
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| public class Exam1722 {
public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int num = sc.nextInt(); int check = sc.nextInt(); long[] fac = new long[num+1]; boolean[] c = new boolean[num+1]; fac[0] = 1; for(int i=1;i<=num;i++) { fac[i] = fac[i-1] * i; } // 팩토리얼 구하기 if(check == 1) { long where = sc.nextLong(); int[] arr = new int[num]; for(int i=0;i<num;i++) { for(int j=1;j<=num;j++) { if(c[j] == true) { continue; } if(fac[num-i-1]<where) { where = where - fac[num-i-1]; }else { arr[i] = j; c[j] = true; break; } } } for(int i=0;i<num;i++) { System.out.print(arr[i]+" "); } }else if(check == 2) { int[] arr = new int[num]; for(int i=0;i<num;i++) { arr[i] = sc.nextInt(); } long result = 0; for(int i=0;i<num;i++) { for(int j=1;j<arr[i];j++) { if(c[j] == false) { result = result + fac[num-i-1]; } } c[arr[i]] = true; } System.out.println(result+1); } }
}
|