본문 바로가기

백준/C++

[C++] 백준 10871번 - X보다 작은 수

728x90

 

이번에는 동적할당에 대한 문제를 풀어보고 싶어서 이 문제를 가져와보았다.

 

 

문제 10871번

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

 

10871번: X보다 작은 수

첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

문제 자체는 간단하다. 정수 N개로 이루어진 수열 A에서 X보다 작은 수를 모두 출력하면 되는 문제이다. 그런데 여기서 그냥 num[10000] 이런 식으로 배열의 최대 크기만큼 설정해준다면 메모리 낭비가 생긴다. 그러므로 동적할당을 해주는 것이 좋다. 동적할당은 미리 배열의 크기를 설정해놓는 것이 아니라 프로그램을 실행할 때 정해줄 수 있다. 

동적할당을 하기 위해서는 동적할당 메모리를 새로 만드는 new와 동적할당 했던 메모리를 지우는 delete를 사용하면 된다.

 

int *num = new int [10];

이런 식으로 작성하면 int의 10개 크기만큼 메모리를 만들어준다. 만들어진 메모리의 주소는 num에 할당되게 된다.

그런데 계속 이런식으로 사용하다보면 메모리를 해제해주는 부분이 없어서 계속 쌓이기만 하다 메모리가 낭비된다.

그래서 delete를 사용해주는 것이다.

없앨 메모리 포인터가 배열이 아닐 경우에는 'delete 없앨메모리포인터', 동적할당된 메모리가 배열일 경우에는 앞에 []를 작성해서 'delete []없앨메모리포인터'로 작성해준다.

 

#include <iostream>
using namespace std;

int main() {
	int N, X;
	cin >> N >> X;
	int *num = new int[N];
	for (int i = 0; i < N; i++) {
		cin >> num[i];
	}
	for (int i = 0; i < N; i++) {
		if (num[i] < X) {
			cout << num[i] << ' ';
		}
	}
	delete num;
}

 

 

 

음... 동적할당을 사용할 수 있는 문제라길래 하긴 했지만...

뭔가 동적할당을 사용하다가 생각난 풀이가 개인적으로는 더 좋은 것 같다.

 

수열 A를 차례로 입력받을 때, X와 비교해서 X보다 작으면 바로 출력해주는 방법이다.

#include <iostream>
using namespace std;

int main() {
	int N, X, A;
	cin >> N >> X;
	for (int i = 0; i < N; i++) {
		cin >> A;
		if (A < X) {
			cout << A << ' ';
		}
	}
}

 

 

728x90

'백준 > C++' 카테고리의 다른 글

[C++] 백준 1072번 - 게임  (0) 2024.03.27
[C++] 백준 1789번 - 수들의 합  (0) 2024.03.25
[C++] 백준 10773번 - 제로  (2) 2024.03.24
[C++] 백준 4963번 - 섬의 개수  (2) 2024.03.22
[C++] 백준 1697번 - 숨바꼭질  (2) 2024.03.07