기본 알고리즘 공부 겸 숫자 정렬 문제를 풀어보고 있었습니다.
위 문제에 대해 제가작성한 답은 아래와 같습니다:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void arraysort(vector<int>& array, int length)
{
for (int i = 0; i < length; i++)
{
for (int j = i + 1; j < length; j++)
{
if (array[i] > array[j])
swap(array[i], array[j]);
}
}
}
int main()
{
int size;
cin >> size;
if (size < 1 || size > 10000000)
return 1;
vector<int> array(size);
for (int i = 0; i < size; i++)
{
cin >> array[i];
if (array[i] > 10000)
return 1;
}
arraysort(array, size);
for (int i = 0; i < size; i++)
cout << array[i] << '\n';
return 0;
}
간단한 selection sort를 이용한 문제풀이 방법입니다.
실제로 돌려보시면 잘 동작합니다.
2020.05.08 추가: 이 풀이는 2750. 수 정렬하기 문제의 답이었더라구요 ㅎㅎ 바로 제출해서 정답 판정 받았습니다.
그런데 문제는 백준 채점서버에서는 계속 '메모리 초과' 로 오답 처리가 되고 있네요.
메모리 제한은 8MB라고 하는데, 이를 코드 작성 중 및 테스트 할 때 어떻게 확인해 볼 수 있을지 궁금합니다.
이에 대해 답변을 다음과 같이 찾았습니다.
"모든 입력을 배열에 저장하면 당연히 메모리 초과가 발생한다."
라는 힌트를 얻을 수 있는데,
입력을 배열에 저장하지 않고 정렬할 수 있는 알고리즘엔 무엇이 있을까요?
counting sort, 한국어로는 계수 정렬이라고 하는 알고리즘이 있다고 합니다.
저는 배웠는데 까먹은건지, 처음 보는 건지 기억에는 없네요... ㅋㅋ
Counting sort는 O(n) 의 상당히 빠른 시간복잡도를 가진다고 합니다.
간단하게 말해서, 각 원소가 몇 번씩 등장하는지 세어 기록합니다.
이후 각 원소별로 세었던 순서만큼을 출력하는 것이죠.
더 자세한 설명은 이곳을 참고해 주세요.
그리하여 제가 새로 작성한 코드는 아래와 같습니다:
#include <iostream>
using namespace std;
#define ARRAY_SIZE 10000
int array[ARRAY_SIZE] = { 0, };
int main()
{
ios_base::sync_with_stdio(false);
int trial, input, maximum = 0;
cin >> trial;
for (int i = 0; i < trial; i++)
{
cin >> input;
array[input]++;
if (input > maximum)
maximum = input;
}
for (int i = 0; i <= maximum; i++)
{
while(array[i])
{
cout << i << '\n';
array[i]--;
}
}
return 0;
}
상당히 짧고 간단하죠?
10000개의 크기를 가진 배열을 먼저 만들고 (각 원소의 최댓값이 10000이므로),
모든 배열의 내용을 0으로 초기화한 후에,
한번 숫자를 입력받을 때마다 해당 배열의 값을 1 증가시킨 후,
배열의 값만큼 해당 원소의 인덱스값을 출력하는 코드예요.
이렇게 보면 정말 간단한데
저는 막 2차원 배열, 동적 벡터 등등으로 접근했다가 엄청 고생했네요 ㅠㅠ
이렇게 한 문제 계속 틀린 적도 처음 같아요... ㅋㅋ
그래두 이렇게 시도하면서 배우는 과정이 즐겁네요
덕분에 늘게 된 vector STL에 대한 지식...
'알고리즘, 문제해결 > 알고리즘 문제풀이' 카테고리의 다른 글
[백준 1339번] 단어 수학 (0) | 2020.11.06 |
---|---|
[백준 17497번] 계산기 (0) | 2020.11.05 |
[백준 1202번] 보석 도둑 (0) | 2020.10.12 |
[백준 1463번] 1로 만들기 (0) | 2020.05.08 |
[백준 2751번] 수 정렬하기 2 (0) | 2020.05.08 |
댓글