알고리즘 트레이닝 – 재귀(Recursion)적 알고리즘

원소가 n 개인 집합의 모든 부분집합을 생성하는 재귀적 알고리즘

#include <vector>

using namespace std;

class Subset
{
public:
    Subset();
    vector<int> subset;
    void search(int k);
}

Subset::Subset()
{
    search(1);
}

Subset::search(int k)
{
    int n = 3;
    if (k == n+1)
    {
        // 부분집합을 처리한다.
    }
    else
    {
        // k를 부분집합에 포함시킨다.
        subset.push_back(k);
        search(k+1);

        // k를 부분집합에 포함시키지 않는다.
        subset.pop_back();
        search(k+1);
    }
}

int main()
{
    Subset subset = Subset();
}

알고리즘 트레이닝 – 콜라스 추측(Collartz conjecture)

콜라스 추측법은 값이 짝수라면 이를 반으로 나누고, n이 홀수라면 3을 곱한후 1을 더하는 과정을 값이 1이 될때까지 수행하는 과정을 반복한다.

입력 : 3

출력 : 3 10 5 16 8 4 2 1

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    while (true)
    {
        cout << n << " ";
        if (n == 1) break;
        if (n%2 == 0) n /= 2;
        else n = n*3+1;
    }
    cout << "\n";
}

입력값을 138367을 넣고 테스트를 해보면, int 값의 범위 초과로 오류가 발생한다. 단순히 값의 자료형을 long long 형으로 바꿔주면 해결된다.

테스트 HLOD 세팅 값.

  • HLOD Level 0
    • Cluster generation settings
      • Desired Bound Radius : 10000.0
      • Desired Filling Percentage : 50.0
      • Min Number Of Actors to Build : 2
    • Mesh generation settings
      • Transition Screen Size : 0.5
  • HLOD Level 1
    • Cluster generation settings
      • Desired Bound Radius : 25000.0
      • Desired Filling Percentage : 37.5
      • Min Number Of Actors to Build : 2
    • Mesh generation settings
      • Transition Screen Size : 0.3
  • HLOD Level 2
    • Cluster generation settings
      • Desired Bound Radius : 52500.0
      • Desired Filling Percentage : 28.125
      • Min Number Of Actors to Build : 2
    • Mesh generation settings
      • Transition Screen Size : 0.225
  • HLOD Level 3
    • Cluster generation settings
      • Desired Bound Radius : 131250.0
      • Desired Filling Percentage : 21.09375
      • Min Number Of Actors to Build : 2
    • Mesh generation settings
      • Transition Screen Size : 0.16875

Python 나무위키.

https://namu.wiki/w/Python

디자인 철학

Python 에서의 들여쓰기는 의무. 들여쓰기 자체로 코드 블럭이 된다.

def factorial(x):
    if x == 0:
        return 1
    else:
        return x * factorial(x - 1)

순수 객체지향

Python에는 원시 타입(Primitive Type) 이 없다. 모든 것이 객체로 취급된다. 상수 역시 상수가 저장된 객체라고 본다. 다음과 같은 상수 할당이 있을때,

x = 10

변수 x 에 10이 할당된 것이 아니라, 10이 저장된 상수 객체를 가리키는 것을 의미. 즉, 내부적으로는 C의 포인터 연산과 같은 동작이 행해지는 것이다.

x = 10
x = 20

이렇게 x에 대입되는 값을 변경할 경우, x가 가리키는 대상이 10이 저장된 상수 객체에서 20이 저장된 상수 객체로 바뀐 것이다.

파이썬의 객체는 변경 불가능한 객체 (Immutable Object)와 변경 가능한 객체(Mutable Object)로 나뉘며, 변경 불가능한 객체에는 상수, 문자열, 그리고 튜플이 있다. 이 세가지를 제외한 나머지 객체는 모두 변경 가능한 객체이며, 값을 수정 할 수 있다. 변경 불가능한 객체의 값을 수정할 때는 바뀐 값이 저장된 새로운 객체를 생성하고 해당 객체를 참조한다. 이와 같은 특징 때문에 파이썬은 순수 객체지향 언어라고 할 수 있고, 이와 같은 순수 객체지향 언어의 또다른 예로는 Ruby 가 있다.

함수의 매개변수로 Immutable 객체를 넘겼냐 Mutable 객체를 넘겼냐에 따라서 함수 바까에 있는 인자의 값도 수정할 수 있는지 없는지가 달라진다. Immutable 객체를 넘겼으면, 값의 복사만 일어나고 함수 바깥에는 영향을 주지 못하므로 ‘Call by Va;lue’ 가 될 것이며, Mutable 객체를 넘겼으면, 함수 바깥에 까지 영향을 줄 수 있으므로, ‘Call by Reference’ 가 될 것이다. 파이썬 공식 문서에서는 파이썬의 인자 전달 방식을 ‘Call byAssignment’ 또는 ‘Call by Object Reference’ 라고 명시 하고 있다.

반복 가능한 객체

파이썬의 가장 큰 특징 중 하나. 파이썬은 반복 가능한 객체(iterable)라는 강력한 기능을 제공한다. 이 객체는 집합, 문자열, 리스트, 튜플, 딕셔너리, 그리고 함수 까지도 반복이 가능하며, 이것을 for 구문에서 사용할 수 있게 해준다. 리스트와 튜플 등은 좀 편해지는 정도라 할 수있지만, 함수의 값을 반복할 수 있다는 것은 큰 장점이다. 그 예로, n의 배수를 구하는 f(n) 함수가 있을 때,

def f(n):
    x = 1
    while 1:
        yield n*x
        x += 1

와 같은 함수를 만드는 것도 가능하다. 함수를 호출하고 나서도 함수가 완전히 끝나기 전까지는 지역 변수가 남아있으며, 함수가 끝나야 지역변수가 삭제된다.

Google Cloud Platform

SnackLabChat 프로젝트 생성

DedicatedServer용 VM 인스턴스(가상서버) 생성

ssh key 생성 PuttyGen 을 사용.

메타데이터 > SSH 키 > “수정” 버튼 클릭 후 PuttyGen 에서 생성한 PublicKey 를 등록.

WinSCP 를 이용. 서버접속 완료.

4.20.3 소스 버전으로 fps example 데디케이티드 서버 테스트 빌드

WinSCP 로 구글 클라우드 의 VM에 접속된 상태.

ThirdPerson sample 프로젝트 리눅스 서버 빌드 및 서버에 실행