티스토리 뷰

Algorithm/BOJ

백준 1427번 C++

poopooreum 2023. 7. 23. 20:58
반응형

백준 1427번 소트인사이드
https://www.acmicpc.net/problem/1427

1427번: 소트인사이드

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net




정답 코드

#include<iostream>
using namespace std;
int arr[10];
int n = 10;
int num;
int main() {
	cin >> num;
	int dx = 0;
	while (num != 0) {
		arr[dx] = num % 10;
		num = num / 10;
		dx += 1;
	}
				for (int x = 1; x < dx; x++) {
			int c = x;
			do {
				int root = (c - 1) / 2;
				if (arr[root] < arr[c]) {
					int temp = arr[root];
					arr[root] = arr[c];
					arr[c] = temp;
				}
				c = root;
			} while (c != 0);
		}
		for (int x = dx - 1; x >= 0; x--) {
			int temp = arr[0];
			arr[0] = arr[x];
			arr[x] = temp;
			int root = 0;
			int c = 1;
			do {
				c = 2 * root + 1;
				if (arr[c] < arr[c + 1] && c < x - 1)
					c++;
				if (arr[root] < arr[c] && c < x) {
					int temp = arr[root];
					arr[root] = arr[c];
					arr[c] = temp;
				}
				root = c;
			} while (c < x);
		}
		for (int x = dx - 1; x >= 0; x--)
			cout << arr[x];
}


문제 해설
배열을 정렬하는 문제입니다. 먼저 입력받은 수를 계속 나누어서 한 자리씩 배열에 집어넣습니다. 그리고 나서
힙 정렬을 이용해서 풀었습니다. 처음에는 퀵 정렬을 이용해서 풀려고 했지만 시간 제한이 2초여서 제외시켰습니다. 퀵 정렬의 경우에는 최악의 경우 시간복잡도가 O(N^2)이고 이를 계산할 경우 10억의 제곱이 됩니다.컴퓨터는 초당1억번의 계산을 할 수 있기 때문에 시간초과가 발생합니다. 그래서 시간복잡도가 더 작은 O(Nlogn)인 힙 정렬을 이용해서 풀었습니다. 그리고 10억개의 배열을 생성하면 메모리 초과가 발생하므로 10칸의 배열만 만든 후 각 자리수에 해당하는 인덱스값을 계속해서 플러스해주었습니다.

반응형

'Algorithm > BOJ' 카테고리의 다른 글

백준 1463번 C++  (0) 2023.07.24
백준 1431번 C++  (0) 2023.07.24
백준 1406번 C++  (0) 2023.07.23
백준 1357번 C++  (0) 2023.07.23
백준 1330번 C++  (0) 2023.07.23
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함