개념
초기화와 크기
새 컨테이너를 만들 때 크기와 초기값을 정합니다. 기존 원소를 일정한 값으로 바꾸는 작업과 원소를 모두 제거하는 작업은 구분합니다.
| 동작 | C++ | Java | Python |
|---|---|---|---|
| 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++ | Java | Python |
|---|---|---|---|
| 정수 목록 복사 | w = v | 배열 b = a.clone() | tmp = lst.copy() |
| 가변 목록 복사 | w = v | new 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]로 정수 행들을 복사할 수 있습니다.
복잡도
원소 수를 , 2차원 컨테이너 크기를 라고 합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 원소 채우기 | C++·Java 추가 , Python 임시 목록 | |
| 1차원 정수 목록 복사 | 복사본 | |
| 2차원 정수 목록 복사 | 복사본 |
예제
문제
수열을 복사한 뒤 복사본의 지정한 원소를 바꾼다. 원본과 복사본을 출력하여라.
입력
첫째 줄에 원소 수 이 주어진다. 이다.
둘째 줄에 수열의 원소 이 공백을 사이에 두고 주어진다. 이다.
셋째 줄에 바꿀 원소의 번호 와 새 값 가 공백을 사이에 두고 주어진다. ; 이다.
출력
첫째 줄에 원본 수열을, 둘째 줄에 수정한 복사본을 공백으로 구분하여 출력한다.