앞으로 작성할 내용들은 유튜브에서 바킹독님의 알고리즘 강의를 들은 내용을 토대로 하여,
필요할 경우 전공으로 배운 내용을 조금씩 엮어 복습한 내용입니다.
(이것은 다 ~ 개강 전까지 그동안 굳어있던 머리를 활성화 시키기 위한 발악인 것입니다...)
강의내용 복습
스택의 정의와 성질
스택 : 한쪽 끝에서만 원소를 넣거나 뺄 수 있는 자료구조, LIFO(Last In First Out)
*Restricted Structure : 특정 위치에서만 원소를 넣거나 뺄 수 있는 제한이 걸려있음(스택, 큐, 덱)
스택의 성질
1. 원소의 추가가 O(1)
2. 원소의 제거가 O(1)
3. 제일 상단의 원소 확인이 O(1)
4. 제일 상단이 아닌 나머지 원소들의 확인/변경은 원칙적으로 불가
(스택에서 제공하는 기능이 아님)
스택의 기능과 구현
배열이나 연결리스트를 이용해서 구현하는데, 배열로 구현하는 것이 더 쉽다.
const int MX = 1000005;
int dat[MX]; //원소를 담을 큰 배열
int pos = 0; //인덱스를 저장할 변수, 다음에 원소가 추가될 때 삽입해야 하는 위치, 원소의 수를 의미
#include <bits/stdc++.h>
using namespace std;
const int MX = 1000005;
int dat[MX];
int pos = 0;
void push(int x){
dat[pos++] = x;
}
void pop(){
pos--;
}
int top(){
return dat[pos-1];
}
void test(){
push(5); push(4); push(3);
cout << top() << '\n'; // 3
pop(); pop();
cout << top() << '\n'; // 5
push(10); push(12);
cout << top() << '\n'; // 12
pop();
cout << top() << '\n'; // 10
}
int main(void) {
test();
}
STL stack
STL stack을 쓰면, 만약 코드가 오류났을 경우 최소 스택쪽에서는 문제가 없다는 것을 알 수 있으니 로직을 바로잡기에 편하다. STL stack을 사용하기 위해서는 #include <stack>을 포함해야한다.
#include <bits/stdc++.h>
using namespace std;
int main(void) {
stack<int> S;
S.push(10); // 10, 스택에 10 추가
S.push(20); // 10 20
S.push(30); // 10 20 30
cout << S.size() << '\n'; // 3, 스택의 현재 사이즈 반환
if(S.empty()) cout << "S is empty\n"; //스택이 비어있으면 true를, 아니면 false 반환
else cout << "S is not empty\n"; // S is not empty
S.pop(); // 10 20
cout << S.top() << '\n'; // 20
S.pop(); // 10
cout << S.top() << '\n'; // 10
S.pop(); // empty
if(S.empty()) cout << "S is empty\n"; // S is empty
cout << S.top() << '\n'; // 스택이 비어있는 경우에 top또는 pop을 호출하면 runtime error 발생
}
코드를 제출했을때 runtime error가 발생했다면, 스택이 비어있는데 top이나 pop을 했는지 의심해볼 수 있다.
연습문제 복습(C++)
강의 후반부 및 아래 링크로 들어가면 나오는 문제들 중 해당 강의에 맞는 연습문제들을 풀고
정답코드와 비교하며 얻은 내용들을 간단히 정리한 내용입니다.
string 문자열 확장하는 법
1. += 연산자 이용
string ans;
ans += "+\n";
int num = 3456;
ans += to_string(num);
2. append() 이용
string ans;
ans.append("+\n");
int num 3456;
ans.append(to_string(num));
pair <type1, type2> p;
#include <utility> / #include <vector> / #include <algorithm>
first : 첫번째 인자를 반환
second : 두번째 인자를 반환
stack<pair<int, int>> S;
S.push({10, 2});
cout << S.top().first << "\n"; //10 출력
cout << S.top().second << "\n"; //2 출력
pair<int, int> P;
P = make_pair(6, 3); //P = {6, 3};와 동일(C++11이상)
cout << P.first << "\n"; //6 출력
cout << P.second << "\n"; //3 출력
monotone stack : 스택 내의 원소들을 오름차순/내림차순으로 유지하는 아이디어
*다풀었다 !!!
'알고리즘 > Study' 카테고리의 다른 글
[바킹독의 실전 알고리즘] 0x07 덱 복습 -C++ (0) | 2022.02.16 |
---|---|
[바킹독의 실전 알고리즘] 0x06 큐 복습 -C++ (0) | 2022.02.16 |
[바킹독의 실전 알고리즘] 0x04 연결리스트 복습 -C++ (0) | 2022.01.27 |
[바킹독의 실전 알고리즘] 0x03 배열 복습 -C++ (0) | 2022.01.24 |
[바킹독의 실전 알고리즘] 0x01 ~ 0x02 기초코드 작성 요령 복습 -C++ (0) | 2022.01.19 |