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