[백준,BOJ 10989] 수 정렬하기 3( JAVA 구현)

2020. 11. 10. 13:50·CodingTest/백준 온라인 저지(BOJ)
반응형

 -풀이

  이 문제에 대한 설명으로 계수 정렬을 사용하라고 나와있다. 계수 정렬은  O(n + k)의 시간 복잡도를 가지며, 여기서 k는 정렬을 해야하는 데이터 중 가장 큰 값을 의미한다. 만약 k가 n보다 작은 수이면 O(n)이 되지만, k가 n보다 매우 큰 수이면 O(무한)이 될 수도 있다. 예를 들어 10개의 숫자를 정렬하는 데, 가장 큰 숫자가 100일 경우, O(n^2)이 된다. 100(k)은 10(n)의 제곱이므로. 1000이면 O(n^3)이 된다. 즉 정렬할 수들의 최댓값에 영향을 받는 알고리즘이라고 볼 수 있다.

 

  즉, 정렬해야 하는 데이터의 범위가 적을수록 효율적인 성능을 보여주는 알고리즘이라 할 수 있다. 그리고 실제로 이 문제에서는 이전 수 정렬하기2 문제의 데이터 범위인 1,000,000과는 다르게 10,000이라는 작은 범위의 데이터가 입력으로 주어진다는 사실을 알 수 있다. 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

class Main {
  public static void main(String[] args) throws IOException {
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    int n = Integer.parseInt(br.readLine());
    int arr[] = new int[n]; // 데이터 저장 배열
    int count[] = new int[10001]; // 데이터의 범위 배열, 데이터가 등장하는 횟수를 카운트한다., 등장할 수 있는 데이터의 최댓값 만큼 배열을 선언해주어야 한다.
    int result[] = new int[n]; // 최종 정렬 데이터가 저장될 배열
    
    for(int i=0;i<arr.length;i++) { // 데이터를 입력받는 반복문
    	int num = Integer.parseInt(br.readLine());
    	arr[i] = num; // 데이터를 데이터 저장 배열에 저장
    	count[num]++; // 해당 데이터를 인덱스로 사용하여 등장하는 횟수를 증가시킨다. 
    }
    
       
    for(int i=1;i<count.length;i++) { // 데이터의 등장횟수를 누적합하여 구한다.
    	count[i]+=count[i-1];
    }
    
    for(int i = arr.length-1;i>=0;i--) { // 데이터의 배열 마지막 인덱스부터 반복한다.
    	result[--count[arr[i]]] = arr[i]; // 최종 정렬 배열에 정렬한다.
    }
    
    for(int i=0;i<result.length;i++) { // 출력
    	bw.write(String.valueOf(result[i])+"\n");
    }
    
    
    bw.flush();
    bw.close();
    
  }
}

  계수 정렬에 대한 자세한 설명은 아래의 블로그를 참고하면 좋을 것 같다. 

 

Counting Sort : 계수 정렬

Counting Sort Counting Sort Counting Sort 소개 정렬 과정 애니메이션 예시 구현 정리 끝 소개 Counting Sort 는 정렬 알고리즘으로 의 시간복잡도를 갖습니다. 반면 일반적 상황에서 가장 빠른 정렬 알고리즘.

bowbowbow.tistory.com

  또한 위의 블로그에서도 확인할 수 있는 내용으로 데이터를 인덱스로 하여 등장횟수를 카운팅 한 배열을 순서대로 꺼내는 방식 또한 정렬을 할 수 있지만, 데이터의 범위 사이의 간극이 클수록 비효율적이기 때문에 위와 같은 방식으로 정렬하는 것이 좋다고 한다. 

저작자표시 (새창열림)
'CodingTest/백준 온라인 저지(BOJ)' 카테고리의 다른 글
  • [백준,BOJ 1427] 소트인사이드(JAVA 구현,재풀이)
  • [백준,BOJ 2108] 통계학(JAVA 구현, 재풀이)
  • [백준,BOJ 2751] 수 정렬하기 2( JAVA 구현, 재풀이)
  • [백준,BOJ 2750] 수 정렬하기(JAVA 구현)
뜸부깅
뜸부깅
코딩에 대한 여러 개인적인 생각을 정리하고 공부를 하는 공간입니다!!
  • 뜸부깅
    코오오딩
    뜸부깅
  • 전체
    오늘
    어제
    • Note (429)
      • Skill (31)
        • Java & Spring (9)
        • Javascript & HTML & CSS (0)
        • React (0)
        • Next.js (22)
      • CodingTest (389)
        • 백준 온라인 저지(BOJ) (140)
        • 프로그래머스(Programmers) (79)
        • LeetCode (170)
      • Algorithm & Data Structure (6)
      • [Project] 포트폴리오 (3)
        • Front end (3)
        • Back end (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    component-scan
    BOJ
    boj1427
    프로그래머스
    TypeScript
    meidum
    백준7576
    boj2108
    leetcode 2236
    next 14
    백준1427
    medium
    Easy
    Java
    백준
    백준7576자바
    백준2751
    백준1260
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
뜸부깅
[백준,BOJ 10989] 수 정렬하기 3( JAVA 구현)
상단으로

티스토리툴바