728x90
728x90
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
5 초 | 8 MB | 197399 | 45716 | 34498 | 23.464% |
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
예제 입력 1
10
5
2
3
1
4
2
3
5
1
7
예제 출력 1
1
1
2
2
3
3
4
5
5
7
알고리즘 분류
- 정렬
시간 제한
- Java 8: 3 초
- Java 8 (OpenJDK): 3 초
- Java 11: 3 초
- Kotlin (JVM): 3 초
- Java 15: 3 초
메모리 제한
- Java 8: 512 MB
- Java 8 (OpenJDK): 512 MB
- Java 11: 512 MB
- Kotlin (JVM): 512 MB
- Java 15: 512 MB
문제 출처
https://www.acmicpc.net/problem/10989
문제 해결 방법
- 맨 처음엔 벡터(vector)와 sort() 함수를 이용하여 문제를 해결하려고 하였으나 메모리 초과 오류가 떴다.
- 그래서 다른 방법을 찾아보다가 10,000 보다 작거나 같은 자연수들을 정렬하는 문제임을 확인하고 배열을 이용하여 1부터 10,000까지의 숫자가 각각 몇 번 나오는지를 체크하여 출력시키는 방법을 이용하기로 하였다.
for (int i = 0; i < N; i++) {
cin >> num;
cnt[num]++;
}
for (int i = 0; i < 10001; i++) {
for (int j = 0; j < cnt[i]; j++) {
cout << i << '\n';
}
}
- cnt[i]의 값이 0이 아닐 경우, i를 cnt[i]의 크기 만큼 출력한다.
- 예) 2를 2번 입력 받을 경우, cnt[2]의 값은 2가 된다. 2중 for 문을 돌 때, cnt[2]가 2일 경우, i는 2이므로 2가 2번 출력된다.
- 이번 문제를 풀면서 입력 받는 수의 경우의 수가 적을 경우, 배열을 활용하여 문제를 쉽게 해결할 수 있다는 점을 배울 수 있었다.
- 입력 받은 수를 다 입력 받아서 배열에 저장하여 문제를 풀 경우, 제한된 8MB의 메모리를 초과한다.
- 1 ≤ N ≤ 10,000,000, int 형 : 4 Bytes
- $10^{7} × 4$ Bytes = 40MB
코드
#include <iostream>
using namespace std;
int N, num, cnt[10001];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++) {
cin >> num;
cnt[num]++;
}
for (int i = 0; i < 10001; i++) {
for (int j = 0; j < cnt[i]; j++) {
cout << i << '\n';
}
}
return 0;
}
채점 결과
참고
- [단계별로 풀어보기] > [정렬]
- 브론즈I
728x90
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ-11651][C++] 좌표 정렬하기 2 (0) | 2022.10.30 |
---|---|
[BOJ-11650][C++] 좌표 정렬하기 (0) | 2022.10.29 |
[BOJ-1427][C++] 소트인사이드 (0) | 2022.10.27 |
[BOJ-2108][C++] 통계학 (0) | 2022.10.27 |
[BOJ-2559][C++] 수열 (0) | 2022.10.26 |
[BOJ-11659] 구간 합 구하기 4 (0) | 2022.10.26 |
[BOJ-9020][C++] 골드바흐의 추측 (0) | 2022.10.25 |
[BOJ-4948][C++] 베르트랑 공준 (0) | 2022.10.25 |