[C++] 코딩테스트 알고리즘 c++ 문법 정리

2024. 2. 24. 23:38·🍞 Algorithm/C++
#include <bits/stdc++.h>

using namespace std;

ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);

 

sort 사용자 정의 정렬

// 1차원 벡터
bool cmp(int a, int b) return a < b;

// 2차원 벡터
bool cmp(vector<int> &v1, vector<int> &v2){
  if(v1[1] == v2[1])
    return v1[0]<v2[0];
  else return v1[1]<v2[1];
}

// pair 벡터
bool cmp(pair<int, int> u, pair<int, int> t){
  if(u.first==t.first)
	return u.second < t.second;
  return u.first < t.first;
}

sort(v.begin(), v.end(), cmp);

 

정렬 후, 중복제거

sort(v.begin(), v.end());
v.erase(unique(v.begin(). v.end()), v.end());

 

정렬된 경우 이분탐색 (크거나 같은 값, 더 큰 값)

lower_bound는 정렬된 배열에서 n 이상, 첫번째 idx

upper_bound는 정렬된 배열에서 n 초과, 첫번째 idx

auto lower = lower_bound(v.begin(), v.end(), n);
-> 벡터에서 최초의 n 이상의 값을 iterator 형태로 저장
// idx를 가지고 오기 위해선 -v.begin()

// 직접 구현
int mylower_bound(int num){
  int left = 0;
  int right = v.size() - 1;
  int ans = v.size(); 

  while(left <= right) { 
    int mid = (left + right) / 2;

    if (v[mid] >= num) {
      right = mid - 1;
      ans = mid;
    }
    else left = mid + 1;
  }

  return ans;
}


auto upper = upper_bound(v.begin(), v.end(), n);
-> 벡터에서 최초의 key 초과값을 iterator 형태로 저장 
// idx를 가지고 오기 위해선 -v.begin()

// 직접 구현
int myupper_bound(int num){
  int left = 0;
  int right = v.size() - 1;
  int ans = v.size(); 

  while(left <= right) {
    int mid = (left + right) / 2;

    if (v[mid] <= num) {
      left = mid + 1;
    }
    else {
      right = mid - 1;
      ans = mid;
    }
  }

  return ans;
}

순차탐색 (같은 값)

find(v.begin(), v.end(), n);

 

문자열

문자열을 찾을 수 없는 경우

if(str.find("asdf") == string::npos) {
    // cant find
}

 

문자열을 여러개의 정수형으로

int A, B, C;
stringstream ss("123 456 789");
ss >> A >> B >> C;

 

if (find(A.begin(), A.end(), s) == A.end())
    return 0;
else return 1;

find(A.begin(), A.end(), s);
// find(찾으려는 범위의 시작 iterator, 끝 iterator, 찾으려는 값);
// A.end()를 반환한다면 해당 범위에서 s를 찾지 못한 것!

 

map / set

vector 내부 map 정렬

map<string, int> m;

vector<pair<string, int>> v(m.begin(), m.end());

sort(v.begin(), v.end(), compare);

 

값 존재 확인, 값 제거

m.count("asdf"); s.count(1234);
m.erase("asdf"); s.erase(1234);

 

queue / priority_queue

우선순위큐 오름차순, 내림차순 (default 내림차순)

priority_queue<int, vector<int>, greater<int>> pq; // 오름차순
priority_queue<int, vector<int>, less<int>> pq; // 내림차순 default

 

우선순위큐 사용자 설정 정렬

struct cmp{
	bool operator()(int a, int b){
    	return a < b;
    }
};
priority_queue<int, vector<int>, cmp> pq;

 

배열 초기화

// 0이나 -1로 초기화
memset(arr, 0, sizeof(arr))

// 다른 값으로 초기화
fill(&arr[0][0], &arr[N][N], INF);

 

문자열을 어떤 문자로 나누기

string str = "hello world";
istringstream  iss(str);

vector <string> words;
string word;

while(iss >> word) {
words.push_back(word);
}

 

부동 소수점 처리

double price = 0.7;
int cents = (int)(price * 100); // 기대값: 70

그런데 실제로 price * 100은 정확히 70.0이 아닙니다.

👉 0.7 * 100 = 69.99999999999999...

그래서 int로 형 변환하면 69가 됩니다. ❌

(int)(price * 100 + 0.5)

price * 100 = 69.9999999

+ 0.5 = 70.4999999

(int)로 바꾸면 70이 됩니다 ✔
저작자표시 (새창열림)

'🍞 Algorithm > C++' 카테고리의 다른 글

[C++] 백트래킹, 순열, 조합, 부분집합, 중복순열, next_permutation  (0) 2024.02.23
[C++] 문자열 자르기 사용법 substr()  (2) 2022.09.27
[C++] 입력 개수 모를 때 무한 반복문 제어 cin.eof()  (0) 2022.09.26
'🍞 Algorithm/C++' 카테고리의 다른 글
  • [C++] 백트래킹, 순열, 조합, 부분집합, 중복순열, next_permutation
  • [C++] 문자열 자르기 사용법 substr()
  • [C++] 입력 개수 모를 때 무한 반복문 제어 cin.eof()
박빵이
박빵이
2025년에도 갓생살기
  • 박빵이
    기억보다 기록
    박빵이
  • 전체
    오늘
    어제
    • 분류 전체보기 (337)
      • 🍞 FrontEnd (97)
        • HTML+CSS (4)
        • JavaScript (17)
        • TypeScript (4)
        • React (52)
        • Next.js (2)
        • Android (15)
      • 🍞 BackEnd (24)
        • Java (15)
        • Node.js (6)
        • Spring (1)
      • 🍞 Cloud & Infra (0)
        • AWS SAA (0)
        • Microsoft Azure (0)
      • 🍞 Algorithm (147)
        • C++ (4)
        • Baekjoon (41)
        • Programmers (97)
      • 🍞 Computer Science (18)
        • 운영체제 (1)
        • 데이터 통신 (6)
        • 네트워크 (6)
        • 데이터베이스 (1)
      • 🍞 대외활동 & 부트캠프 (42)
        • 삼성 청년 SW 아카데미 (1)
        • LG유플러스 유레카 (0)
        • 한국대학생IT경영학회 (1)
        • IT연합동아리 UMC (17)
        • 길벗 블로깅 멘토 (18)
        • IT연합동아리 피로그래밍 (3)
        • 개발 컨퍼런스 (2)
  • 블로그 메뉴

    • Admin
  • 링크

    • GitHub
  • 인기 글

  • 태그

    react
    위상정렬
    유니온파인드
    level2
    코틀린
    길벗 블로깅 멘토링
    백준
    안드로이드
    umc
    Android
    JavaScript
    알고리즘
    프로그래머스
    길벗 블로깅 멘토
    C++
    코딩자율학습
    Java
    map
    Front
    level1
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
박빵이
[C++] 코딩테스트 알고리즘 c++ 문법 정리
상단으로

티스토리툴바