본문 바로가기
Algorithm

[백준/BOJ] 16967번 배열 복원하기 C++

by SoyeonCha 2025. 2. 5.

문제 링크 : https://www.acmicpc.net/problem/16967

 

맞힌 코드

#include <bits/stdc++.h>
using namespace std;

int main(){
    int h, w, x, y;
    cin >> h >> w >> x >> y;
    
    vector<vector<int>> a(h, vector<int>(w));
    vector<vector<int>> b(h+x, vector<int>(w+y));
        
    for (int i=0; i<h+x; i++){
        for (int j=0; j<w+y; j++){
            cin >> b[i][j];
        }
    }
    
    for (int i=0; i<h; i++){
        for (int j=0; j<w; j++){
            if (i>=x && j>=y){
                a[i][j] = b[i][j] - a[i-x][j-y];
            }
            else{
                a[i][j] = b[i][j];
            }
        }
    }
    
    for (int i=0; i<h; i++){
        for (int j=0; j<w; j++){
            cout << a[i][j] << " ";
        }
    }
}

 

 

메모

array가 아닌 vector를 사용하는 것이 더 적절한 이유 (GPT 답변)

vector를 사용하는 것이 array(C 스타일의 배열)보다 더 적절한 선택입니다. 그 이유는 다음과 같습니다.

1. 동적 크기 할당

  • vector는 동적 크기 할당이 가능하므로 크기를 미리 결정할 필요 없이 유연하게 사용 가능합니다.
  • 반면, array는 크기를 컴파일 타임에 정해야 하므로, H와 W가 런타임에 주어지는 경우 vector가 더 적합합니다.

2. 메모리 안전성

  • vector는 자동으로 메모리를 관리하며, 범위를 벗어난 접근을 방지하는 at() 메서드를 제공합니다.
  • C 스타일 배열은 직접 메모리를 관리해야 하며, 범위를 벗어난 접근 시 오류가 발생해도 경고 없이 프로그램이 예상치 못한 동작을 할 수 있습니다.

3. 편의성

  • vector는 size() 함수를 제공하여 배열 크기를 쉽게 확인할 수 있습니다.
  • 또한, resize()를 이용해 크기를 조정할 수도 있습니다.
  • C 스타일 배열을 사용할 경우 크기를 직접 추적해야 하며, 크기 변경도 어렵습니다.

4. 표준 라이브러리 기능 활용 가능

  • vector는 C++ 표준 라이브러리의 다양한 알고리즘(sort(), find(), accumulate() 등)과 함께 쉽게 사용할 수 있습니다.
  • 반면, C 스타일 배열은 이러한 기능을 사용하기 위해 더 많은 수작업이 필요합니다.

5. 자동 소멸 및 메모리 관리

  • vector는 스코프를 벗어나면 자동으로 메모리를 해제해줍니다.
  • 반면, new로 동적으로 할당한 배열(int* arr = new int[N];)은 delete[] arr;을 명시적으로 호출해야 하며, 그렇지 않으면 메모리 누수가 발생할 수 있습니다.

결론

배열의 크기가 런타임에 결정되며, 메모리 관리가 필요하고, 안전성이 중요한 경우 vector가 훨씬 더 좋은 선택입니다.