개념

초기화와 크기

새 컨테이너를 만들 때 크기와 초기값을 정합니다. 기존 원소를 일정한 값으로 바꾸는 작업과 원소를 모두 제거하는 작업은 구분합니다.

동작C++JavaPython
N개의 0으로 초기화vector<int> v(n, 0)int[] a = new int[n]lst = [0] * n
고정 배열을 0으로 초기화함수 밖에 int a[100];new int[100]크기에 맞는 리스트 생성
기존 원소를 x로 채우기fill(v.begin(), v.end(), x)Arrays.fill(a, x)lst[:] = [x] * len(lst)
가변 컨테이너 비우기v.clear()lst.clear()lst.clear()
원소 수v.size()배열 a.length, 리스트 lst.size()len(lst)

복사와 같은 객체 참조

C++에서 정수 vector를 대입하면 원소들이 복사됩니다. Java 배열과 리스트, Python 리스트를 다른 변수에 대입하면 같은 객체를 참조합니다. 독립적으로 수정하려면 복사본을 만들어야 합니다.

동작C++JavaPython
정수 목록 복사w = v배열 b = a.clone()tmp = lst.copy()
가변 목록 복사w = vnew ArrayList<>(lst)tmp = list(lst)
고정 배열 원소 복사copy(begin(a), end(a), begin(b))Arrays.copyOf(a, a.length)리스트 복사

C++의 기본 배열을 복사할 때는 복사 대상 배열에도 충분한 크기가 있어야 합니다.

2차원 컨테이너

C++의 vector<vector<int>>는 대입하면 각 행의 정수 목록까지 복사합니다. Java의 int[][]와 Python의 중첩 리스트는 바깥쪽만 복사하면 내부 행을 공유하므로 각 행을 따로 복사합니다.

Python에서 [[0] * m for _ in range(n)]은 각 행을 별도로 만듭니다. [[0] * m] * n은 같은 행을 여러 번 참조하므로 한 행을 수정하면 다른 행에서도 같은 변경이 보입니다.

Java에서는 각 행에 clone()을 적용하고, Python에서는 [row.copy() for row in lst]로 정수 행들을 복사할 수 있습니다.

복잡도

원소 수를 NN, 2차원 컨테이너 크기를 R×CR\times C라고 합니다.

연산시간복잡도공간복잡도
원소 채우기O(N)O(N)C++·Java 추가 O(1)O(1), Python 임시 목록 O(N)O(N)
1차원 정수 목록 복사O(N)O(N)복사본 O(N)O(N)
2차원 정수 목록 복사O(RC)O(RC)복사본 O(RC)O(RC)

예제

문제

수열을 복사한 뒤 복사본의 지정한 원소를 바꾼다. 원본과 복사본을 출력하여라.

입력

첫째 줄에 원소 수 NN이 주어진다. 1≤N≤1001\le N\le100이다.

둘째 줄에 수열의 원소 a1,a2,…,aNa_1,a_2,\ldots,a_N이 공백을 사이에 두고 주어진다. 1≤ai<10 0001\le a_i<10\,000이다.

셋째 줄에 바꿀 원소의 번호 KK와 새 값 XX가 공백을 사이에 두고 주어진다. 1≤K≤N1\le K\le N; 1≤X<10 0001\le X<10\,000이다.

출력

첫째 줄에 원본 수열을, 둘째 줄에 수정한 복사본을 공백으로 구분하여 출력한다.

예제 입력

4
1 2 3 4
2 9

예제 출력

1 2 3 4
1 9 3 4

예제 코드

C++20

#include <iostream>
#include <vector>

using namespace std;

vector<int> v, w;

int main() {
    int n, k, x;

    cin >> n;
    v.resize(n);
    for (int& a : v) {
        cin >> a;
    }
    cin >> k >> x;

    // 원소를 복사한 뒤 복사본 수정
    w = v;
    w[k - 1] = x;

    for (int a : v) {
        cout << a << ' ';
    }
    cout << '\n';
    for (int a : w) {
        cout << a << ' ';
    }
    cout << '\n';
}