알고리즘/알고리즘 문제풀이

10989번 : 수 정렬하기 3

mint* 2023. 3. 15. 15:18
728x90

https://www.acmicpc.net/problem/10989

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

 

Counting Sort(기수 정렬)을 사용하는 문제이다!

 

기수 정렬에 대한 자세한 설명은 아래 블로그에 잘 나와있다.

https://bowbowbow.tistory.com/8

 

Counting Sort : 계수 정렬

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

bowbowbow.tistory.com

 

Counting Sort(기수 정렬)

1. cnt 배열을 만들어 빈도수를 저장한다. cnt[수]=수의 빈도수

2. cnt 배열을 누적합으로 만들어 cnt 배열의 값이 각 인덱스와 연관되게 한다.

2. 작은 수부터 큰 수까지 읽어가며 빈도수가 커질때(빈도수가 존재할때) 값을 출력한다.

 

코드

#include <bits/stdc++.h>

using namespace std;
#define count aaa
const int MAX=10000;
int n, temp,count[MAX+4];
int main()
{
    ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
    //1. n개의 숫자 입력받기
    cin >> n;
    for(int i=1;i<=n;i++){
        cin>>temp;
      count[temp]++; //숫자 개수 세기:숫자-숫자개수
    } 
    //2. 누적합 만들기
    for(int i=1;i<=MAX;i++){
        count[i+1]= count[i]+count[i+1]; //인덱스-누적합
    }
    //3. 앞에서부터 빈도수 존재하면 출력
    for(int i=1;i<=MAX;i++){
       while(count[i-1]<count[i]){
          cout << i<<"\n";
          count[i-1]++; //하나씩 출력할때마다 영향을 받지 않는 i-1의 빈도수를 늘려서 i와 같아질때 종료한다. 
      }
    }

    return 0;
}

 

728x90