- 생각
1. 그냥 반복문 O(N^2)만큼 돌리면 시간 초과?? ==>> 시간 초과
2. 이분 탐색으로 하면??
3. Arraylist를 이용해서 max 값과 listsize를 빼가며 값을 정확히 도출하는 방법 ==>> 시간 초과
- 코드
정답 코드 : 이분 탐색으로하면 시간초과 나지 않고 잘 동작한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static long count;
static long[] number, temp;
public static void main(String[] args) throws Exception {
SetData();
Sort(0, N-1);
System.out.println(count);
}
private static void SetData() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = Integer.parseInt(br.readLine());
number = new long[N];
temp = new long[N];
count = 0;
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++)
number[i] = Long.parseLong(st.nextToken());
}
public static void Sort(int start, int end) {
if(start < end) {
int middle = (start+end)/2;
Sort(start, middle);
Sort(middle+1, end);
merge(start,middle,end);
}
}
private static void merge(int start, int middle, int end) {
int startToMidStartIndex = start;
int midToEndStartIndex = middle+1;
int startTempIndex = start;
while(startToMidStartIndex<=middle && midToEndStartIndex<=end) {
if(number[startToMidStartIndex] <= number[midToEndStartIndex]) {
temp[startTempIndex++] = number[startToMidStartIndex++];
}else {
temp[startTempIndex++] = number[midToEndStartIndex++];
count += (middle + 1 - startToMidStartIndex);
}
}
while(startToMidStartIndex<=middle)
temp[startTempIndex++] = number[startToMidStartIndex++];
while(midToEndStartIndex<=end)
temp[startTempIndex++] = number[midToEndStartIndex++];
for(int k=start; k<=end; k++) {
number[k] = temp[k];
}
}
}
'algorithm' 카테고리의 다른 글
[JAVA] 백준 3055번 : 탈출 (0) | 2020.11.13 |
---|---|
[JAVA] 백준 2206번 : 벽 부수고 이동하기 (0) | 2020.11.13 |
[JAVA] 백준 10775번 : 공항 (0) | 2020.11.10 |
[JAVA] 백준 1700번 : 멀티탭 스케줄링 (0) | 2020.11.09 |
[JAVA] 백준 1202번 : 보석 도둑 (0) | 2020.11.09 |