[prgorammers] Level0
2023년 6월 21일
set 활용 #
https://school.programmers.co.kr/learn/courses/30/lessons/181930
1set<int> s{a, b, c};
2if(s.size() == 3)
3 return a + b + c;
4if(s.size() == 2)
5 return (a + b + c) * (pow(a, 2) + pow(b, 2) + pow(c, 2));
6if(s.size() == 1)
7 return (a + b + c) * (pow(a, 2) + pow(b, 2) + pow(c,2)) * (pow(a, 3) + pow(b, 3) + pow(c, 3));
define 활용 #
1#include <bits/stdc++.h>
2#define all(x) (x).begin(), (x).end()
3using namespace std;
4
5int solution(vector<int> num_list) {
6 return accumulate(all(num_list), 1, multiplies<int>()) < pow(accumulate(all(num_list), 0), 2) ? 1 : 0;
7}
bool 인 경우 조건식을 논리연산자대신 bit연산자도 괜찮다 #
1bool solution(bool x1, bool x2, bool x3, bool x4) {
2 return (x1 | x2) & (x3 | x4);
3}
for_each #
1void func(int& n) {
2 if (n % 2 == 0 && n >= 50)
3 n = n / 2;
4 else if (n % 2 && n < 50)
5 n = n * 2;
6}
7
8for_each(arr.begin(), arr.end(), func);
- stream의 map처럼 사용하기
1void func(char& c) { // 참조로 인자를 받아서 원본 수정
2 if (c == 'A')
3 c = 'B';
4 else
5 c = 'A';
6}
- 콜백함수에서 값 변경
1int i = 0;
2for_each(arr.begin(), arr.end(), [arr, i = 0, n](int& num) mutable { // mutable 키워드로 i 수정가능
3 if (i % 2 != arr.size() % 2)
4 num += n;
5 i++;
6});
조건에 맞는 데이터 수 count_if #
1count_if(array.begin(), array.end(), [height](int n) {return n > height;});
문자열 일괄 대소문자 변환 #
1transform(myString.begin(), myString.end(), myString.begin(), ::tolower);
2transform(myString.begin(), myString.end(), myString.begin(), ::toupper);
3
4string alp = "test"
5transform(my_string.begin(), my_string.end(), my_string.begin(),
6 [alp](int c) {
7 if (c == alp[0])
8 return c - 'a' + 'A';
9 return c;
10 });
sregex_token_iterator 로 구현한 split #
1vector<string> solution(string my_string) {
2 regex rx(" ");
3 sregex_token_iterator iter(my_string.begin(), my_string.end(), rx, -1), end;
4 return {iter, end}; // 리턴이 벡터라 uniformed 초기화
5}
regex_replace #
1#include <regex>
2string solution(string rny_string) {
3 string answer = "";
4 rny_string = regex_replace(rny_string,regex("m"),"rn");
5 answer= rny_string;
6 return answer;
7}
vector.insert 로 반복하기 #
1void insert (iterator position, size_type n, const value_type& val);
10진수의 2진수 자릿수 #
1ceil(log2(n)) + 1
2// log2(4) == 2
3// log2(3) == 1.58...
4// log2(2) == 1
2진법 <-> 10진법 #
1for (auto ch : bin1) a = a << 1 | ch - 48; // 2진수 스트링 -> 10진수 정수
2for (int n = a + b; n; n >>= 1) ret = char(n % 2 + 48) + ret; // 10진수 정수 -> 2진수 스트링
bitset 을 이용한 int to bin #
1// ex) convert(50);
2int convert(int num) {
3 stringstream ss;
4 int ret;
5 // num을 32bit 2진수로 변경
6 ss << bitset<32>(num); // "00000000000000000000000000110010"
7 ss >> ret; // int ret = 110010;
8 return ret;
9}
어떤 숫자의 정규화값 얻기 #
1(sum1 - sum2) / abs(sum1 - sum2);
정수 <-> 문자열 변경 #
1stoi(string);
2to_string(int);
3stringstream
문자열 밀기 #
A문자열을 오른쪽으로 몇번 밀어서 B를만들수있는가? 못만들면 -1
1int solution(string A, string B)
2{
3 B += B;
4 return B.find(A);
5}
구간(배열) 안에서 최소 최대값 구하기 #
https://en.cppreference.com/w/cpp/algorithm/max_element
1max_element(array.begin(), array.end());
2min_element(array.begin(), array.end());
iterator간 거리 구하기 #
1distance(array.begin(), array.end())
sort 커스텀 콜백 #
a, b 자리가 정상이라면 1, 다르다면 0 (자리바꿈)
그래서 오름차순으로 만들고싶으면 a < b 조건으로 만들면된다.
1sort(numlist.begin(), numlist.end(), [&n](int a, int b) {
2 if (abs(n - a) == abs(n - b))
3 return a > b;
4 else
5 return abs(n - a) < abs(n - b);
6});
컨테이너 한칸씩 밀기 #
1if(direction =="left")
2 rotate(numbers.begin(),numbers.begin()+1,numbers.end());
comb 재귀 #
n개중에 r개를 선택하는 경우의수
1int combi(int n, int r){
2 if(r == 0) return 1;
3 if(n == 1) return 1;
4 if(r >= n) return 1;
5 return combi(n-1, r) + combi(n-1, r-1);
6}
요소 지우기 (erase + remove) #
remove는 특정 요소를 지우고, 각 요소를 떙겨온 다음 end() 이터레이터를 반환한다.
이때는 실제로 지워지는게 아니라 그냥 지울 요소를 맨뒤로 땡겨두는것
erase는 새로운 문자열의 end() 이터레이터부터 기존 end() 이터레이터 까지 지워버린다.
1my_string.erase(
2 remove(my_string.begin(),my_string.end(), letter[0])
3 ,my_string.end()
4);
벡터 뒤집기 rbegin(), rend() #
1return {num_list.rbegin(), num_list.rend()};