.. Cover Letter

ㅇ 공부#언어/(C++) 알고리즘

C++ 코딩 테스트 기술 모음

BrainKimDu 2023. 4. 3. 21:45

C++ 문법 및 편법

1. 소수점 고정하기

 cout<<fixed;
 cout.precision(2);
 // 소수점 2째자리까지 고정

2. 실행속도 높이기

std::ios::sync_with_stdio(0);
std::cin.tie(0);
std::cout.tie(0);


std::cout << '\n' 사용하기 std::endl 사용하면 속도가 느려집니다.

3. 백준에서 여러번 입력받는 경우 사용할 수 있는 방법

int t; cin t;
while (t--) {
}

4. for문을 간략화하는 방법 및 파이썬 같은 for문 사용방법

string name = "name";
for( auto & i : name)
	cout << i;
// 기존의 for문과 차이점은 i가 index가 아니라 value 를 가리키고 있음.

 

문자열

1. 문자열의 모든 문자 띄어쓰기 제거

str.erase(remove(str.begin(), str.end(), ' '), str.end());

' '를 다른거로 바꾸면 다르게 응용 가능

2. 문자열 정렬하기

#include algorithm
sort(str.begin(), str.end());

3. 문자열 뒤집기

reverse(str.begin(), str.end());

이를 응용하여 오름차순 정렬이 가능함

#include algorithm
sort(str.begin(), str.end());
reverse(str.begin(), str.end());

4. 공백 문자 포함해서 입력 받기

getline(cin, s);
//  cin의 경우 띄어쓰기로 구분한다.
// cin과 함께 쓰는 경우 cin 다음에 cin.ignore(); 이 나와야한다.
// 만약 띄어쓰기로 구분된 항목을 입력받는다면

5. 공백 문자 포함해서 입력 받아야 하는데, cin을 같이 사용하는 경우

 std::cin >> t;
 std::cin.ignore();
// 버퍼를 지워야합니다.

6. 공백 문자 포함해서 입력 받아서 모두 소문자로 변환하는 방법

getline(cin, input);
	int size = input.length();
	for (int i = 0; i < size; i++)
	{
		input[i] = tolower(input[i]);
	}

7.  EOF까지 입력받는법

while(t < 50 || !std::cin.eof()){
        getline(std::cin, line);
        sentence += line;
        t++;
    }
    
이거 아니면 저거 

while(true){
        string inp;
        cin >> inp;
        if(cin.eof())
            break;
 }
 

체점시에는 자동으로 들어가지만 디버깅때는 ctrl + z 를 입력해야함.

 

Vector

1. Vector 정렬하기

#include algorithm
sort(v.begin(), v.end());

2. Vector에서 원하는 값의 index를 찾기

std::vector<int> v = { 10000, 75, 20, 36, 47, 40, 6, 10 };
std::cout << find(v.begin(), v.end(), 20) - v.begin() << std::endl;
// 20은 2번째 자리에 있다.
std::cout << find(v.begin(), v.end(), 1) - v.begin() << std::endl;
// 1은 없다. 그러므로 length()의 값이 리턴된다. 여기서는 8이 리턴된다.

3. Vector 에서 인덱스로 지우기

 v.erase(v.begin() + i)
 // i번째 원소를 삭제한다.

4. Vector 에서 중복값 제거하기

vector< > v;
sort(v.begin(), v.end());
// 정렬을 하고

unique(v.begin(), v.end());
// unique는 중복되는 값을 삭제하지만, vector에 할당된 메모리는 그대로이다.
// unique가 완료되면 값이 지정되어 있지 않은 index를 반환한다. 그 index부터 erase를 시키면 된다.
// 그러니 5번 줄 말고 다음의 코드를 입력하면 중복값이 제거된다.

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

5.  Vector 에서 큰 수, 큰 수의 인덱스, 작은 수, 작은 수의 인덱스 찾기

int max = *max_element(v.begin(), v.end());
// 가장 큰 수가 리턴
int max_index = max_element(v.begin(), v.end())-v.begin();
// 가장 큰 수의 인덱스가 리턴

int min = *min_element(v.begin(), v.end());
// 가장 작은 수가 리턴
int min_index = min_element(v.begin(), v.end())-v.begin();
// 가장 작은 수의 인덱스가 리턴

6.  2차원 Vector에서 2차원에 있는 특정한 값으로 정렬을 시키고 싶다면 

// 매개변수 타입은 변경될 수 있음.
bool compare(const std::vector<std::string>& a, const std::vector<std::string>& b) {
    return a[0] > b[0];
}
sort(answer.begin(), answer.end(), compare);

예를 들자면 V[0][1] 의 value로 정렬을 시키고 싶다면

7. Vector 중간에 값을 삽입하기

v.insert(v.begin() + insert, value);

8. Vector 선언과 동시에 초기화하기 (모든 컨테이너 동일)

std::vector<int> v(5); // 0으로 초기화하는 5개
std::vector<int> v(5, 1); // 1으로 초기화하는 5개
std::vector<int> v = {1, 2, 3, 4, 5}

9. 2차원 Vector 선언하는 방법

vector<vector<int>> v;

원래는 벡터를 하나더 사용하면서 v.push_back으로 삽입하면 되지만 다음처럼 사이즈를 바로 정해줄 수 있다.

vector<vector<int> A(1, vector<int>(1,0));

 

 

 

STACK

1. stack 활용

#include<stack>

stack<int> s;
// 스택생성
s.push(1);
// 스택에 1을 넣는다.

while(!s.empty()){
    int a = s.top();
    s.pop();
}
// 스택이 빌때까지 while문을 돈다.
// 이론상으로는 pop에서 반환값이 있지만, STL에서는 없다는 것에 주의한다.

 

MAP

1. 자동으로 정렬을 해야한다면 Hash_map 을 사용하고, 정렬이 필요없다면 map을 사용한다.

#include<map>
std::map< , > words; // 선언
words.insert({  ,  }); // 삽입

2. Map에서 특정한 값을 찾아야한다면 " " 안에 있는게 key가 됨

std::map< , > ::iterator it = words.find(" ");
if (it != words.end()) {
               
}
else {
               
}

4. Map의 모든 원소를 하나하나 보고싶을때

std::map< , > ::iterator it;
    for (it = words.begin(); it != words.end(); ++it) {