C, C++/공부정리

[백준 그리디 10807] 개수 세기 - 배열 (배열의 크기는 변수로 지정할 수 없다. 배열의 동적할당)

짱짱이_ 2023. 10. 2. 17:07
#include <iostream>
#include <algorithm>

int main()
{
    int n, arr_size;
    int *array;

    scanf("%d", &arr_size);
    array = new int[arr_size];

    for(int i=0; i<arr_size; i++)
    {
        scanf("%d ", &array[i]);
    }

    scanf("%d", &n);

    std::cout << std::count(array, array + arr_size, n);

    delete[] array;

    return 0;
}

 

배열

 어떤 자료형에 대해 요소들을 연속적으로 저장해, 처리하기 쉽게 하는 것

 

  • 배열은 선언할 때 크기가 지정되어야 한다. (배열은 정적인 크기를 갖는다.)
    이때 배열의 크기는 양의 정수인 상수로 넣어줘야 하며 변수로 지정해줄 수 없다.
변수로 배열의 크기를 지정할 수 없는 이유는 배열은 스택 메모리에 할당되기 때문이다.

스택(Stack): 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다. 함수의 호출과 함께 할당돼 함수의 호출이 완료되면 소멸한다.
- 후입선출(LIFO, Last-In First-Out) 방식으로 가장 늦게 저장된, 최근에 들어온 데이터가 가장 먼저 꺼내진다.
- 정적 메모리를 할당하며 컴파일 타임에 결정된다.

 

 

  • 배열의 크기를 명시하지 않고 정의할 수 있다. 배열 요소를 직접 써줌으로써 크기를 알 수 있기 때문이다.
int arr[] = {1,2,3};  // 크기가 3인 배열 선언
int arr[3];  // 배열 요소를 쓰레기값으로
int arr[3] = {0};  // 배열 요소를 모두 0으로

 

 

  • 배열의 이름은 배열의 시작 주소를 가지고 있다.
  • 배열의 크기를 동적으로 만들고 싶을 때 포인터를 이용한 동적할당 또는 벡터 클래스(C++)를 사용한다.
    C++에서는 malloc() 함수 말고 new를 이용해 배열을 동적으로 이용할 수 있다.
int *array = new int[array_size];

위에서 먼저 입력받은 array_size만큼 배열을 동적으로 생성한다. new를 이용하면 사용이 끝난 후 delete를 이용해 메모리를 해제해주어야 한다.

 

 

  • std::count를 이용해 배열에 요소가 포함되는지 확인할 수 있다.