Post

Algorithm C++ -Tips-

Algorithm C++ -Tips-

딱 기억해 바보야

참고링크모음

https://modoocode.com/225

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.
├── 데이터
│   ├── 값
│   │   └── 정수의 범위
│   └─- 주소
│
├── 입출력
│ 
├── 문자열
│
├── Vector
│   ├── Vector Iterator
│   └── Vector Container
│
├── Map
│   ├── Map Container
│   └── Unordered Map
│
├── Algorithm
│   ├── 압축
│   ├── 정렬
│   ├── 탐색
│   └── 
│
├── 자료구조
│   ├── 스택
│   ├── 큐
│   ├── 데크
│   └── 
│
│
└── ETC...

시간복잡도(O)

  • O(1) 0차 : i = n / 2;
  • O(n) 1차 : for i <- 1 to n
  • O(n^2) 2차 : for i <- 1 to n {for j <- 1 to n}
  • O(n^3) 3ck : for i <- 1 to n {for j <- 1 to n {for k <- 1 to n}}

정수범위

  • uint8_t : 0 ~ 255 (char)
  • uint16_t : 0 ~ 65,535 (short)
  • uint32_t : 0 ~ 4,294,967,295 (long) int
  • uint64_t : 0 ~ 18,446,744,073,709,551,615 (long long) pointer

입출력

[라인 입력]
1
2
3
4
5
6
7
8
string line;
getline(cin, line);
for (char c : line){
    cout << c << endl;
}

// 입력버퍼의 내용제거 
cin.ignore();
  • \n : 줄바꿈
  • %o : 8진수
  • %d : 10진수
  • %x : 16진수
  • %u : unsigned 10진수
  • %zu : size
  • %p: 포인터의 주소

문자열

STD : #include

  • 선언 : string s = “Hello, World!”;
  • 지우기 : s.erase(0, 5); // 0번째부터 5개 지우기
  • 특정 지우기 : s.erase(s.find(“xxx”), 3); // “xxx” 지우기
  • 삽입 : s.insert(0, “Hi”); // 0번째 위치에 “Hi” 삽입
  • 추출 : s.substr(0, 5); // 0번째부터 5개 문자 추출

Vector

Vector Interator

  • 선언 : vector::iterator iter
  • 초기화 : iter = v.begin();
  • 접근 : iter[idx]
  • 연산 : iter++, *iter
    [순방향 접근]
    1
    2
    3
    
    for (iter = v.begin(); iter != v.end(); iter++){
      cout << *iter << endl;
    }
    

Vector Container

  • 선언 : vector v
  • +2차원 : vector<vector> v(m); // m길이의 vector *추가 study 필요
  • v.at(idx); // idx 참조 (범위 점검 o = 안전)
    1
    2
    3
    4
    5
    6
    
      try {
          cout << v.at(idx);
      }
      catch (out_of_range& e){
          continue;
      }
    
  • v[idx]; // idx 참조 (범위 점검 x = 빠름)
  • v.front() // 처음 원소
  • v.back() // 마지막 원소
  • v.begin() // 처음 원소 (iterator)
  • v.end() // 마지막 원소 (iterator)
  • v.size() // 원소의 갯수
  • v.capadity() // 할당된 공간의 크기
  • v2.swap(v1) // v1과 v2의 capacity를 교환, vector().swap(v1)
  • v.insert(x,y) // x번째 위치에 y 삽입 (interator 반환)
  • v.erase(iter) // iter가 가리키는 원소를 제거, size만 줄어들고 capacity는 남음
  • v.empty() // size가 0이면 true 반환

Map

Map Container

  • 선언 : map<key, value> m;
  • 삽입 : m.insert({key, value});
  • 삭제 : m.erase(key); m.clear();
  • *정렬 : map<key, value, greater> m;

Unorded Map

  • 선언 : unordered_map<key, value> um;
  • m[key]; // key로 Value찾기
  • m.find(key); // key로 iterator찾기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Tip 
map<string, int> m;
string mapping[100001];

for(int i = 0; i < 100001; i++){
    cin >> input;

    map.insert({input, i});
    mapping[i] = input;
}
/*
입력시
A:0    ----    arr[0] = A
C:1    ----    arr[1] = C
D:2    ----    arr[2] = D   
B:3    ----    arr[3] = B
*/

//Key로 찾기
cout << m[key];
//Value로 찾기
cout << mapping[value];

STL Algorithm

압축

  • unique : 중복 정리
1
2
3
unique(v.begin(), v.end()); // 1 2 2 3 4 -> 1 2 3 4 2
//원본유지 영역의 첫 주소 값을 반환
v.erase(unique(v.begin(), v.end()), v.end()); // 지우기

정렬

  • sort : 일반 정렬
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sort(v.begin(), v.end()); // 순차정렬

// Custom
struct int_compare {
    bool operator()(const int&a, const int&b) const {return a > b;}
}; // int 전용
sort(v.begin(), v.end(), int_compare()); // 역순정렬

template <typename T>
struct greater_compare {
    bool operator()(const T& a, const T& b) const { return a > b; }
}; // 타입 공용
sort(v.begin(), v.end(), greater_compare()); // 역순정렬

// Osusume
#include <functional>
sort(vec.begin(), vec.end(), less<int>()); // 순차정렬
sort(vec.begin(), vec.end(), greater<int>()); // 역순정렬
  • stable_sort : 크기가 같은 원소의 순서 보존
  • partial_sort : 일부분만 정렬

탐색

  • binary_search : 이진탐색
  • lower_bound : 원소의 첫 위치
  • upper_bound : 원소의 마지막 위치
1
2
upper_bound(x.begin(), x.end(), target);
upper_bound(arr, arr + num, target);

자료구조

스택

  • 선언 : stack s;
  • 삽입 : s.push(data);
  • 삭제 : s.pop();
  • 접근 : s.top();
  • 비었는지 : s.empty();
  • 크기 : s.size();

  • 선언 : queue q;
  • 삽입 : q.push(data);
  • 삭제 : q.pop();
  • 접근 : q.front();
  • 비었는지 : q.empty();
  • 크기 : q.size();

데크

  • 선언 : deque dq;
  • 삽입 : dq.push_back(data); dq.push_front(data);
  • 삭제 : dq.pop_back(); dq.pop_front();
  • 접근 : dq.front(); dq.back();
  • 비었는지 : dq.empty();
  • 크기 : dq.size();

List

  • 선언 : list l;
  • 삽입 : push, l.insert(itr, k);
  • 삭제 : pop, l.erase(itr);
  • 정렬 : l.reverse(); l.sort(); (오름차순)
  • 조건 : l.remove(k); l.remove_if(Predicate);

부적

1
2
ios::sync_with_stdio(false); cin.tie(NULL);
cin.exceptions(ios::badbit | ios::failbit);

cin cout 속도 향상 (endl 사용 금지)

1
cout << '\n';
This post is licensed under CC BY 4.0 by the author.