5 분 소요

9.1주차

  • 클래스
  • 캡슐화
  • 생성자
  • 인스턴스 메모리 용량

9.2주차

  • 소멸자 + 구체적으로 스택이나 힙에 영역이 할당되고, 언제 소멸하는지, 무엇이 소멸하는지
  • copy constructor(구현 ver. Sample(Sample &a); )
  • this

10.1주차 :: 실습 4

  • 오버로딩 vs 오버라이딩
  • 동적 할당과 소멸자 pointer = new type[number_of_elements]; delete [] pointer;
  • static members
  • friend members

10.2주차

  • 여기 실습 문제 부터가 찐…

    k진수에서 10진수로 바꾸기

    // k진수에서 10진수로 바꾸기
    int Number::getDec()
    {
        int i = 1;
        int num = 0;
        for (int m = n.size() - 1; m >= 0; m--)
        {
            num += (n[m] - '0') * i;
            i *= k;
        }
        return num;
    }
    


    10진수에서 k진수로 바꾸기

    // 10진수에서 k진수로 바꾸기
    void Number::changeToK(int k)
    {
        int dec = getDec();
        this->k = k;
        int i = 1;
        this->n = "";
        for (int m = dec; m > 0; m /= k)
        {
            this->n = (char)('0' + (m % k)) + this->n;
        }
    }
    
  • 상속

11.1주차 :: 실습 5

  • 상속이 어떻게 진행이 되는지 확실히 보여주는 실습 문제 (MyString을 만들어서 상속받거나 기존의 string을 상속받거나)
int P5::length()
{
    // 부모 멤버 함수를 사용하고 싶을 때.
    return string::length() * 3;
}

11.2주차

  • virtual 🌟
  • 추상 클래스는 인스턴스를 만들 수 없다. (추상 클래스는 추상적인 명세만 나열, 상속을 염두)
  • 상속의 힘이 두배가 된다.
  • 다중 상속

12.1주차

  • template

12.2주차

실습 8, 9, 10 한 번에 풀었던 주차임

  • 소수 구하기
    bool Util::isPrime(int num)
    {
        int i;
        for (i = 2; i < num; i++)
        {
            if (isDiv(num, i))
            {
                break;
            }
        }
        if (i == num)
            return true;
        else
            return false;
    }
    

13.1주차

  • 코드 많이 보기 + 코드의 아름다움을 느끼기❣️ (실습 11)
  • stream 개요

13.2주차

  • 코드 많이 보기 + 코드의 아름다움을 느끼기❣️ (실습 12)

14.1주차 🌟🌟

  • this의 멤버 변수가 아닌 경우 arr.values[0] 처럼 사용해주기

    TDArray TDArray::operator*(TDArray arr)
    {
        vector<vector<int>> v;
        for (int i = 0; i < values.size(); i++)
        {
            vector<int> row;
            for (int j = 0; j < arr.values[0].size(); j++)
            {
                row.push_back(getInnerProduct(arr, i, j));
            }
            v.push_back(row);
        }
    }
    

14.2주차 🌟

개중요………

  • 코드 많이 보기 + 코드의 아름다움을 느끼기❣️ (실습 14)

15.1주차

  • SevenSeg 클래스, SevenSegs 클래스 만들기
  • Puzzle 클래스 만들기

많이 쓰이는 코드 모음

최대 공약수(gcd)

int min = n > m ? m : n;
int max = n > m ? n : m;
int gcd = 0;

// 최대 공약수 구하기
for (int i = min; i > 0; i--)
{
    if (Util::isDiv(min, i) && Util::isDiv(max, i))
    {
        gcd = i;
        break;
    }
}

최소 공배수(lcm)

int min = n > m ? m : n;
int max = n > m ? n : m;
int lcm = 0;

// 최소 공배수 구하기
for (int i = max;; i++)
{
    if (Util::isDiv(i, max) && Util::isDiv(i, min))
    {
        lcm = i;
        break;
    }
}

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

int total = 15;
int num = 5;

// 전체 합과 개수를 이용해서 해당하는 등차수열 값 구하기
vector<int> answer;
int middleNum = total / num;
int loop = num / 2;
if (num % 2 == 0)
    loop--;

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

ASCII

문자열 -> 대문자보다 소문자가 숫자가 더 크다

따라서, 대문자를 소문자로 바꾸려먼 (‘a’ - ‘A’)의 값을 더하면 되고, 소문자를 대문자로 바꾸기 위해서는 (‘a’ - ‘A’)의 값을 빼면 된다.

2진수 덧셈

int getDigit(string bin, int idx)
{
    if (bin.length() > idx)
    {
        return bin[bin.length() - idx - 1] - '0';
    }
    else
    {
        return 0;
    }
}
string makeAnswer(string answer, int s)
{
    if (s == 1)
    {
        return "1" + answer;
    }
    else
    {
        return "0" + answer;
    }
}
int main()
{
    // 2진수 덧셈
    string num1 = "1100";
    string num2 = "100";

    string answer = "";
    int a, b, c, s;
    c = 0;

    int len = num1.size();
    if (len < num2.size())
    {
        len = num2.size();
    }

    for (int i = 0; i < len; i++)
    {
        a = getDigit(num1, i);
        b = getDigit(num2, i);
        s = (a + b + c) % 2;
        c = (a + b + c) / 2;
        answer = makeAnswer(answer, s);
    }

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

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;
}

소인수 집합 구하기

vector<int> answer;

for (int i = 1; i <= 24; i++)
{
    cout << i << endl;
    if (n % i == 0)
    {
        answer.push_back(i);
        while (n % i != 0)
        {
            n = n / i;
        }
    }
}

중복 제거

vec.erase(unique(vec.begin(), vec.end()), vec.end());

k 진수 변환

-> 실습4

// 10진수에서 k진수로 바꾸기
void Number::changeToK(int k)
{
    int num = getDec(); // string -> int로 바꾸어줌
    this->k = k;
    this->n = "";
    for (int i = num; i > 0; i /= k)
    {
        this->n = (char)((i % k) + '0') + this->n;
    }
}
// k진수에서 10진수로 바꾸기
int Number::getDec()
{
    int num = 0;
    int deli = 1;
    for (int i = n.size() - 1; i >= 0; i--, deli *= k)
    {
        num += (n[i] - '0') * deli;
    }
    return num;
}

비트 비교

int FX::diff(long long num, long long compare)
{
    int len = sizeof(n) * 8;
    long long mask = 1;
    int count = 0;
    for (int i = 0; i < len; i++)
    {
        if ((num & mask) != (compare & mask))
        {
            count++;
        }
        mask = mask << 1;
    }
    return count;
}

« 오퍼레이터 오버로딩

ostream &operator<<(ostream &os, TDArray &ar)
{
    for (int i = 0; i < ar.values.size(); i++)
    {
        for (int j = 0; j < ar.values[0].size(); j++)
        {
            os << ar.values[i][j] << " ";
        }
        os << endl;
    }
    return os;
}

* 오퍼레이터 오버로딩

TDArray TDArray::operator*(TDArray &ar)
{
    vector<vector<int>> v;
    for (int i = 0; i < values.size(); i++)
    {
        vector<int> row;
        for (int j = 0; j < ar.values[0].size(); j++)
        {
            row.push_back(getInnerProduct(ar, i, j));
        }
        v.push_back(row);
    }
    return TDArray(v);
}

== 오퍼레이터 오버로딩

// -> friend로 정의
bool operator==(Path &a, Path &b)
{
    if ((a.x1 == b.x1) && (a.y1 == b.y1) && (a.x2 == b.x2) && (a.y2 == b.y2))
        return true;
    if ((a.x1 == b.x2) && (a.y1 == b.y2) && (a.x2 == b.x1) && (a.y2 == b.y1))
        return true;
    return false;
}

실수 모음

  1. class 멤버 함수의 메개 변수나 데이터 타입을 바꿀 때, 정의 부분까지 다 바꾸어야 한다.
  2. 멤버 함수가 아니면 반드시 namespace 작성!(Util 클래스 같은 경우!)
  3. 클래스 마지막에 ; 찍기
  4. this가 아닌 다른 객체의 멤버 변수 사용하기
  5. 상속받을 클래스 : public parent 안씀 🌟
  6. 멤버 함수 정의할 때 앞에 클래스 이름 꼭 붙히기!
  7. 상속을 해서 멤버에 접근하려면 무조건 protected로 바꾸기

댓글남기기