본문 바로가기

알고리즘

JAVA 백준2751 수 정렬하기2(BOJ2751)(cpu 초당 연산속도)

문제 링크 : https://www.acmicpc.net/problem/2751

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

알고리즘을 직접 구현한다면 쉽지않은 문제겠지만

java api를 사용한다면 그렇게 어려운 문제는 아니다.

하지만 백준에서 이런 문제를 넣은건 시간복잡도에 대해서도 고민하면서 문제를 풀라고 충고를 하는게 아닐까?

문제 자체는 https://pilming.tistory.com/5?category=933966 

 

JAVA 백준2750 수 정렬하기(BOJ2750)

문제링크 : https://www.acmicpc.net/problem/2750 2750번: 수 정렬하기 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정..

pilming.tistory.com

문제와 동일하지만 차이점은 주어진 수의 갯수가 많아졌다 그만큼 연산횟수도 늘어나겠지

보통 cpu는 초당 1억번의 연산을 한다고 가정하면 된다고한다.

그런의미에서 위의 내 글에서 말한것처럼 Arrays.sort() 는 평균적으로 NlogN의 시간복잡도를 갖기때문에

주어진 수로 계산해보면 1000000 * log1000000 하면 6백만으로 시간제한인 2초안에 충분하지만

Arrays.sort() 는 평균적으로 NlogN이고 최악의 경우 N^2 의 시간복잡도를 갖기때문에

아마 백준에서 최악의 경우 테스트케이스 있는것같다.

최악의 경우 1000000^2 = 1조 번의 연산이 필요하기때문에 시간제한인 2초로는 불가능하다.

그래서 여러가지 대안이 있겠지만 내가 사용한건 Collections.sort() 이다.

이건 정렬알고리즘으로 Tim Sort를 사용하기땜문에 이건 최악의 경우에도 NlogN의 시간복잡도를 갖는다

import java.io.*;
import java.util.*;

public class Main {
    static FastReader scan = new FastReader(); // 입력
    static StringBuilder sb = new StringBuilder(); //제출답안

    static int N;
    static ArrayList<Integer> list;

    static void input() { //입력함수
        N = scan.nextInt();

        list = new ArrayList<>();

        for(int i =0; i < N; i++) {
            list.add(scan.nextInt());
        }

    }

    public static void main(String[] args) {
        input(); // 입력

        //Arrays.sort(list);
        Collections.sort(list);

        for(int i = 0; i < N; i++) {
            sb.append(list.get(i));
            sb.append('\n');
        }
        System.out.println(sb.toString());
    }


    //류호석 강사님 템플릿
    static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        public FastReader(String s) throws FileNotFoundException {
            br = new BufferedReader(new FileReader(new File(s)));
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        long nextLong() {
            return Long.parseLong(next());
        }

        double nextDouble() {
            return Double.parseDouble(next());
        }

        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }
}