연속된 자료구조

yun·2024년 1월 27일
0

C++

목록 보기
26/41

개념

  • 모든 원소를 단일 메모리 청크(chunk)에 저장
  • 모든 원소가 같은 타입이면, 같은 크기의 메모리를 사용하고, 이는 sizeof(type)으로 표시됨
  • 첫 번째 원소의 메모리 주소를 시작 주소(BA, Base Address)라고 함
  • i번째 원소에 접근하려면 BA + i * sizeof(type)
  • 배열의 전체 크기에 상관없이 모든 원소에 곧바로 접근 가능
  • 데이터 접근 시간이 항상 일정함
  • 빅오(Big-O) 표기법으로 O(1)
  • 배열의 유형
    • 정적 배열(static array)
      • 스택(stack) 메모리 영역에 할당
      • 선언된 블록이 끝나면 소멸
      • int arr[size];
    • 동적 배열(dynamic array)
      • 힙(heap) 영역에 할당, 사용자 직접 해제 전까지 유지
      • 프로그래머가 생성 시점과 해제 시점을 자유롭게 결정
      • int* arr = new int[size];
    • 두 가지 유형 모두 다양한 연산에서 동일한 성능을 나타냄
    • C언어에서 도입되었기 때문에 C스타일 배열이라고도 함
  • 캐시 지역성(cache locality)
    • 첫 번째 원소를 가져온 후 다음 원소는 캐시에서 바로 참조할 수 있으므로 배열은 캐시 지역성이 좋다고 말할 수 있다.

백준 1337번

#include <iostream>
#include <algorithm>

using namespace std;

#define endl '\n'

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int N;
    cin >> N;
    int* A = new int[N];
    for (int i = 0; i < N; i++)
        cin >> A[i];

    sort(A, A + N);
    int ans = 4;
    for (int i = 0; i < N; i++) {
        int* it = lower_bound(A + i, A + N, A[i] + 5);
        ans = min(ans, 5 - static_cast<int>(distance(A + i, it)));
    }

    delete[] A;
    
    cout << ans << endl;
}
  • 동적 배열을 new로 할당하고 delete로 해제
  • lower_bound: 찾으려는 key 값보다 같거나 큰 숫자가 배열 몇 번째에서 처음 등장하는지 찾기 위함 (이 함수를 사용하려면 정렬되어 있어야 하므로 먼저 sort)
    • A[i] + 5와 일치하는 값이 있다면 A[i] + 5의 반복자 리턴
    • 일치하는 게 없다면 A[i] + 5를 초과하는 것 중 가장 작은 반복자 리턴
  • 5에서 A + i와 it 사이의 distance를 뺀 값과 4를 비교하여 더 작은 값을 ans로 리턴 (연속되는 숫자가 하나도 없을 경우 추가되어야 하는 숫자의 갯수는 4개)
  • distance 함수의 리턴 타입과 관련하여 컴파일 에러 발생 -> int로 static cast 처리

0개의 댓글