728x90
728x90
문제
정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)
둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
출력
X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.
예제 입력 1
10 5
1 10 4 9 2 3 8 5 7 6
예제 출력 1
1 4 2 3
출처
- 문제의 오타를 찾은 사람: jh82582, thinksong1
알고리즘 분류
- 구현
문제 출처
https://www.acmicpc.net/problem/10871
문제 해결 방법
- 동적 할당(Dynamic Allocation)을 사용하여 문제를 해결하였다.
- 입력 받은 N의 값으로 A 객체의 크기를 동적 할당한 후, for 문을 이용하여 N개의 값을 입력 받는다.
- 다시 for 문을 이용하여 순회를 하며 크기가 X 미만인 수를 공백을 포함하여 출력한다.
코드
① malloc()을 이용하여 동적 할당할 경우
#include <iostream>
using namespace std;
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
int *A, N, X;
cin >> N >> X;
A = (int *)malloc(sizeof(int) * N); // Dynamic Allocation
for (int i = 0; i < N; i++) {
cin >> A[i];
}
for (int i = 0; i < N; i++) {
if (A[i] < X) {
cout << A[i] << " ";
}
}
free(A);
return 0;
}
② new 연산자를 이용하여 동적 할당 할 경우
#include <iostream>
using namespace std;
int main() {
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
int N, X;
cin >> N >> X;
int *A = new int(N); // Dynamic Allocation
for (int i = 0; i < N; i++) {
cin >> A[i];
}
for (int i = 0; i < N; i++) {
if (A[i] < X) {
cout << A[i] << " ";
}
}
delete A;
return 0;
}
채점 결과
참고
- [단계별로 풀어보기] > [반복문]
C++에서의 동적 할당 방법
동적 할당(Dynamic Allocation)
- 실행 시간 동안 사용할 메모리 공간을 할당하는 것
- 동적 메모리 할당을 이용하면 배열의 크기를 가변적으로 생성할 수 있다.
- 메모리 영역 중 힙(Heap) 영역에 저장된다.
- 사용자가 원할 때 메모리에 등록시키고, 원할 때 해제시킬 수 있다.
- 동적 할당한 메모리를 해제하지 않을 경우 메모리 누수가 발생한다.
- 프로그램을 종료해도 메모리에 계속해서 상주한다.
- 동적 할당은 C 방식과 C++ 방식으로 나뉜다.
C 기반 동적 할당
- C 기반 동적 할당 방법으로는 malloc(), calloc() 함수를 이용한 방법이 있다.
- 동적 할당을 해제할 때는 free() 함수를 사용한다.
C++ 기반 동적 할당
- C++ 에서는 new 연산자를 사용하여 동적 할당을 수행할 수 있다.
- 힙(Heap) 영역에 자료형의 크기만큼 공간을 할당하고, 자료형의 포인터형으로 주소를 형 변환하여 반환한다.
- 동적 할당을 해제할 때는 delete 연산자를 사용한다.
① malloc() 함수를 이용한 동적 할당
int *pArr;
pArr = (int*)malloc(sizeof(int) * 4);
// int 형 사이즈 * 4 만큼의 메모리를 동적 할당한다.
// 결국, pArr[4] 를 선언하는 것과 같다.
- malloc() 함수로 생성한 동적 메모리는 쓰레기 값으로 초기화가 된다.
- 동적 할당된 메모리를 해제할 때는 free() 함수를 사용한다.
free(pArr); // 동적 할당된 메모리 해제
② calloc() 함수를 이용한 동적 할당
int pArr;
pArr = (int*)calloc(4, sizeof(int));
// int 형 사이즈 * 4 만큼의 메모리를 동적 할당한다.
// 결국, pArr[4] 를 선언하는 것과 같다.
- calloc() 함수로 생성한 동적 메모리는 0으로 초기화가 된다.
- 동적 할당된 메모리를 해제할 때는 free() 함수를 사용한다.
free(pArr); // 동적 할당된 메모리 해제
③ new 연산자를 이용한 동적 할당
int* pArr = new int(4); // 동적 할당과 동시에 초기화
int* pArr = new int[4];
// int 형 사이즈 * 4 만큼의 메모리를 동적 할당한다.
// 결국, pArr[4] 를 선언하는 것과 같다.
- 자료형의 반환값이 주소값이므로 포인터형으로 받아야 한다.
- 동적 할당된 메모리를 해제할 때는 delete 연산자를 사용한다.
delete pArr; // 동적 할당된 메모리 해제
malloc() vs. new 연산자
- malloc() 은 해당 포인터의 타입을 모르기 때문에 반환값의 자료형은 (void *)이다.
- 따라서 malloc() 함수를 사용할 때 int* i = (int*) malloc(sizeof(int) * 3)와 같이 자료형을 앞에 선언해 줘야 한다.
- 하지만 new 연산자는 Type-Safe 로 해당 객체에 맞는 포인터로 반환해 준다.
- 따라서 별도의 자료형 선언을 할 필요가 없다.
- Type-Safe란, 컴파일러가 타입형을 확인해주는 것이다.
- int 형은 int 형으로 String 형은 String 형으로 잘 저장되고 있는지 컴파일러가 확인하는 것이다.
- new 연산자를 이용해 객체를 생성하면 초기 값을 줄 수 있다.
- 예) Test a = new Test(123);
- new 연산자로 객체를 생성하면 생성자(Constructor)가 호출된다.
- 하지만, malloc() 은 생성자 호출 기능이 없어 초기값을 줄 수 없다.
- new 연산자를 통해 객체 생성시 에러가 발생하면 예외 처리(Exception Handling)를 하지만, malloc() 은 예외 처리 없이 NULL 값을 반환한다.
- malloc() 은 realloc() 으로 할당된 메모리 크기를 재조정이 가능하지만, new 연산자는 할당된 크기에 대한 메모리 크기 재조정이 불가능하다.
- new 연산자는 malloc() 함수를 이용하여 구현되었기 때문에 malloc() 함수를 사용하는 방법이 new 연산자를 이용한 방법 보다 빠르다는 의견이 있다.
- delete 연산자와 free() 모두 메모리를 해제한다는 점은 같지만, delete 연산자는 소멸자(Destructor)를 호출해주지만, free()는 소멸자를 호출해주는 기능을 갖고 있지 않다.
참고
https://hwan-shell.tistory.com/12
728x90
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ-10818][C++] 최소, 최대 (0) | 2022.07.10 |
---|---|
[BOJ-1110][C++] 더하기 사이클 (0) | 2022.07.09 |
[BOJ-10951][C++] A+B - 4 (0) | 2022.07.09 |
[BOJ-10952][C++] A+B - 5 (0) | 2022.07.09 |
[BOJ-2439][C++] 별 찍기 - 2 (0) | 2022.07.09 |
[BOJ-2438][C++] 별 찍기 - 1 (0) | 2022.07.09 |
[BOJ-11021][C++] A+B - 8 (0) | 2022.07.09 |
[BOJ-11021][C++] A+B - 7 (0) | 2022.07.09 |