알고리즘 공부를 할 때마다 백준을 이용한다. 프로그래머스는 무서워
정렬을 공부하면서 어느정도 자신감이 생겨 프로그래머스를 켰다.
K번째 수 라는 문제를 보았다.
여기서 나는 2차원 벡터에 중요성을 느꼈고 정리를 해놓은 후 참고할 예정이다.
k번째 수 코드는 밑에 넣어놨다.
먼저 1차원 벡터를 간단하게 알아보자
동적으로 메모리가 할당되는 배열.
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의 원소의 개수
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차원 벡터도 간단하게 알아보자!
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로 초기화
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번째 수
#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;
}
많이 부족하지만 그래도 발전하는게 느껴져 재미가 있다.
뭐든 재미가 우선이어야 하는 것 같다.
끄읏!