문제
문제 링크
접근
- N 범위는 그렇게 크지 않아서 모든 순열을 조회하며 분기하는 풀이를 떠올렸다. 그런데 시간 복잡도가 O(N^3) 수준이라 배제하였다.
- 백준의 [ 가장 ~~ 수열 ] 시리즈의 접근법이 떠올라 dp를 떠올렸고, 전혀 다른 풀이였지만 해결하였다.
- 최종적으로 시간복잡도는 O(NlogN)가 되었고, 넉넉하게 통과하였다.
풀이
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
int[] nums = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) nums[i] = Integer.parseInt(st.nextToken());
long answer = 0;
int[] dp;
for (int i = 0; i < N-2; i++) {
dp = new int[N];
int curr = nums[i];
dp[N-1] = curr < nums[N-1] ? 0 : 1;
for (int j = N-2; j > i; j--) {
if (curr > nums[j]) {
dp[j] = dp[j+1] + 1;
continue;
}
dp[j] = dp[j+1];
answer += dp[j];
}
}
System.out.println(answer);
}
}