[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

ESC
Type to search...