개발후라이
개발후라이
개발후라이
  • 분류 전체보기 (285)
    • Web Front End (74)
      • Javascript & Typescript (26)
      • React (11)
      • Vue (4)
      • Nodejs (1)
      • HTML (6)
      • CSS (7)
      • HTTP (6)
      • 책 - Review (8)
    • TIL (0)
    • Problem Solved (135)
      • 알고리즘 (4)
      • BOJ (67)
      • Programmers (8)
      • HackerRank (33)
      • LeetCode (23)
    • 회고 (4)
      • 오늘의 회고 (16)
      • 주간 회고 (15)
      • 월간 회고 (7)
      • WakaTime (9)
    • Git (3)
    • 기타 (15)
      • 취업 (5)
      • 자격증 (1)

블로그 메뉴

  • GitHub
  • LinkedIn
  • 홈

인기 글

태그

  • 노개북
  • TypeScript
  • 회고
  • 프론트엔드
  • JavaScript
  • 자바스크립트
  • 릿코드
  • 개발자
  • 노마드북클럽
  • 오늘의회고

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
개발후라이

개발후라이

Problem Solved/BOJ

[BOJ][Java] 10989번 - 수 정렬하기 3

2019. 12. 1. 22:16
반응형

문제

수의 범위가 작다면 카운팅 정렬을 사용하여 더욱 빠르게 정렬할 수 있습니다.

10989번 - 수 정렬하기 3
입력된 숫자들을 오름차순 정렬시키는 문제
카운팅정렬 사용하기

문제 설명

  • Counting Sort란? 중복되는 숫자의 개수를 세어 정렬하는 방식

    수의 범위가 커질수록 시간복잡도가 커져 비효율적임

    1. 정렬할 배열에서 최댓값을 구함
    2. 0부터 최댓값까지 각 숫자가 몇 번 등장하는지 카운팅함
    3. 카운팅을 바탕으로 누적카운팅을 함
    4. 누적카운팅은 곧 정렬될 배열의 인덱스가 됨. 뒤에서부터 차례대로 인덱스 값을 계산해 정렬하면 완성
      참고 - Counting Sort : 계수 정렬
      Counting Sort 시뮬레이션 하기

성공 코드

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

public 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];

        for (int i = 0; i < N; i++)
            arr[i] = Integer.parseInt(br.readLine());
        int []ans = countingSort(arr);

        // 출력
        for (int n : ans)
            bw.write(n + "\n");
        br.close();
        bw.close();
    }

    public static int[] countingSort(int[] nums) {
        // 최댓값 찾기
        int max = 0;
        for (int i = 0; i < nums.length; i++) 
            if (max < nums[i])
                max = nums[i];

        int[] ans = new int[nums.length];    //정렬 배열
        int[] cnt = new int[max+1];            //원수 개수 저장 배열

        // 각 원소 개수 저장
        for (int i :  nums) cnt[i]++;

        // 원소 누적 개수 저장
        for (int i = 1; i < cnt.length; i++) 
            cnt[i] += cnt[i-1];

        // cnt 배열을 이용한 정렬
        for (int i = nums.length-1; i >= 0; i--)
            ans[--cnt[ nums[i] ]] = nums[i];

        return ans;
    }
}
반응형
    'Problem Solved/BOJ' 카테고리의 다른 글
    • [BOJ][Java] 5622번 - 다이얼
    • [BOJ][Java] 2908번 - 상수
    • [BOJ][Java] 2751번 - 수 정렬하기 2
    • [BOJ][Java] 2750번 - 수 정렬하기
    개발후라이
    개발후라이
    어제보다 오늘 발전하기 위한 공간 https://github.com/choisohyun

    티스토리툴바