개발자공부일기
vector 본문
행렬의 크기를 입력받고 두 행렬의 값들을 입력받아 두 행렬을 더하는 백준문제를 다음과 같은 코드로 풀었다.
#include <iostream>
using namespace std;
int main(void)
{
int n=0,m=0;
cin>>n;
cin>>m;
int A[n][m],B[n][m],C[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>A[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>B[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
C[i][j] = A[i][j] +B[i][j];
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<C[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
근데 뭔가 찜찜해서 GPT한테 피드백을 받아보니
코드를 보면 동적으로 크기가 정해지는 2차원 배열을 선언하고 있습니다. 하지만 C++에서는 가변 길이 배열(VLA, Variable Length Array)을 공식적으로 지원하지 않습니다. 즉, int A[n][m];처럼 동적으로 크기가 결정되는 배열을 선언하는 것은 표준 C++에서 허용되지 않습니다.
라고 한다. 지원하지 않는데 백준에서 왜 통과됐는지는 모르겠다.
그래서 vector 또는 동적할당을 쓰는걸 추천한다고 했는데, vector라는 친구가 뭐 하는 친구인지 알아보려 한다.
Vector란?
vector는 C++의 표준 라이브러리에서 제공하는 동적 배열 컨테이너다.
C++에서 일반적인 배열(int arr[30])과 달리 크기를 동적으로 조절할 수 있으며, 동적할당과 달리 메모리 해제를 해줄 필요가 없이 메모리 관리가 자동으로 이루어진다.굉장히 편하지 않은가?
vector의 특징
- 동적 크기 조절 가능
- 배열과 다르게 크기를 미리 지정할 필요 없음 (push_back()으로 요소 추가 가능)
- 배열과 유사한 접근 방식
- 인덱스를 사용하여 요소에 접근 가능 (v[i])
- 메모리 자동 관리
- 더 많은 원소가 추가될 경우 자동으로 크기를 늘리고, 필요 없으면 해제됨.
- 다양한 멤버 함수 제공
- push_back(), pop_back(), size(), resize(), clear() 등 다양한 기능 지원.
사용법
선언하기
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v(5); // 크기가 5인 vector 생성 (초기값: 0)
// vector<vector<int>> arr(n, vector<int>(m)); 2차원 배열 선언하는 법
for (int i = 0; i < 5; i++) {
cout << v[i] << " "; // 0 0 0 0 0 (기본값)
}
return 0;
}
동적 크기 변경
vector<int> v; // 빈 벡터 생성
v.push_back(10); // {10}
v.push_back(20); // {10, 20}
v.push_back(30); // {10, 20, 30}
cout << v[1]; // 20 (두 번째 원소 출력)
주요 함수
함수 | 설명 |
push_back(x) | 맨 뒤에 x 추가 |
pop_back() | 맨 뒤 원소 제거 |
size() | 원소 개수 반환 |
resize(n) | 크기를 n으로 변경 |
clear() | 모든 원소 삭제 |
empty() | 비어 있으면 true, 아니면 false 반환 |
front() | 첫 번째 원소 반환 |
back() | 마지막 원소 반환 |
바뀐 코드
내 문제풀이 코드에서 vector로 바꿔서 적용해봤다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> A(n, vector<int>(m));
vector<vector<int>> B(n, vector<int>(m));
vector<vector<int>> C(n, vector<int>(m));
// A 입력
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> A[i][j];
}
}
// B 입력
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> B[i][j];
}
}
// 행렬 덧셈
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
C[i][j] = A[i][j] + B[i][j];
}
}
// 결과 출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << C[i][j] << " ";
}
cout << endl;
}
return 0;
}