Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Tags
more
Archives
Today
Total
관리 메뉴

걸음마부터 달리기

[24/11/27] 정렬 퀵소트 본문

카테고리 없음

[24/11/27] 정렬 퀵소트

성추 2024. 11. 27. 01:23

5648

 

어려운문제는 아니다. 그냥 뒤집고 정렬하고 출력하면 된다.

Arrays.sort(배열)의 시간이 최악의 상황에서도 O(nlogn)이라 그냥 애매하면 내장함수가 젤 빠르니까 이걸 쓰면 되긴 한다.

하지만 퀵소트를 공부하는 입장에서 구현해보고 있기에 내장함수로 한번 , 퀵소트로 한번 구현해봤다.

 

시간은 10^6의 입력값 n에다가 정수가 10^12를 벗어나면 안되니까 내 코드에서는 12자리, 즉 하나의 숫자당 최대 12번을 탐색하면서 숫자를 거꾸로 뒤집는다.

 

정렬할때 브루트포스의 O(n^2)의 짓거리만 안하면 다 통과된다.

 

 

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

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n= Integer.parseInt(st.nextToken());
        long[] arr = new long[n];
        long[] newArr = new long[n];
        int count =0;
        while(count<n){
            while(st.hasMoreTokens()){
                String temp ="";
                String k = st.nextToken();
                for(int i=k.length()-1; i>=0; i--){
                    temp+=k.charAt(i);
                }
                newArr[count++]=Long.parseLong(temp);
            }
            if(count>=n){
                break;
            }
            st=new StringTokenizer(br.readLine());
        }
        quickSort(newArr,0,newArr.length-1);
        for(int i=0; i<newArr.length; i++){
            System.out.printf("%d\n",newArr[i]);
        }
        

        
    }
    public static void quickSort(long[] arr, int start ,int end){
        if(start>=end){
            return;
        }
        int pivot= (end+start)/2;
        swap(arr,start,pivot);
        pivot=start;
        int startIndex=start+1;
        int endIndex=end;
        while(startIndex<=endIndex){
            while(startIndex<=end && arr[startIndex]<=arr[pivot]){
                startIndex++;
            }
            while(endIndex>=start+1 && arr[endIndex]>=arr[pivot]){
                endIndex--;
            }
            if(startIndex<=endIndex){
                swap(arr,startIndex++,endIndex--);
            }
        }
        swap(arr,endIndex,pivot);
        pivot=endIndex;
        quickSort(arr,start,pivot-1);
        quickSort(arr,pivot+1,end);
    }
    
    public static void swap(long[] arr, int a, int b){
        long temp = arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
    }
}

이것은 퀵소트로 푼 풀이.

 

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

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n= Integer.parseInt(st.nextToken());
        long[] arr = new long[n];
        long[] newArr = new long[n];
        int count =0;
        while(count<n){
            while(st.hasMoreTokens()){
                String temp ="";
                String k = st.nextToken();
                for(int i=k.length()-1; i>=0; i--){
                    temp+=k.charAt(i);
                }
                newArr[count++]=Long.parseLong(temp);
            }
            if(count>=n){
                break;
            }
            st=new StringTokenizer(br.readLine());
        }
        Arrays.sort(newArr);
        for(int i=0; i<n; i++){
            System.out.printf("%d\n",newArr[i]);
        }

        
    }
}

내장함수 풀이