6 분 소요

최대 공약수 구하기

// 최대 공약수
void postDiv(int &denum, int &num)
{
    int div = 0;
    int min = denum > num ? num : denum;

    for (int i = min; i > 0; i--)
    {
        if (denum % i == 0 && num % i == 0)
        {
            div = i;
            break;
        }
    }

    denum /= div;
    num /= div;
}

또는 (교수님 코드)

최대 공약수로 나누어진 값을 구하는 경우. 최대 공약수를 구하고 해당 값을 나누는 경우도 있지만 바로 구할 수도 있음.

void postDiv(int &denum, int &num)
{
    for (int i = 2; denum > 1 && num > 1 && num >= i;)
    {
        // 같은 숫자로 여러번 나누어 줄지도 모르기 때문에 또다시 동일한 i로 한 번 더 나눠 볼 수 있도록 확인하는 것이다.
        if (denum % i == 0 && num % i == 0)
        {
            denum = denum / i;
            num = num / i;
        }
        else
            i++;
    }
}

최소 공배수 구하기

// 최소 공배수
for (int i = max;; i++)
{
    if (i % n1 == 0 && i % n2 == 0)
    {
        ans = i;
        break;
    }
}

팩토리얼


한 자리씩 더한 값 구하기

int solution(int n)
{
    int answer = 0;
    for (int i = n; i > 0; i = i / 10)
    {
        // 🌟여기가 i라는 점! n으로 하면 좢됨
        answer += i % 10;
    }

    cout << answer << endl;
    return answer;
}

반복문 안에 i로 나누어야 되는 것을 잊지 말자 진짜ㅜㄹ,,,,

회전시킨다.

bool getRotate(string A, string B, int dim)
{
    bool isSame = true;
    for (int i = 0; i < A.size(); i++)
    {
        if (A[i] != B[(dim + i) % B.size()])
        {
            isSame = false;
        }
    }

    return isSame;
}

이동한 횟수 (dimm) + i = 가 되버리면 잘 검사하다가 outOfRange가 발생하기 때문에 회전 시키기 위해서는 전체 사이즈(B.size())로 나눈 나머지를 이용해서 회전 시키면 됨.(원형큐같은 느낌)

전체 합과 개수를 이용해서 해당하는 등차수열 값 구하기

using namespace std;

vector<int> solution(int num, int total)
{
    vector<int> answer;
    // 해당 개수만큼 등차수열 구하기
    int middleNum = total / num;
    int loop = num / 2; // middleNum 기준으로 앞뒤개수

    if (num % 2 == 0)
        loop--;

    int standard = middleNum - loop;
    for (int i = standard; i < num + standard; i++)
    {
        answer.push_back(i);
    }

    for (auto i : answer)
        cout << i << endl;

    return answer;
}

문자열 <-> 정수형

대문자는 소문자로, 소문자는 대문자로 바꾸기

char change(char c)
{
    if (c > 'Z') // lower case
    {
        c -= 'a' - 'A';
    }
    else // upper case
    {
        c += 'a' - 'A';
    }

    return c;
}

-> 비슷한 문제

char getChanged(char c)
{
    if (c >= 'a') // 소문자라면
        c -= 'a' - 'A';
    else
        c += 'a' - 'A';

    return c;
}

string solution(string s) {
    string answer = "";
    // 짝수번재는 알파벳은 대문자로, 홀수번재 알파벳은 소문자로
    int k = 0; // 공백기준 단어의 인덱스 판별을 위해서 사용
    for (int i = 0; i < s.size(); i++)
    {
        if ((s[i] >= 'a' && s[i] <= 'z') && (k % 2 == 0))
        {
            answer += (s[i] - ('a' - 'A'));
            k++;
        }

        else if ((s[i] >= 'A' && s[i] <= 'Z') && (k % 2 != 0))
        {
            answer += (s[i] + ('a' - 'A'));
            k++;
        }
        else if (s[i] == ' ')
        {
            answer += s[i];
            k = 0;
        }
        else
        {
            answer += s[i];
            k++;
        }

    }
    return answer;
}

2진수, 10진수 변환

10진수 -> 2진수

int tenConvertTwo(int num)
{
    int n = 8;
    int result = 0;
    int k = 1;

    for (int i = n; i > 0; i /= 2, k *= 10)
    {
        result += (i % 2) * k;
    }
    return result;
}

2진수 -> 10진수

int twoConvertTen(int num)
{
    int result = 0;
    int num = 1000;
    int k = 1;

    for (int i = num; i > 0; i /= 10, k *= 2)
    {
        result += (i % 10) * k;
    }
    return result;
}

졸 멋진 코드(feat.김철연)

2진수 덧셈 계산 코드… 걍 외우기! ->

#include <iostream>
#include <string>
using namespace std;

int getDigit(string bin, int i)
{
    // i번째란 뒤에서부터 i 번째라는 의미
    // ?? 근데 만약에 bin1이랑 bin2길이가 다르면 없는 인덱스도 있을 텐데 그거에 대한 i는 어떻게 뽑는다는 거지? 짧은 거를 기준으로 len을 잡고 그외의 나머지는 makeAnswer를 통해서 그냥 붙혀나갸야되는거 아닌가?
    // 해결책 : if 문
    if (bin.length() > i)
    {
        return bin[bin.length() - i - 1] - '0';
        // '0'을 빼야 진짜로 integer 가 리턴된다. 그렇지 아니면 0또는 1의 문자의 아스키코드가 리턴된다.
    }
    else
    {
        return 0;
    }
}
string makeAnswer(string ans, int i)
{
    if (i == 1)
    {
        return "1" + ans;
    }
    else
    {
        return "0" + ans;
    }
}
string solution(string bin1, string bin2)
{
    string answer = "";
    int a, b, c, s; // a = getDigit(bin1, i);, b = getDigit(bin2, i);
    // i번째 값을 리턴해주는 디짓
    // c는 자리올림
    c = 0;
    int len = bin1.length();
    if (len < bin2.length())
    {
        len = bin2.length();
    }

    for (int i = 0; i < len; i++)
    {

        a = getDigit(bin1, i);
        b = getDigit(bin2, i);
        s = (a + b + c) % 2; // 뒷자리
        c = (a + b + c) / 2; // carry-out
        answer = makeAnswer(answer, s);
        // s를 asnwer에 계속 추가해서 아무튼 새로운 답을 늘려나갈것이다.
    }

    if (c == 1)
    {
        answer = makeAnswer(answer, c);
    }
    cout << answer << endl;
    return answer;
}

int main()
{
    solution("11", "1000");
}

stoi

// string -> int로 바꿔줌
int my_stoi(string num)
{
    int k = 1;
    int n = 0;
    for (int i = num.length() - 1; i >= 0; i--, k *= 10)
    {
        n += (num[i] - '0') * k;
    }

    return n;
}

itos

// int -> string으로 바꿔줌
string my_itos(int n)
{
    string num = "";
    for (int i = n; i > 0; i /= 10)
    {
        char temp = (i % 10) + '0';
        num = temp + num;
    }

    return num;
}

tokenize

vector<string> tokenize(string letter)
{
    vector<string> tokens;
    int i, j;
    for (i = 0; i < letter.length(); i = j + 1)
    {
        for (j = i; j < letter.length(); j++)
        {
            if (letter[j] == ' ')
            {
                tokens.push_back(letter.substr(i, j - i));
                break; // 🌟
            }
        }
        if (j == letter.length())
        {
            tokens.push_back(letter.substr(i, j - i + 1));
        }
    }
    return tokens;
}

소인수 집합 구하기

vector<int> solution(int n)
{
    vector<int> answer;
    for (int i = 1; i <= n; i++)
    {
        if (n % i == 0)
        {
            answer.push_back(i);
            // 🌟i라는 인수로 나누어 떨어진다면 계속 나누어서 없애버리기!
            while (n % i == 0)
            {
                n = n / i;
            }
        }
    }
    return answer;
}

find 함수 사용법

auto it = find(morse.begin(), morse.end(), temp);
int index = it - morse.begin();

최빈값 구하기

int solution(vector<int> array)
{
    int answer = 0;
    int count[1000];

    int mode;
    int modeCount = -1;
    bool duplicate = false;

    // 0으로 초기화
    for (int i = 0; i < 1000; i++)
        count[i] = 0;
    // array에 있는 숫자를 인덱스로 간주하여 그 숫자가 나올때마다 ++을 하는 형식
    for (int i = 0; i < array.size(); i++)
        count[array[i]]++;

    for (int i = 0; i < 1000; i++)
    {
        // max 구하기
        if (count[i] > modeCount)
        {
            mode = i;
            modeCount = count[i];
            duplicate = false; // 동점자인지 아닌지
        }
        else if (count[i] == modeCount)
        {
            duplicate = true;
        }
    }
    if (!duplicate)
        answer = mode;
    else
        answer = -1;

    return answer;
}

댓글남기기