[백준] 11582: 치킨 TOP N - JAVA
https://www.acmicpc.net/problem/11582
풀이
구간을 나눠 정렬해주면 되는 간단한 문제였다.
N/k 길이 씩 구간을 정해 그 구간을 정렬하여 출력한다.
임시로 배열이나 리스트를 만들고 구간의 값을 넣은 뒤 정렬해주었다.
임시로 저장할 공간을 만들 때 세가지 경우를 실험해 보았다.
배열을 매번 새로 선언.
리스트를 전역으로 선언하고 매번 list를 clear.
리스트를 매번 새로 선언.
배열을 매번 선언하는 것이 메모리, 시간이 모두 적게 나왔다.
리스트의 clear를 이용하는 것보다 매번 선언하는 것이 시간이 적게 걸렸다.
리스트의 clear함수는 리스트를 돌면서 null로 채우는 방식인데 list의 사이즈가 클 때는 clear보다 새로 선언하는 것이 더 빠르다.
배열 선언
메모리: 131752KB
시간: 1304ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[] arr;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int k = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i += (N / k)) {
doSort(i, i + N / k);
}
System.out.println(sb);
}
private static void doSort(int start, int end) {
int[] tmp = new int[end - start];
for (int i = start; i < end; i++) {
tmp[i - start] = arr[i];
}
Arrays.sort(tmp);
for (int i = 0; i < end - start; i++) {
sb.append(tmp[i]).append(" ");
}
}
}
리스트 clear
메모리: 181588KB
시간: 1480ms
언어: Java 11
코드
static List<Integer> tmp = new ArrayList<>();
private static void doSort(int start, int end) {
for (int i = start; i < end; i++) {
tmp.add(arr[i]);
}
Collections.sort(tmp);
for (int i = 0; i < end - start; i++) {
sb.append(tmp.get(i)).append(" ");
}
tmp.clear();
}
리스트 선언
메모리: 204832KB
시간: 1456ms
언어: Java 11
코드
private static void doSort(int start, int end) {
List<Integer> tmp = new ArrayList<>();
for (int i = start; i < end; i++) {
tmp.add(arr[i]);
}
Collections.sort(tmp);
for (int i = 0; i < end - start; i++) {
sb.append(tmp.get(i)).append(" ");
}
}