(C++)Vector Vector Vector

전성영·2022년 5월 4일
0

알고리즘 공부를 할 때마다 백준을 이용한다. 프로그래머스는 무서워

정렬을 공부하면서 어느정도 자신감이 생겨 프로그래머스를 켰다.
K번째 수 라는 문제를 보았다.
여기서 나는 2차원 벡터에 중요성을 느꼈고 정리를 해놓은 후 참고할 예정이다.
k번째 수 코드는 밑에 넣어놨다.

먼저 1차원 벡터를 간단하게 알아보자

1차원 vector

백터의 장점/특징

동적으로 메모리가 할당되는 배열.
Array(배열)에 비해 속도가 느리다.
BUT 메모리 관리에 있어서는 굉장히 효율적이다!

임의의 index로 접근 가능
동적으로 확장/축소가 가능하다.

  • 선언

vector<자료형>(vector 이름);  -> ()제외
vector<자료형>vec(vector 크기);
(추가)vector<int>vec{ 1, 2, 3, 4, 5 }; // 선언과 동시에 초기화
int n;
cin >> n;
vector<int>vec(n);
for(int i = 0; i < n; i++)
	cin >> vec[i];

이런식으로 선언을하면 데이터를 삽입하는 과정에서 약간의 시간단축?? 을 할 수 있다!
밑에는 다른 방식으로 값을 집어넣는 코드이다.

int n, m;
cin >> n;
for(int i = 0; i < n; i++)
{
	cin >> m;
	vec.push_back(m);
}

(추가)

answer.assign({ cnt1, cnt2, cnt3 }); //한 번에 데이터 넣기

(추가)

int n, input;
cin >> n;

vector<int>vec2(n, 1);

n개의 저장소를 만들고 모든 저장소를 1로 초기화

  • 삽입

vec.push_back(a); 	//vec의 끝에 a 삽입.
vec.insert(1, 5);	//1번째 위치에 5를 삽입.
  • 삭제

vec.pop_back();											//마지막에 넣은 값 제거
vec.erase(vec.begin() + 3);								//index가 3인 데이터를 제거
vec.erase(vec.begin(), vec.begin() + 3);				//index가 0~3인 데이터를 제거
vec.erase(unique(vec.begin(), vec.end()), vec.end());   //중복값을 뒤로 다 밀고 삭제
  • 개수

vec.size();		//vec의 원소의 개수
  • (추가) vector 내부에 가장 작은 값, 큰 값 제거

vec.erase(max_element(vec.begin(), vec.end())); // 가장 큰 값 제거
vec.erase(min_element(vec.begin(), vec.end())); // 가장 작은 값 제거
  • (추가) 정렬

sort(vec.begin(), vec.end());               //#include<algorithm>	
sort(vec.begin(), vec.end(), greater<>());  //#include<functional>
  • 그 외

vec.begin();	//vec의 첫 번째 위치 
vec.end();		//vec의 마지막 다음 위치
vec.front();	//vec의 첫 번째 데이터
vec.back();		//vec의 마지막 데이터
vec.capacity();	//vec의 공간의 크기
vec = arr;      //arr이라는 벡터의 데이터를 vec에 복사

여기까지 1차원 벡터를 알아보았고 2차원 벡터도 간단하게 알아보자!

2차원 vector

  • 선언 및 초기화

vector<int>vec1;      	   //1차원벡터
vector<vector<int>>vec2;   //2차원벡터

//vector<int> vec(10, 7)   //10개의 데이터를 다 7로 초기화

2차원 벡터 또한 초기화 가능
//vector<vector<int>> arr2(10);                    //1차원 벡터를 저장할 수 있는 공간 10개를 만들 수 있다
//vector<vector<int>> arr2(10, vector<int>(5));    //2차원 벡터에 저장할 수 있는 1차원벡터의 원소값을 5개로 지정
//vector<vector<int>> arr2(10, vector<int>(5, 7)   //2차원 벡터에 저장할 수 있는 1차원벡터의 원소값을 5개로 지정하는데 그 5개를 7로 초기화
  • (추가) 원하는 데이터로 2차원 vector초기화

int input;
sizes.resize(4);
for (int i = 0; i < 4; i++)
{
	for (int j = 0; j < 2; j++)
	{
		cin >> input;
		sizes[i].push_back(input);	//-> i가 아니라 j 인듯?
	}
}

resize()로 size를 정해준 후 원하는 값을 입력받아서 2차원vector를 초기화 할 수도 있다.

  • 간단한 예

int main()
{
   //1차원벡터인 vec2에 1, 5, 7 데이터를 저장한다.
   vec1.push_back(1);
   vec1.push_back(5);
   vec1.push_back(7);


   //2차원벡터에 1차원벡터 삽입
   vec2.push_back(vec1);         //vec2의 첫 번째 요소로 vec1자체(안에 있는 데이터 ex 1, 5, 7 들어있음 다 간다)가 들어간다.


   //그 후 접근하려고하면 
   cout << vec[0][0]; //1출력
   cout << vec[0][1]; //5출력
   cout << vec[0][2]; //7출력

   //2차원벡터의 0번째의 벡터에 9를 추가하게되면 index = 4인곳에 자동으로 추가가 된다.
   vec[0].push_back(9);
   cout << vec[0][3] << endl;	//9출력
   
   주의 - 당연한 소리지만 2차원 벡터인 vec에 9을 추가해줬다고 vec2에 같이 추가되는게 아니다.

   //각 크기
   //cout << vec2.size() << endl;        // 3
   //cout << vec.size() << endl;         // 1      -> 만약 1차원벡터를 vec2 이외에 더 집어넣으면 1씩 증가
   //cout << vec[0].size() << endl;      // 4


   return 0;
}

주석으로 설명을 써놓았는데 약간 보기 힘들 수도 있겠다..

아래는 k번째 수 문제설명 및 코드이다.
K번째 수

  • K번째 수 code

#include<iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

//command size = 3 [2 5 3][4 4 1][1 7 3]
 
vector<int> solution(vector<int> array, vector<vector<int>> commands)
{      
   vector<int> answer;

   for (int i = 0; i < commands.size(); i++) 
   {
      vector<int> vec;
      
//문제에서 2번째는 사실상 index값이 1인곳에 해당. 그래서 -1을 해준다.
      for (int j = commands[i][0] - 1; j < commands[i][1]; j++)      
         vec.push_back(array[j]);

      sort(vec.begin(), vec.end());
      answer.push_back(vec[commands[i][2] - 1]);
   }

   return answer;
}

많이 부족하지만 그래도 발전하는게 느껴져 재미가 있다.
뭐든 재미가 우선이어야 하는 것 같다.
끄읏!

profile
Slow and Steady

0개의 댓글