[C++/백준 10989번] 수 정렬하기 3 (카운팅 정렬)

2023. 8. 7. 16:36·프로그래밍 공부/백준 (C++)

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

 

10989번: 수 정렬하기 3

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

www.acmicpc.net

 

해결 방법

  카운팅 정렬을 직접 구현해서 해결했다. 시간 제한이 5초에 메모리 제한이 8MB 라는 것은 많이 크지 않은 수들을 정렬하는 것이기 때문에 int 범위 내에서 해결이 가능하다.

  

  카운팅 정렬에 대한 설명은 아래 블로그를 참고했다. 

 

카운팅 정렬(Counting Sort, 계수 정렬) 알고리즘

읽기 전 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다. 개인적으로 사용해보면서 배운 점을 정리한 글입니다. 카운팅 정렬(Counting Sort, 계수 정렬)이란? .주어진 배열의 값

8iggy.tistory.com

메모리 와 시간 제한에 부합하게 구현한 코드

#include <iostream>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);


    int N;
    cin >> N;

    int input[10001] = { 0 };

    for (int i = 0; i < N; i++) {
        int in;
        cin >> in;
        input[in] += 1;
    }

    for (int i = 1; i < 10001; i++) {
        for (int j = 0; j < input[i]; j++) {
            cout << i << '\n';
        }
    }

}

 

 

메모리를 신경쓰지 않고 구현한 코드

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	int N;

	cin >> N;

    int *arr = new int[N];
	
	for (int i = 0; i < N; i++)
	{
		cin >> arr[i];
	}

	int max = -1;
	for (int i = 0 ; i < N ; i++)
	{
		if (max < i)
		{
			max = arr[i];
		}
	}
	
	
	int* cnt = new int[max + 1]{0,};

	
	int i = 0;

	while (i < N)
	{
		cnt[arr[i]]++;
		i++;
	}

	

	i = 1;


	while (i < max)
	{
		cnt[i + 1] = cnt[i] + cnt[i+1];

		i++;
	}



	int* sort = new int[N]{ 0 };

	for (int i = 0; i < N; i++)
	{
		sort[cnt[arr[i]]-1] = arr[i];
		cnt[arr[i]]--;

	}


	for (int i = 0; i < N; i++)
		cout << sort[i] << endl;

	delete[] arr;
	delete[] cnt;
	delete[] sort;
	return 0;
}

 

저작자표시 (새창열림)

'프로그래밍 공부 > 백준 (C++)' 카테고리의 다른 글

[C++/백준 1181번] 단어 정렬  (0) 2023.08.08
[C++/백준 11650번] 좌표 정렬하기  (0) 2023.08.07
[C++/백준 2751번] 수 정렬하기 2  (0) 2023.08.07
[C++/백준 1018번] 체스판 다시 칠하기  (0) 2023.08.04
[C++/백준 19532번] 수학은 비대면 강의입니다.  (0) 2023.08.03
'프로그래밍 공부/백준 (C++)' 카테고리의 다른 글
  • [C++/백준 1181번] 단어 정렬
  • [C++/백준 11650번] 좌표 정렬하기
  • [C++/백준 2751번] 수 정렬하기 2
  • [C++/백준 1018번] 체스판 다시 칠하기
Rocketbabydolls
Rocketbabydolls
Rocketbabydolls
  • Rocketbabydolls
    With The Lights Out
    Rocketbabydolls
  • 전체
    오늘
    어제
    • 전체글 (184)
      • 프로그래밍 공부 (117)
        • C (16)
        • Jumping into C++ (9)
        • MFC (C++) (1)
        • 자료구조 (1)
        • 알고리즘 (1)
        • 백준 (C++) (74)
        • 핸즈온 머신러닝 2판 (6)
        • Unseen 3기 준비 (4)
        • 원티드 포텐업 게임 개발자 양성과정 2기 (4)
      • 언리얼엔진5 (63)
        • [Part1] 이득우의 언리얼 프로그래밍 (12)
        • [Part2] 이득우의 언리얼 프로그래밍 (2)
        • [Part2 복습] 이득우의 언리얼 프로그래밍 (3)
        • [Part3] 이득우의 언리얼 프로그래밍 (14)
        • [Part4] 이득우의 언리얼 프로그래밍 (0)
        • FPS 게임 1인 프로젝트 (6)
        • 각종 지식 (11)
        • 블루프린트 Paper2D 로 게임 만들기 (14)
        • 팀 프로젝트 (1)
      • 일상 (1)
      • ETC (1)
        • 맥북 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      실전C프로그래밍
      실전C프로그래밍 나중채
      c++ 17298
      C언어 실습문제
      c언어
      실전 C 프로그래밍
      언리얼엔진
      실전 C프로그래밍 실습문제
      언리얼엔진5 fps 프로젝트
      핸즈온 머신러닝 2판
      핸즈온 머신러닝
      실전 C프로그래밍
      언리얼엔진 eqs generator
      언리얼엔진 eqs 커스텀
      언리얼엔진5
      티스토리챌린지
      오블완
      실전 C프로그래밍 나중채
      언리얼엔진 eqs c++
      실전C프로그래밍 실습문제
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    Rocketbabydolls
    [C++/백준 10989번] 수 정렬하기 3 (카운팅 정렬)
    상단으로

    티스토리툴바