<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Clear</title>
        <link>https://velog.io/</link>
        <description>GameProgrammer</description>
        <lastBuildDate>Thu, 07 Dec 2023 08:17:01 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. Clear. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/clear_0324" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Shortest path finding]]></title>
            <link>https://velog.io/@clear_0324/Short-path-finding</link>
            <guid>https://velog.io/@clear_0324/Short-path-finding</guid>
            <pubDate>Thu, 07 Dec 2023 08:17:01 GMT</pubDate>
            <description><![CDATA[<h3 id="최단-경로-알고리즘">최단 경로 알고리즘</h3>
<blockquote>
</blockquote>
<p>그래프 내의 서로 다른 두 정점 사이를 연결하는 가중치의 총합이 최소가 되도록 연결하는 방법 찾기</p>
<h3 id="dijkstras-algorithm">Dijkstra&#39;s Algorithm</h3>
<blockquote>
<p>양수 가중치 간선만으로 이루어진 그래프에서의 최단 경로 탐색</p>
</blockquote>
<ul>
<li>구현<ul>
<li>현재 단계 정점에서 미방문 정점으로 진출하는 모든 인접 간선을 완화한다.</li>
<li>간선 완화가 완료되면 현재 단계 정점을 미방문 정점 집합에서 제거하고 인접 정점을 방문한다.</li>
<li>목표 정점에 방문하거나 미방문 정점들의 시험적 거리의 최소값이 무한대, 또는 미방문 정점의 집합이 공집합이 되면 알고리즘을 종료한다.</li>
</ul>
</li>
</ul>
<h3 id="bellman-ford-algorithm">Bellman-Ford Algorithm</h3>
<blockquote>
<p>음수 가중치 간선을 포함하는 그래프에서의 최단 경로 탐색, 음수 가중치 사이클 확인 과정 존재</p>
</blockquote>
<ul>
<li>구현<ul>
<li>매 단계별로 그래프 내의 모든 간선을 완화함으로써 경로를 탐색한다.</li>
<li>음수 사이클의 포함 여부를 확인하기 위해 경로를 구한 뒤, 모든 간선에 대한 완화를 1회 수행한다. 
<code>이 때 목표 정점에 도달하기 위한 가중치의 총합이 갱샌되는 경우는 음수 사이클 포함</code></li>
</ul>
</li>
</ul>
<h3 id="a-algorithm">A* Algorithm</h3>
<blockquote>
<p>시작 정점으로부터 현재 정점까지의 거리에 휴리스틱 추정값을 더하여 이동 비용을 계산하는 방법</p>
</blockquote>
<ul>
<li>구현<ul>
<li>현재 단계 정점에서 미방문 인접 정점으로의 이동 비용을 완화한다.</li>
<li>이동 비용 완화가 완료되면 현재 단계 정점을 미방문 정점 집합에서 제거하고, 인접 정점을 방문한다.</li>
<li>목표 정점에 방문하거나 미방문 정점들의 이동 비용의 최소값이 무한대 또는 미방문 정점의 집합이 공집합이 되면 알고리즘을 종료한다.</li>
</ul>
</li>
</ul>
<h3 id="floyd-warshall-algorithm">Floyd-Warshall Algorithm</h3>
<blockquote>
<p>모든 정점 쌍 간의 최단 경로의 길이 탐색</p>
</blockquote>
<ul>
<li>구현<ul>
<li>시작 정점을 s, 목표 정점을 e, 경유 정점을 w 라고 하고
두점 사이의 최단 경로를 저장하는 행렬<code>2차원 배열</code> D 를 만든다</li>
<li>중간 정점 w에 대하여 D[s][e] &gt; D[s][w] + D[w][e] 인 경우 값을 갱신하는 이중 반복문 
즉, 최종적으로 삼중 반복문 형태의 반복 계산을 수행한다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Minimum Spanning Tree]]></title>
            <link>https://velog.io/@clear_0324/Minimum-Spanning-Tree</link>
            <guid>https://velog.io/@clear_0324/Minimum-Spanning-Tree</guid>
            <pubDate>Thu, 07 Dec 2023 07:54:05 GMT</pubDate>
            <description><![CDATA[<h3 id="최소-비용-신장-트리">최소 비용 신장 트리</h3>
<blockquote>
</blockquote>
<p>그래프의 신장 트리 중, 간선의 가중치의 총합이 가장 작은 신장 트리</p>
<h3 id="prims-algorithm">Prim&#39;s Algorithm</h3>
<blockquote>
<p>현재 신장 트리에서 최소 가중치로 진출하는 미방문 정점 탐색</p>
</blockquote>
<ul>
<li>구현 <ul>
<li>시작 정점 하나로 구성되는 최초 부분 신장 트리를 만든다</li>
<li>현재 단계 부분 신장 트리에서 최소 가중치로 방문 가능한 미방문 정점<code>별도 변수 저장</code>을 찾     아 부분 신장 트리에 추가<code>정렬 또는 우선순위 큐 사용</code></li>
<li>모든 정점이 부분 신장 트리에 포함될 떄 까지 위 과정 반복</br></li>
</ul>
</li>
<li>단순 구현시 O(V^2) , 우선 순위 큐 사용시 (O(V+E)log V)</li>
</ul>
<h3 id="kruskals-algorithm">Kruskal&#39;s Algorithm</h3>
<blockquote>
<p>간선 정렬 및 서로소 집합 구조 활용</p>
</blockquote>
<ul>
<li>구현<ul>
<li>그래프의 간선들을 가중치의 오름 차순으로 정렬한다.</li>
<li>정렬된 간선 리스트<code>우선순위 큐</code>에서 최소 가중치이며, 사이클을 형상하지 않는<code>서로소 집합 구조</code> 간선과 정점을 부분 신장 트리에 추가 </br></li>
</ul>
</li>
<li>O(E log E)</li>
</ul>
<h3 id="boruvkas-alogrithm">Boruvka&#39;s Alogrithm</h3>
<blockquote>
<p>그래프 축약 활용, 병렬 프로그래밍에서 효과적</p>
</blockquote>
<ul>
<li>구현<ul>
<li>주어진 그래프의 모든 정점에 대해 정점별 최소 가중치 진출 간석을 찾아 연결하여 포레스트를 만든다. <code>그래프 축약</code></li>
<li>포레스트를 구성하는 트리들 사이에 순환이 발생하지 않고, 최소 가중치로 연결되는 간선을 찾아 연결한다.</li>
<li>포레스트가 하나의 트리로 연결될 때 까지 위 과정을 반복한다.</br></li>
</ul>
</li>
<li>O(E log V)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Basic Search Alogrithm]]></title>
            <link>https://velog.io/@clear_0324/Basic-Search-Alogrithm</link>
            <guid>https://velog.io/@clear_0324/Basic-Search-Alogrithm</guid>
            <pubDate>Thu, 07 Dec 2023 05:28:40 GMT</pubDate>
            <description><![CDATA[<h3 id="search-alogrithm">Search Alogrithm</h3>
<blockquote>
</blockquote>
<p>방대한 데이터에서 목적에 맞는 데이터를 찾아내기 위한 알고리즘</p>
<h3 id="sequential-search">Sequential Search</h3>
<blockquote>
</blockquote>
<pre><code class="language-cpp">int SequentialSearch(int arr[], int size, int findVal)
{
    int index = 0;
    for (int i = 0; i &lt; size; i++)
    {
        if (arr[i] == findVal)
        //{ 전진 이동법
        //    for (int j = i - 1; j &gt;= 0; j--)
        //        arr[j + 1] = arr[j];
        //}
        //arr[0] = findVal;
        return findVal;
    }
    return 0;
}</code></pre>
<p>배열 또는 리스트에서 특정한 값을 찾는 알고리즘</p>
<ul>
<li>자주 탐색하는 데이터를 배열의 앞쪽에 배치하여 순차탐색의 계산량을 줄이는 방법</li>
<li>O(n)</br></li>
<li>자기 구성 순차탐색
같은 데이터를 여러번 찾는 경우 효율이 떨어지기 때문에
탐색 빈도가 높은 데이터를 배열의 앞쪽에 배치하여 순차 탐색의 연산량을 줄이는 방법을 사용한다.<ul>
<li>전진 이동법 : 탐색된 데이터를 가장 앞쪽에 배치</li>
<li>전위법 : 해당 데이터가 탐색될 때 마다 한 칸씩 앞으로 이동</li>
</ul>
</li>
</ul>
<h3 id="binary-search">Binary Search</h3>
<blockquote>
</blockquote>
<pre><code class="language-cpp">void BinarySearch(int arr[], int num, int left, int right)
{
    while (left &lt;= right)
    {
        int middle = (left + right) / 2;
        if (num = arr[middle])
            return;
        //
        if (num &lt; arr[middle])
            right = middle - 1;
        else
            left = middle + 1;
    }
}</code></pre>
<p>이미 정렬된 상태의 배열에서 특정한 값을 빠르게 찾는 알고리즘</p>
<blockquote>
</blockquote>
<ul>
<li>배열의 중간 인덱스에 해당하는 요소와 비교하여 배열의 크기를 절반씩 줄여나가는 형태</li>
<li>O(log n)</li>
</ul>
<h3 id="tree-traversal">Tree traversal</h3>
<blockquote>
</blockquote>
<p>트리 구조 내의 모든 노드를 특정한 순서로 방문하는 알고리즘</p>
<blockquote>
</blockquote>
<ul>
<li>전위 순회</li>
<li>후위 순회</li>
<li>후위 순회
<a href="https://velog.io/@clear_0324/%EB%B9%84-%EC%84%A0%ED%98%95-%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0">트리 탐색 참조</a></li>
</ul>
<h3 id="graph-search">Graph Search</h3>
<blockquote>
</blockquote>
<ul>
<li>DFS : 깊이 우선 탐색<blockquote>
<blockquote>
</blockquote>
<p> 깊이를 우선 기준으로 하여 방문하는 알고리즘</p>
</blockquote>
<ul>
<li>정점을 방문한 뒤, 더이상 연결된 정점이 없을 때까지 인접한 정점을 재귀적으로 방문</li>
<li>O(n)</li>
</ul>
</li>
<li>BFS : 너비 우선 탐색<blockquote>
<blockquote>
</blockquote>
<p>현재 정점과 인접한 정점부터 우선으로 방문하는 알고리즘</p>
</blockquote>
<ul>
<li>정점을 방문한 뒤, 연결된 정점을 큐에 넣은 다음 큐에서 하나씩 인출하여 방문</li>
<li>O(n)</li>
</ul>
</li>
</ul>
<h3 id="hashing">Hashing</h3>
<blockquote>
</blockquote>
<p>임의의 길이의 데이터를 고정된 길이의 데이터로 매핑함으로써 데이터를 빠르게 탐색</p>
<ul>
<li>해시<code>code</code>
임의의 길이의 데이터를 해시 함수를 통해 변환한 고정 길이의 데이터</li>
<li>해시 테이블 
해시 코드와 그에 해당하는 데이터를 연관 컨테이너 형태로 저장하는 자료구조<ul>
<li>버킷
하나의 해시 코드를 저장하는 메모리 공간</li>
<li>슬롯
하나의 레코드가 저장되는 공간으로 하나의 버킷에 여러 슬롯이 존재할 수 있다.</li>
<li>오버플로
계산된 해시 코드에 해당하는 버킷 내에 저장할 메모리 공간이 없는 상태</li>
</ul>
</li>
<li>해시 함수
임의의 길이의 데이터를 고정 길이의 해시 코드로 매핑하는 함수
해시 함수의 성능에 따라 해싱 알고리즘의 효율성이 결정됨</li>
<li>해시 충돌
서로 다른 두 데이터가 동일한 해시 코드로 매밍되는 경우<ul>
<li>개방 주소법
해시 테이블의 다른 버킷에 데이터를 저장<code>해시 주소 변경</code><ul>
<li>선형탐사
충돌이 일어난 버킷의 다음 버킷에 저장</li>
<li>2차 검색
충돌이 일어난 버킷으로 부터 정해진 값만큼 건너 뛴 버킷에 저장</li>
<li>이중 해싱
충돌이 일어났을 때 다른 해시 함수를 이용해 추가 변환</li>
<li>재해싱
테이블의 리사이징과 함께 새 해시 함수로 새 테이블 생성</li>
</ul>
</li>
<li>폐쇄 주소법<code>체이닝</code>
충돌 버킷에 연결 리스트를 할당하여 연결 <code>해시 주소 유지</code></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Sorting Algorithm]]></title>
            <link>https://velog.io/@clear_0324/Sorting-Algorithm</link>
            <guid>https://velog.io/@clear_0324/Sorting-Algorithm</guid>
            <pubDate>Sun, 03 Dec 2023 20:51:58 GMT</pubDate>
            <description><![CDATA[<h3 id="bubble-sort">Bubble Sort</h3>
<blockquote>
</blockquote>
<pre><code class="language-c">void BubbleSort(Data* datas, int length)
{
    for (int i = 0; i &lt; length - 1; i++)
        for (int j = 0; j &lt; length - i - 1; j++)
            if (datas[j].Score &gt; datas[j + 1].Score)
                Swap(datas, j, j + 1);</code></pre>
<ul>
<li>직관적으로 이해하기에 쉽고 구현이 간단하지만 일반적으로 비효율적이다.</li>
<li>pairwise 비교를 통한 정렬</li>
<li>O(n^2)</li>
</ul>
<h3 id="selecting-sort">Selecting Sort</h3>
<blockquote>
</blockquote>
<pre><code class="language-c">void SelectingSort(Data* datas, int length)
{
    for (int i = 0; i &lt; length - 1; i++)
    {
        int minIndex = i;
        for (int j = i + 1; j &lt; length; j++)
            if (datas[j].Score &gt; datas[minIndex].Score) minIndex = j;
        if (minIndex != i) Swap(datas, i, minIndex);
    }
}</code></pre>
<blockquote>
</blockquote>
<ul>
<li>최솟값을 반복적으로 탐색하여 정렬</li>
<li>O(n^2)</li>
</ul>
<h3 id="insertion-sort">Insertion Sort</h3>
<blockquote>
</blockquote>
<pre><code class="language-c">void InsertionSort(Data* datas, int length)
{
    for (int i = 0; i &lt; length - 1; i++)
    {
        if (datas[i - 1].Score &gt; datas[i].Score) continue;
        Data current = datas[i];
        for (int j = 0; j &lt; i; j++)
            if (datas[j].Score &gt; current.Score)
            {
                memmove(&amp;datas[j + 1], &amp;datas[j], sizeof(datas[0]) * (i - j));
                datas[j] = current;
                break;
            }
    }
}</code></pre>
<ul>
<li>데이터의 삽입 위치를 탐색하면서 정렬</li>
<li>O(n^2)</li>
<li>최선의 경우 O(n)</li>
</ul>
<h3 id="merge-sort">Merge sort</h3>
<blockquote>
</blockquote>
<pre><code class="language-c">void Merge(Data* datas, int start, int middle, int end)
{
    int left = start;
    int right = middle + 1;
    int destIndex = 0;
    Data* dest = new Data[end - start + 1];
    // 왼쪽 부분 집합과 오른쪽 부분 집합에 대하여 순차적 비교
    while (left &lt;= middle &amp;&amp; right &lt;= end)
    {
        if (datas[left].Score &lt; datas[right].Score)
            dest[destIndex++] = datas[left++];
        else
            dest[destIndex++] = datas[right++];
    }
    // 나머지 데이터 그대로 이동
    while (left &lt;= middle)
        dest[destIndex++] = datas[left++];
    //
    while (right &lt;= end)
        dest[destIndex++] = datas[right++];
    //
    destIndex = 0;
    //
    for (int i = start; i &lt;= end; ++i)
        datas[i] = dest[destIndex++];
    delete[] dest;
}
void MergeSort(Data* datas, int start, int end)
{
    if (end - start &lt; 1)
        return;
    int middle = (start + end) / 2;
    MergeSort(datas, start, middle);
    MergeSort(datas, middle + 1, end);
    Merge(datas, start, middle, end);
}</code></pre>
<blockquote>
</blockquote>
<ul>
<li>데이터 균등 분할 후 합치면서 정렬</li>
<li>O(n log n)</br></li>
<li>구현<ul>
<li>분할 : 데이터를 균등한 크기를 분할</li>
<li>정복 : 부분 배열의 크기가 충분히 작지 않으면 다시 분할-정복</li>
<li>결합 : 정렬된 부분 배열을 하나로 합친다.</li>
</ul>
</li>
</ul>
<h3 id="quick-sort">Quick Sort</h3>
<blockquote>
</blockquote>
<pre><code class="language-c">int Partition(Data* datas, int left, int right)
{
    UINT first = left;
    UINT pivot = datas[first].Score;
    //
    left++;
    while (left &lt;= right)
    {
        while (datas[left].Score &lt;= pivot &amp;&amp; left &lt; right)
            left++;
        while (datas[right].Score &gt; pivot &amp;&amp; left &lt;= right)
            right--;
        //
        if (left &lt; right)
            Swap(&amp;datas[left], &amp;datas[right]);
        else
            break;
    }
    //
    Swap(&amp;datas[first], &amp;datas[right]);
    //
    return right;
}
void QuickSort(Data* datas, int left, int right)
{
    if (left &lt; right)
    {
        int index = Partition(datas, left, right);
        // 
        QuickSort(datas, left, index - 1);
        QuickSort(datas, index + 1, right);
    }
}</code></pre>
<ul>
<li>pivot 을 기준으로 균등형 분할, 병합하며 정렬</li>
<li>O(n log n)</li>
<li>이미 정렬된 데이터에 대해 O(n^2)</br></li>
<li>구현<ul>
<li>분할-정복
pivot 을 정하여 pivot 보다 작은 데이터는 왼쪽.
큰 데이터는 오른쪽으로 불균등 분할한다.
부분 배열의 크기가 충분히 작지 않으면 다시 분할-정복 방법을 적용한다.</li>
<li>결합
정렬된 부분 배열을 하나로 합친다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[문제해결 패러다임]]></title>
            <link>https://velog.io/@clear_0324/%EB%AC%B8%EC%A0%9C%ED%95%B4%EA%B2%B0-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84</link>
            <guid>https://velog.io/@clear_0324/%EB%AC%B8%EC%A0%9C%ED%95%B4%EA%B2%B0-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84</guid>
            <pubDate>Sun, 03 Dec 2023 19:28:48 GMT</pubDate>
            <description><![CDATA[<h3 id="alogoritm">Alogoritm</h3>
<blockquote>
</blockquote>
<p>문제를 해결하기 위한, 명확하며 순서화 된 명령</p>
<ul>
<li>입력</li>
<li>출력</li>
<li>명확성</li>
<li>유한성</li>
<li>효과성</li>
</ul>
<h3 id="문제-해결-패러다임--탐욕">문제 해결 패러다임 : 탐욕</h3>
<blockquote>
</blockquote>
<p>최적해를 구하는 데에 사용되는 근사적인 방법
<code>일반적으로 계산이 빠름</code></p>
<blockquote>
</blockquote>
<p>여러 경우 중 하나를 결정해야 할 때마다, 그 순간에 최적으로 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달한다.</p>
<blockquote>
</blockquote>
<ul>
<li>작동 실용성 조건<ul>
<li>탐욕스런 선택 
앞의 단계의 선택이 이후 단계의 선택에 영향을 주지 않는다.</li>
<li>최적 부분 구조
문제에 대한 최적해가 부분 문제에 대해서도 최적해이다.</li>
</ul>
</li>
</ul>
<h3 id="문제-해결-패러다임--분할---정복">문제 해결 패러다임 : 분할 - 정복</h3>
<blockquote>
</blockquote>
<p>분할 가능한 문제를 독립적인 작은 문제들로 분할한 다음,
각각의 부분 문제를 해결<code>정복</code>하고 이를 최정족으로 결합하여 문제의 해를 구하는 방법
<code>일반적으로 재귀또는 스택, 큐 자료 구조를 활용하여 구현된다.</code></p>
<blockquote>
</blockquote>
<ul>
<li>특징<ul>
<li>병렬 프로그래밍 가능</li>
<li>재귀로 인한 함수 호출 오버헤드, 스택 오버플로 주의</li>
</ul>
</li>
</ul>
<h3 id="문제해결-패러다임--동적-계획법">문제해결 패러다임 : 동적 계획법</h3>
<blockquote>
</blockquote>
<p>복잡한 문제를 여러 개의 나누어 푸는 방법 <code>각 문제가 서로 종속적</code></p>
<ul>
<li>메모이제이션
이전에 계산한 값을 메모리에 저장하여 동일한 계산 반복 회피</li>
<li>타뷸레이션
필요 여부와 관계 없이 미리 계산해 두어 동일한 계산 반복 회피</li>
</ul>
<h3 id="문제해결-패러다임--백트래킹">문제해결 패러다임 : 백트래킹</h3>
<blockquote>
</blockquote>
<p>해를 찾는 도중, 해가 아니어서 막힌다면 이전 단계로 되돌아가서 다시 해를 찾아가는 방법</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[비 선형 자료 구조]]></title>
            <link>https://velog.io/@clear_0324/%EB%B9%84-%EC%84%A0%ED%98%95-%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@clear_0324/%EB%B9%84-%EC%84%A0%ED%98%95-%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Sun, 03 Dec 2023 17:43:00 GMT</pubDate>
            <description><![CDATA[<h3 id="비선형-자료-구조">비선형 자료 구조</h3>
<blockquote>
</blockquote>
<p>자료 사이의 전후 관계가 1:1 이 아닌 구조</p>
<h3 id="tree">Tree</h3>
<blockquote>
</blockquote>
<p>회로<code>cycle</code>가 없는 연결된 그래프
<img src="https://velog.velcdn.com/images/clear_0324/post/fde23e8c-266d-4038-86a8-13ac78942940/image.png" alt=""></p>
<h3 id="이진-트리">이진 트리</h3>
<blockquote>
</blockquote>
<p>모든 노드의 차수<code>자식노드 개수</code>가 2 이하로만 있는 이루어진 트리
</br></p>
<ul>
<li>종류<ul>
<li>완전 이진 트리 
마지막 레벨을 제외한 모든 레벨에서 노드가 꽉차 있는 이진 트리
<img src="https://velog.velcdn.com/images/clear_0324/post/c173ea69-689e-4c9a-8eeb-e381c7bf04a7/image.png" alt=""></li>
<li>정 이진 트리
모든 노드의 차수가 0 또는 2인 이진 트리
<img src="https://velog.velcdn.com/images/clear_0324/post/1872bec4-d153-444e-b78b-7fbbd25a8729/image.png" alt=""></li>
<li>포화 이진 트리
모든 내부의 차수가 0 또는 2인 이진트리
<img src="https://velog.velcdn.com/images/clear_0324/post/c055bc9e-6466-4876-8a39-a6f13aa0f4c9/image.png" alt=""></li>
</ul>
</li>
</ul>
<p><code>그림 출저 : https://seen-ma.tistory.com</code>  </p>
<h3 id="-완전-이진-트리">+ 완전 이진 트리</h3>
<blockquote>
</blockquote>
<p>배열 구현이 간편함.</p>
<ul>
<li>루트 노드의 인덱스 = 0
레벨이 낮은 노드부터 왼쪽 노드부터 인덱스 부여<blockquote>
</blockquote>
부모 노드의 인덱스가 n 일 때,
1 ) 왼쪽 자식 노드의 인덱스 : 2n + 1
2 ) 오른쪽 자식 노드의 인덱스 : 2(n + 1)</li>
</ul>
<h3 id="이진-트리-구조-순회">이진 트리 구조 순회</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/dffda09f-9d4f-4b97-b9a6-ec3e344a4fd5/image.png" alt=""></p>
<blockquote>
</blockquote>
<ul>
<li>전위 순회<ul>
<li>루트 -&gt; 왼쪽 부분 트리 -&gt; 오른쪽 부분 트리 순</li>
<li>루트로 부터 값을 누적 시킬 때 주로 사용</li>
<li>5 9 14 33 17 18 27 11 19 21</li>
</ul>
</li>
<li>중위 순회<ul>
<li>왼쪽 부분 트리 -&gt; 현재 노드 -&gt; 오른쪽 부분 트리 순</li>
<li>수식 트리 구조 , 상태 판단을 하는 경우 주로 사용</li>
<li>33 14 17 9 18 27 5 11 19 21</li>
</ul>
</li>
<li>후위 순회<ul>
<li>왼쪽 부분 하위 트리 -&gt; 오른쪽 하위 트리 -&gt; 현재 노드 순</li>
<li>말단 노드 삭제 , 말단 노트로 부터 값을 누적하는 경우 주로 사용</li>
<li>33 17 14 27 18 9 19 21 11 5</li>
</ul>
</li>
</ul>
<h3 id="이진-탐색-트리">이진 탐색 트리</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/1e6093b3-e381-4ff0-9f76-8c6a0e4138dc/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>다음의 규칙을 만족하는 이진 트리</p>
<ul>
<li>모든 노드는 비교할 수 있는 키 값을 가지며 , 값들은 전순서가 있다.</li>
<li>모든 노드의 왼쪽 자손 노드들은 부모 노드보다 작은 키를 가지는 노드만 존재한다.</li>
<li>모든 노드의 오른쪽 자손 노드들은 부모 노드보다 큰 키를 가지는 노드만 존재한다.</li>
<li>이진 탐색 트리의 부분 트리는 항상 이진 탐색 트리 구조이다.</br></li>
<li>구현<ul>
<li>노트 탐색·삽입
루트 노드부터 시작하여 자손 노드가 없을 때 까지 데이터 비교</li>
<li>노드 제거<ul>
<li>자손 노드가 없을 경우 : 노드 삭제</li>
<li>자손 노드가 하나만 있는 경우
현재 노드의 부모 노드와 자손 노드를 연결한 뒤 노드 삭제
즉, 하위 부분 트리를 한 레벨씩 올림.</li>
<li>자손 노드가 두 개 있는 경우
우측 자손 트리에서 최솟값을 가지는 말단 노드를 찾아
 해당 말단 노드의 데이터와 삭제할 노드의 데이터를 교체 이후 해당 말단 노드 삭제</br></li>
</ul>
</li>
</ul>
</li>
<li>시간 복잡도<ul>
<li>트리가 균형 상태일시 탐색·삽입·삭제 시간 O(log n)</li>
<li>최악일 시 O(n)</li>
</ul>
</li>
</ul>
<h3 id="이진-힙-트리">이진 힙 트리</h3>
<blockquote>
</blockquote>
<p>다음의 규칙을 만족하는 이진 트리</p>
<ul>
<li>부모 노드의 값이 자식 노드의 값보다 항상 크다 <code>max heap</code></li>
<li>부모 노드의 값이 자식 노드의 값보다 항상 작다 <code>min heap</code></br></li>
<li>구현<ul>
<li>노드 탐색 
루트 노드만 탐색
일반적인 트리 순회 · 노드 탐색은 고려하지 않음.</li>
<li>노드 삽입 
완전 이진 트리를 유지하도록 마지막 레벨의 가장 우측 노드 자리에 삽입한 뒤
재귀적으로 부모 노드와 비교하여 힙 속성을 만족하도록 노드간 데이터 교체</li>
<li>노드 제거
마지막 레벨의 가장 우측 노드와 루트 노드의 데이터를 교체한 다음,
힙 속성을 만족할 때까지 재귀적으로 자식 노드와 데이터를 비교하여 교체</br></li>
</ul>
</li>
<li>시간 복잡도
노드의 삽입/제거의 시간 복잡도는 O(log n)이다.
<code>시간 복잡도가 트리의 높이에만 의존</code></br>
완전 이진 트리 구조를 항상 유지해야 한다.
priority queue 를 구현 하는데 사용한다.

</li>
</ul>
<h3 id="-stl-priority-queue">+ STL priority queue</h3>
<blockquote>
</blockquote>
<p>우선 순위가 높·낮은 순으로 요소를 인출하는 큐 구조</p>
<blockquote>
</blockquote>
<ul>
<li>STL priority_queue&lt;_Ty, _Container, _Pr&gt;<ul>
<li>Container = vector&lt;_Ty&gt; <code>기본</code></li>
<li>_Pr = less&lt;_Ty&gt;
우선 순위를 비교하기 위해 비교 연산자가 존재한다.
&lt; : max heap 구조가 나타난다.
&gt; : min heap 구조가 나타난다.</li>
</ul>
</li>
</ul>
<h3 id="avl-tree">AVL Tree</h3>
<blockquote>
</blockquote>
<p>대표적 자가 균형 이진 탐색 트리</p>
<ul>
<li>모든 노드에서 왼쪽 자손 트리의 높이와 오른쪽 자손 트리의 높이 차이가 1이하인 트리구조</li>
<li>이상적인 상황, 최악의상황 모두 노트 탐색/삽입/제거의 시간 복잡도가 O(log n)</li>
<li>노드 삽입/제거 시에 부분 트리를 회전함으로써 균형 유지
<code>각 노드 별 balance factor 계산</code><blockquote>
</blockquote>
</li>
</ul>
</br>
균형이 잘 잡힌 트리이지만
다른 자가 균형 이진 트리에 비해 삽입/제거가 느리다.

<h3 id="red-black-tree">Red-Black Tree</h3>
<blockquote>
</blockquote>
<p>다음 조건을 만족하는 대표적 자가 균형 이진 트리</p>
<ul>
<li>모든 노드는 레드 아니면 블랙이다.</li>
<li>모든 NIL 리프 노드는 블랙이다.</li>
<li>레드 노드의 자식 노드는 언제나 블랙이다. <code>블랙 노드만이 레드 노드의 부모가 될 수 있다.</code>
따라서 루트 노드는 반드시 블랙이다.</li>
<li>임의의 한 노드에서 널 리프 노드까지 도달하는 모든 경로에는
널 리프 노드를 제외하고 항상 같은 수의 블랙 노드가 있다.</br></li>
<li>균형을 유지하기 위한 규칙들을 만족하기 위해 노드/삽입 제거시 부분 트리를 회전
노드 삽입·삭제 case 에 따른 회전 규칙이 매우 다양하다.</li>
<li>구현이 매우 까다롭지만 일반적인 경우에서 높은 성능을 보인다.</li>
<li>STL 의 set , map 클래스가 red-black tree 에 기반하여 구현 되어 있다</li>
<li>균형이 적절하게 잡히므로 다른 자가 균형 이진 트리에 비해 삽입·제거가 빠르다.</br></li>
<li>시간 복잡도<ul>
<li>균형 유지 O(1)</li>
<li>노드 탑색·삽입·삭제 O(log n)</li>
</ul>
</li>
</ul>
<h3 id="서로소-집합-구조">서로소 집합 구조</h3>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/39a7ed99-dcb2-4c26-be53-2f0981cd671f/image.png" alt=""></p>
<blockquote>
</blockquote>
<p>상호 배타적으로 이루어진 집합을 효율적으로 표현하기 위한 구조</p>
<ul>
<li>union 연산 : 서로 다른 두개의 집합을 하나의 집합으로 병합하는 연산
항상 작은 트리를 큰 트리 루트에 붙이는 형태로 유니온 연산을 구현한다. <code>최적화</code></li>
<li>Find 연산 : 하나의 원소가 어떤 집합에 속해 있는지 판단. <code>O(1)</code>
루트 노드를 찾을 때 까지 방문한 노드들의 부모 노드를 루트 노드로 갱신한다. <code>최적화, 경로 압축</code></br></li>
<li>구현<pre><code class="language-c">template&lt;typename T&gt;
class DisjointSet
{
public :
  struct Set
  {
      T Data;
      Set* Parent;
  };
  static void Union(Set* a, Set* b)
  {
      if (a == b) return;
      Set* pa = Find(a);
      Set* pb = Find(b);
      if (pa == pb) return;
      pb-&gt;Parent = a;
  }
  static void Find(Set* a)
  {
      if (a == a-&gt;Parent) return a;
      return a-&gt;Parent = Find(a-&gt;Parent); // 경로 압축
  }
}</code></pre>
</li>
</ul>
<h3 id="그래프">그래프</h3>
<blockquote>
</blockquote>
<p>정점과 각 정점을 연결하는 변으로 구성되는 자료구조</p>
<ul>
<li>각각의 변<code>간선</code>은 가중치를 가질 수 있다.</li>
<li>트리와는 다르게 시작 정점의 위치가 고정적이지 않을 수 있다.</li>
<li>변으로 연결된 정점들 사이에 순환이 가능하다.</li>
<li>행렬 또는 연결 리스트로 구현 가능하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[선형 자료 구조]]></title>
            <link>https://velog.io/@clear_0324/%EC%84%A0%ED%98%95-%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@clear_0324/%EC%84%A0%ED%98%95-%EC%9E%90%EB%A3%8C-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Sat, 02 Dec 2023 11:38:52 GMT</pubDate>
            <description><![CDATA[<h3 id="선형-자료-구조">선형 자료 구조</h3>
<blockquote>
</blockquote>
<p>자료 사이의 전후 관계가 1:1 인 자료구조</p>
<h3 id="array">Array</h3>
<blockquote>
</blockquote>
<ul>
<li>연속적인 메모리 공간 사용</li>
<li>동일한 타입의 데이터</li>
<li>배열 전체에 대한 잦은 할당/해제 <code>메모리 단편화</code></li>
<li>인덱스 접근이 가능</li>
<li>종류<ul>
<li>일반 배열</li>
<li>STL array&lt;_Ty, _Size&gt; <code>정적 배열</code> </li>
<li>STL vector&lt;_Ty, _Alloc&gt; <code>동적 배열</code></li>
</ul>
</li>
</ul>
<h3 id="list">List</h3>
<blockquote>
</blockquote>
<ul>
<li>연속적이지 않은 메모리 공간 사용</li>
<li>포인터를 통한 불연속적인 연결 행태</li>
<li>노드<code>데이터 저장 단위</code> 단위 메모리 할당/해제</li>
<li>데이터들 사이에 삽입/해제가 비교적 편리한 구조</li>
<li>방향에 따른 단·양방향 리스트로 나뉜다.</li>
<li>종류<ul>
<li>STL list&lt;_Ty,_Allloc&gt;  <code>양방향</code></li>
<li>구현<pre><code class="language-cpp">template &lt;class T&gt;
class List
{
public :
struct Node
{
    T Data;
    Node* Next;
    // Node * prev; 양방향
};
private :
Node* Head;
// Node* Tail; 양방향
//...
};</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="stack">Stack</h3>
<blockquote>
</blockquote>
<ul>
<li>LIFO</li>
<li>종류<ul>
<li>STL stack&lt;_Ty, _Container&gt;</li>
<li>구현<pre><code class="language-cpp">#include &lt;vector&gt;
template&lt;class T&gt;
class StackByArray
{
private :
std::vector&lt;T&gt; Data;
int Top = -1;
};
template&lt;typename T&gt;
class StackByArray
{
public :
struct Node
{
    T Data;
    Node* Next;
};
private :
Node* Top;
};</code></pre>
</li>
</ul>
</li>
</ul>
<h3 id="queue">Queue</h3>
<blockquote>
</blockquote>
<ul>
<li>FIFO<ul>
<li>종류</li>
</ul>
</li>
<li>STL queue&lt;_Ty,_Container&gt;</li>
<li>구현<pre><code class="language-cpp">#include &lt;vector&gt;
template&lt;class T&gt;
class QueueByArray
{
private:
std::vector&lt;T&gt; Data;
int Front;
int Rear;
};
template&lt;class T&gt;
class QueueByList
{
public :
struct Node
{
    T Data;
    Node* Next;
};
private :
Node* Front;
Node* Rear;
};</code></pre>
</li>
</ul>
<h3 id="환형-큐">환형 큐</h3>
<blockquote>
</blockquote>
<p>기본적인 큐 구조의 단점<code>메모리 낭비</code>을 보완하기 위한 자료구조
<img src="https://velog.velcdn.com/images/clear_0324/post/06934920-6a12-48cf-93e8-cb11227c963c/image.png" alt=""></p>
<ul>
<li>크키<code>capacity</code> 고정</li>
<li>환형 큐를 구현할 때 Front == Rear 인 경우 full·empty 를 구별하기 위해
실제 큐의 최대 요소 개수 -1 을 capacity 로 설정하여 관리한다.</li>
</ul>
<h3 id="deque">deque</h3>
<blockquote>
</blockquote>
<p>양방향 삽입/인출이 가능한 큐 구조
  <img src="https://velog.velcdn.com/images/clear_0324/post/f6621b3f-8bda-456d-b3d0-90b981ae6a7d/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[string]]></title>
            <link>https://velog.io/@clear_0324/string</link>
            <guid>https://velog.io/@clear_0324/string</guid>
            <pubDate>Tue, 21 Nov 2023 04:33:18 GMT</pubDate>
            <description><![CDATA[<h3 id="문자열">문자열</h3>
<blockquote>
</blockquote>
<p>문자들의 집합을 의미한다.</p>
<ul>
<li>C/C++ 에서는 특별히 문자열을 위한 타입을 기본적으로 제공하지 않으며 문자 배열로 표현한다.</li>
<li>NULL 종료 문자열을 문자열 끝에 넣어 문자열의 범위를 판별할 수 있도록 한다.
<code>문자열을 파악하기 위해 NULL 위치를 찾아야한다.</code></li>
<li>문자열을 쉽게 다룰 수 있는 자료구조 string 을 C++ 표준 라이브러리에서 제공한다.</li>
</ul>
<h3 id="strlen">strlen</h3>
<blockquote>
</blockquote>
<ul>
<li>문자 배열
문자열의 시작부터 NULL 을 찾을 때 까지 매번 검색한다</li>
<li>string
문자열 정보를 저장하고 있어 길이 정보 반환.</li>
</ul>
<h3 id="c_str">c_str</h3>
<blockquote>
</blockquote>
<p>문자열이 저장된 위치를 반환한다.</p>
<h3 id="문자열-타입-반환">문자열 타입 반환</h3>
<blockquote>
</blockquote>
<pre><code class="language-cpp">Func(&quot;Hello World&#39;); </code></pre>
<p>매개 변수 타입에 따른 함수 호출 우선 순위
const char* &gt;  string &gt; char* &gt; void*</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Character]]></title>
            <link>https://velog.io/@clear_0324/char</link>
            <guid>https://velog.io/@clear_0324/char</guid>
            <pubDate>Tue, 21 Nov 2023 04:25:19 GMT</pubDate>
            <description><![CDATA[<h3 id="char">char</h3>
<blockquote>
</blockquote>
<p>문자 전용 타입으로 ASCII 인코딩을 사용하여 문자를 비트 상태와 대응시킨다.
알파벳, 특수문자, 제어문자 등으로 모든 문자의 개수가 128개 이므로 7bit 만 사용한다.
<code>이것은 맨 왼쪽 비트가 0 으로 설정되어 있는 것을 알 수 있다.</code></p>
<h3 id="유니코드">유니코드</h3>
<blockquote>
</blockquote>
<p>세상 모든 문자들에게 코드를 부여한 것을 의미한다.
</br></p>
<ul>
<li>기원
알파벳을 특정한 ASCII 코드로서는 모든 문자를 나타낼 수 없었기 때문에 각각의 문자를
표현하기 위해 char 를 변형하여 맨 왼쪽 비트가 1일 경우 char 를 2개 묶어 한 문자로
표현하는 방법을 사용하였는데 이를 코드페이지라 한다.
코드페이지는 각 문화권에 따라 개별적으로 존재하며 같은 비트를 가지더라도 다르게 해석하는 경우가 있으며 이는 언어별 호환성에 상당한 제약을 주었다.
하여 모든 문자들을 단일 코드로 통합하는 유니코드가 탄생하게 되었다.</li>
</ul>
<h3 id="utf---n">UTF - N</h3>
<blockquote>
</blockquote>
<p>유니코들를 실제 컴퓨터의 타입으로 변형하는 것으로 N 비트의 배수로 한 문자를 표현하는 의미이다.</p>
<h3 id="wchar_t">wchar_t</h3>
<blockquote>
</blockquote>
<p>C++ 에서 UTF-16·18 제공하는 데이터 타입이다.
wide character 형태를 표현하기 위해선 L 매크로를 사용한다.</p>
<pre><code class="language-cpp">&#39;A&#39; // = char 형
L&#39;A&#39; // = wchar_t 형
&quot;ABC&quot; // = char 형 배열
L&quot;ABC&quot; // = wchar_t 형 배열</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Graphics]]></title>
            <link>https://velog.io/@clear_0324/Graphics</link>
            <guid>https://velog.io/@clear_0324/Graphics</guid>
            <pubDate>Sun, 19 Nov 2023 07:12:10 GMT</pubDate>
            <description><![CDATA[<h3 id="렌더링-파이프라인-과정">렌더링 파이프라인 과정</h3>
<blockquote>
</blockquote>
<ul>
<li>렌더링할 지오 메트리 <code>정점 정보 및 primitive topology...</code> 데이터 입력</li>
<li>정점 변환 <code>월드배치 , 카메라 뷰... 구현</code> 투영</li>
<li>레스터 라이저 <code>각 정점 사이 픽셀화</code></li>
<li>화면 공간으로의 매핑을 통한 렌더링 화면 제공</li>
</ul>
<h3 id="버퍼-종류">버퍼 종류</h3>
<blockquote>
</blockquote>
<ul>
<li>정점 버퍼
정점 데이터를 GPU 로 전달</li>
<li>인덱스 버퍼
정점을 primitive topology 에 근거하여 도형을 그릴 시 정점 오프셋을 나타내는 정수 데이터</li>
<li>상수 버퍼
셰이더 상수 데이터를 GPU 로 전달</li>
</ul>
<h3 id="tessellation--dx11-기반-">Tessellation ( DX11 기반 )</h3>
<blockquote>
</blockquote>
<ul>
<li>덮개 셰이더
테셀레이션 매개변수를 받아 제어점 생성 <code>다음 단게에 사용할 데이터 생성</code></li>
<li>테셀레이션
전달 받은 데이터 토대로 기존 지오메트리를 작은 삼각형으로 분할하기 위한 정점 생성</li>
<li>영역 셰이더
만들어진 정점 위치 계산</li>
</ul>
<h3 id="오른손·왼손-좌표계">오른손·왼손 좌표계</h3>
<blockquote>
</blockquote>
<ul>
<li>외적이 정의되는 방향이 서로 반대 <code>z축의 방향 반전 관계</code></li>
<li>회전의 양의 방향 반대 <code>외적 방향 = 회전축의 방향</code></li>
</ul>
<h3 id="변환과-행렬-관계">변환과 행렬 관계</h3>
<blockquote>
</blockquote>
<ul>
<li>변환
n 차원 벡터 공간에 속한 원소를 m 차원 벡터 공간에 속한 원소로 대응시키는 것</li>
<li>선형 변환
연립일차방정식 형태로 대응 관계를 표현할 수 있는 변환 <code>행렬 표현 가능</code></li>
</ul>
<h3 id="3차원-공간의-평행이동">3차원 공간의 평행이동</h3>
<blockquote>
</blockquote>
<ul>
<li>아핀 변환을 첨가 행렬 형태로 표현
<code>아핀 변환 | 3 차원 공간 내에서 선형 변환을 통한 평행 이동 표현 불가</code>
<code>첨가 행렬 | 4 차원 공간 상에서의 선형 변환 표현 가능</code></li>
<li>위의 평행 이동 변환이 4차원 공간 위에서의 선형 변환중 전단 변환과 동일
<code>정점과 행렬 표현시 4차원 공간 기준 표현</code></li>
</ul>
<h3 id="짐벌락">짐벌락</h3>
<blockquote>
</blockquote>
<p>각 기저 축에 대한 회전이 종속적 <code>오일러각</code> 적용 될 때 특정 축 회전에 의한 나머지 두 축이 겹쳐져 회전축의 자유도를 상실하는 현상</p>
<h3 id="단위-쿼터니온의-회전-변환">단위 쿼터니온의 회전 변환</h3>
<blockquote>
</blockquote>
<ul>
<li>Quatainon P(qPq*, 0)
<code>실수부 | 0</code> 
<code>허수부 | 로드리게스 공식에 기반한 특정 회전축에 2θ 회전된 위치를 나타내는 쿼터니온</code><ul>
<li>(P , 0) <code>변환할 정점 위치의 쿼터니온 표현</code></li>
<li>q <code>임의의 단위 쿼터니온</code></li>
<li>q* <code>켤레 쿼터니온</code></li>
</ul>
</li>
</ul>
<h3 id="오일러각·단위-쿼터니온-장·단점">오일러각·단위 쿼터니온 장·단점</h3>
<blockquote>
</blockquote>
<ul>
<li>오일러각<ul>
<li>직관적</li>
<li>데이터 저장 개수 | 3</li>
<li>임의의 축 회전 연산이 번거로움</li>
<li>짐벌락 현상 발생</li>
</ul>
</li>
<li>단위 쿼터니온<ul>
<li>연산 ↑ <code>삼각함수 연산x</code></li>
<li>구면 선형 보간 가능</li>
<li>데이터 저장 개수 | 4</li>
</ul>
</li>
</ul>
<h3 id="구면-선형-보간">구면 선형 보간</h3>
<blockquote>
</blockquote>
<p>단위 쿼터니온 4차원 공간 상의 초구위에 표현했을 때 두 쿼터니온 사이를 구면을 따라 직선으로 보간하는 방법이며 서로 다른 2개의 회전 표현에 대한 선형 보간을 의미.</p>
<h3 id="직교·원근-투영">직교·원근 투영</h3>
<blockquote>
</blockquote>
<ul>
<li>직교투영<ul>
<li>투영선이 투영면과 직교하도록 투영</li>
<li>거리에 관계 없이 투영 <code>원근감x</code></li>
</ul>
</li>
<li>원근 투영<ul>
<li>투영선이 하나 이상의 소실점을 수렴하도록 투영 <code>원근감o</code></li>
</ul>
</li>
</ul>
<h3 id="투영-공간-변환">투영 공간 변환</h3>
<blockquote>
</blockquote>
<ul>
<li>클리핑 , 컬링과 같은 렌더링 처리 기술 가능</li>
<li>렌더링할 오브젝트 역변환 가능<blockquote>
</blockquote>
평면 투영시 z 축 상실 <code>렌더링 처리 기술, 역변환 불가</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Data Structure & Algorithm]]></title>
            <link>https://velog.io/@clear_0324/Data-Structure-Algorithm</link>
            <guid>https://velog.io/@clear_0324/Data-Structure-Algorithm</guid>
            <pubDate>Sun, 19 Nov 2023 06:29:55 GMT</pubDate>
            <description><![CDATA[<h3 id="배열-기반-자료구조-특징">배열 기반 자료구조 특징</h3>
<blockquote>
</blockquote>
<ul>
<li>메모리 상 연속적인 위치</li>
<li>순차적인 액세스가 매우 빠름 <code>캐시 메모리 작동 측면</code></li>
<li>직관적</li>
<li>인덱스를 통한 빠른 접근</li>
<li>특정 위치 데이터 삽입 과정이 복잡함</li>
<li>빈번한 할당·해제로 인한 메모리 단편화 우려</li>
</ul>
<h3 id="연결-리스트-자료구조-특징">연결 리스트 자료구조 특징</h3>
<blockquote>
</blockquote>
<ul>
<li>메모리 상 불 연속적인 위치</li>
<li>포인터를 통한 요소 접근 <code>default</code></li>
<li>헤드 노드부터 순차적 접근을 통한 요소 접근</li>
<li>특정 위치 데이터 삽입 과장이 간단함</li>
</ul>
<h3 id="메모리-단편화">메모리 단편화</h3>
<blockquote>
</blockquote>
<p>주기억 장치의 빈 공간이 여러 개의 조각으로 나뉘는 현상</p>
<ul>
<li>사용가능한 공간 축소 ↓</li>
<li>읽기/쓰기 속도 ↓</li>
<li>내부 단편화<blockquote>
<blockquote>
</blockquote>
<p>의도하지 않는 메모리 할당으로 낭비되는 현상
<code>필요한 메모리의 크기보다 큰 단위로 할당되는 경우</code></p>
</blockquote>
</li>
<li>외부 단편화<blockquote>
<blockquote>
</blockquote>
<p>프로그램이 다양한 크기의 남은 영역을 할당·해제로 인해 빈 공간이 
여러 작은 조각으로  나뉘는 현상</p>
</blockquote>
<ul>
<li>사용 가능한 메모리 공간 총합 여유</li>
<li>메모리 할당 알고리즘 약화 <code>프로그램 성능 저하</code></li>
</ul>
</li>
</ul>
<h3 id="push-·-emplace">push · emplace</h3>
<blockquote>
</blockquote>
<ul>
<li><p>push</p>
<ul>
<li>복사 생성자 호출 <code>default</code></li>
<li>이동 생성자 호출 <code>r-value</code></li>
<li>오버 헤드 발생 <code>이동·복사</code></li>
</ul>
</li>
<li><p>emplace</p>
<ul>
<li>내부에서 객체 생성</li>
<li>버그 발생 우려 <code>예기치 못한 타입 변환</code></li>
</ul>
<h3 id="높이가-n-인-포화이진트리-노드-총-개수">높이가 n 인 포화이진트리 노드 총 개수</h3>
<blockquote>
</blockquote>
<p>2 ^ (n+1) - 1 <code>말단 노드 제외한 모든 노드 차수가 2</code></p>
<h3 id="이진-힙-트리">이진 힙 트리</h3>
<blockquote>
<p>힙 속성을 만족하며 최댓값·최솟값을 O(1) 시간복잡도로 탐색위한 완전 이진 트리 자료 구조 </p>
</blockquote>
<ul>
<li>노드 삽입·제거 → 부모</li>
<li>자식 노드 사이의 키값의 재귀적인 비교</li>
<li>O(log n)</li>
</ul>
<p><code>힙 속성 | 부모 노드 키 값이 자식 노드 키 값보다 항상 크거나 작은 성질</code></p>
<h3 id="이진-탐색-트리의-on-상황">이진 탐색 트리의 O(n) 상황</h3>
<blockquote>
</blockquote>
<ul>
<li>불균형 상태의 극단적인 경우 발생 <code>단순 연결 리스트와 동일</code></li>
<li>자가 균형 이진 탐색 트리를 통한 해결 <code>AVL , Red-Black 트리</code></li>
</ul>
<p><code>불균형 상태 | 루트 노드 기준으로 부분 트리의 높이가 한 방향으로 크게 치우져져 있는 상태</code>
<code>자가 균형 이진트리| 노드 삽입·제거시 규칙에 따라 부분 트리의 회전을 통해 균형을 유지하는 자료구조</code></p>
<h3 id="서로-집합-자료구조의-union-find-연산-최적화">서로 집합 자료구조의 union-find 연산 최적화</h3>
<blockquote>
</blockquote>
<ul>
<li>union by rank
항상 크기가 작은 집합을 큰 집합 하위 연결하는 형태로 유니온 연산을 구현</li>
<li>경로 압축
루트 노트들 찾을 때 까지 방문 노드를 루트 노드로 갱신</li>
</ul>
<h3 id="알고리즘-복잡도-표현">알고리즘 복잡도 표현</h3>
<blockquote>
</blockquote>
<ul>
<li>시간 복잡도<ul>
<li>연산 소요 시간</li>
<li>주로 사용 <code>현대 컴퓨터의 메모리 여유성</code></li>
<li>점근 표기법 사용 
<code>상한 (빅 오), 하한 (빅 오메가), 상한·하한의 종합적 (빅 세타)</code></li>
<li>최장 시간 파악 중요 <code>default</code></li>
</ul>
</li>
<li>공간 복잡도    <ul>
<li>연산 사용 메모리</li>
</ul>
</li>
</ul>
<h3 id="가변-크기-컨테이너의-capacity">가변 크기 컨테이너의 Capacity</h3>
<blockquote>
</blockquote>
<ul>
<li>시간 복잡도
요소 추가·제거 &lt; 실제 크기 증가
매 번 요소 추가시 컨테이너 크기 증가는 재할당으로 인한 오버헤드 초래</li>
<li>해결 방법
현재 capacity 에 비례하는 크기로 적절하게 늘리는 방식 사용</li>
</ul>
</li>
</ul>
<h3 id="슬랙">슬랙</h3>
<blockquote>
</blockquote>
<p>컨테이너가 저장할 수 있는 요소 최대 개수인 capacity 와 실제 컨테이너 
저장 요소 개수인 size 의 차이</p>
<h3 id="분할-정복-동적계획법-차이">분할-정복, 동적계획법 차이</h3>
<blockquote>
</blockquote>
<ul>
<li>분할-정복<ul>
<li>주어진 문제를 독립적인 작은 문제 분할</li>
<li>부분 문제 해결</li>
<li>결합하여 문제의 해 도출</li>
</ul>
</li>
<li>동적계획법
주어진 문제를 분할 시 이전 단계의 결과가 이후 단계에서 활용되어 문제를 해결</li>
</ul>
<h3 id="버블·선택·삽입-정렬의-실행-속도-차이">버블·선택·삽입 정렬의 실행 속도 차이</h3>
<blockquote>
</blockquote>
<ul>
<li>버블 정렬
pairwise 비교를 통해 정렬 순서가 마지 않을 시 요소 swap <code>가장 느림</code></li>
<li>선택 정렬
최소값을 찾는 과정 반복 필요 매 →  반복마다 남아있는 요소 재탐색 <code>중간</code></li>
<li>삽입 정렬
이미 정렬되어 있는 데이터가 존재 <code>가장 빠름</code></li>
</ul>
<h3 id="삽입-정렬-on">삽입 정렬 O(n)</h3>
<blockquote>
</blockquote>
<p>이미 정렬된 상태일 경우 삽입할 위치를 찾는 시간 복잡도 O(1)</p>
<h3 id="퀵-정렬-on2">퀵 정렬 O(n^2)</h3>
<blockquote>
</blockquote>
<p>정렬된 상태에서 단계별 pivot 이 항상 최솟(최댓)값이므로 발생 <code>선택 정렬과 동일</code>
<code>일반적으로 단계별로 가장 앞(뒤) 요소를 pivot 으로 사용하기 때문</code></p>
<h3 id="기수-정렬">기수 정렬</h3>
<blockquote>
</blockquote>
<p>주어진 숫자 형식의 데이터에 대해 보조 배열을 사용하여 각 자리수마다 
데이터 보관·인출 과정을 통해 정렬</p>
<ul>
<li>유용한 경우<ul>
<li>데이터가 정수형</li>
<li>여분의 충분한 메모리를 활용 가능</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Unreal]]></title>
            <link>https://velog.io/@clear_0324/Unreal</link>
            <guid>https://velog.io/@clear_0324/Unreal</guid>
            <pubDate>Sun, 19 Nov 2023 05:02:00 GMT</pubDate>
            <description><![CDATA[<h3 id="ubt--unreal-build-tool-">UBT ( Unreal Build Tool )</h3>
<blockquote>
</blockquote>
<p>멀티 플랫폼 빌드를 목표로 하는 게임엔진으로 빌드과정을 유연하게 하도록 하는 툴.</p>
<ul>
<li>Unreal Proejct C++ 소스 빌드과정 총괄</li>
<li>다양한 빌드구성</li>
<li>빌드 프로세스 자동화 커스텀 툴</li>
<li>추장저 소스코드 구조</li>
<li>플랫폼 호환성에 맞게 프로젝트 재생성</li>
<li>독립적인 빌드 및 스크립트 환경 제공 <code>C# 사용</code></li>
</ul>
<h3 id="bulidcs">bulid.cs</h3>
<blockquote>
</blockquote>
<ul>
<li>빌드 옵션 관리</li>
<li>PCH 사용</li>
<li>외부 모듈 사용</li>
</ul>
<h3 id="targectcs">targect.cs</h3>
<blockquote>
</blockquote>
<ul>
<li>빌드 타입 정의</li>
<li>특정 모듈을 빌드에 포함</li>
<li>특정 타입의 빌드 결과물 생성 <code>dll, exe</code></li>
</ul>
<h3 id="uht--unreal-header-tool-">UHT ( Unreal Header Tool )</h3>
<blockquote>
</blockquote>
<p>컴파일 전 모든 헤더 파일을 순회하며 리플렉션 시스템에 필요한 정보를 읽어  C++ 컴파일러가 읽기 가능한 코드를 재생성함.</p>
<blockquote>
</blockquote>
<ul>
<li>FileName.generated.h Pasring</li>
<li>매크로 정보 저장 <code>generated.h, gen.cpp</code></li>
<li>실행 순서<ul>
<li>빌드 명령</li>
<li>UBT 실행</li>
<li>bulid.cs , target.cs 컴파일</li>
<li>UHT 실행</li>
<li>C++ 컴파일러 실행</li>
</ul>
</li>
</ul>
<h3 id="모듈--moudule-">모듈 ( Moudule )</h3>
<blockquote>
<p>관련된 데이터와 함수를 하나로 묶은 단위.</p>
</blockquote>
<ul>
<li>독립적 컴파일이 가능 <code>분할 컴파일</code></li>
<li>재사용성↑</li>
<li>유지보수↑</li>
</ul>
<h3 id="언리얼-모듈">언리얼 모듈</h3>
<blockquote>
</blockquote>
<p>특정 기능들을 독립된 코드 단위로 캡슐화 한 것 <code>모듈</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[C++]]></title>
            <link>https://velog.io/@clear_0324/C</link>
            <guid>https://velog.io/@clear_0324/C</guid>
            <pubDate>Wed, 15 Nov 2023 14:26:55 GMT</pubDate>
            <description><![CDATA[<h3 id="부동-소수점">부동 소수점</h3>
<blockquote>
</blockquote>
<p> 실수 표현시 소수점 위치를 고정하지 않는 것 <code>범위가 한정적인 고정 소수점에 비해 범위가 넓음.</code>
 </br> </p>
<ul>
<li>Bit State 표현<blockquote>
</blockquote>
2 진법<blockquote>
<blockquote>
</blockquote>
<p>부호부 / 정수부 / 소수부 </p>
</blockquote>
정규화<blockquote>
<blockquote>
</blockquote>
<p>부호부 <code>음수 1 , 양수 0</code>
지수부 <code>바이어스 표현법 사용</code>
가수부 <code>왼쪽부터 채운 옮긴 뒤 0으로  채움</code></p>
</blockquote>
</li>
</ul>
<h3 id="바이어스-표현법">바이어스 표현법</h3>
<blockquote>
</blockquote>
<p>지수의 음양 표현이 정수의 음양표현 의미와 다르기 때문에 사용
<code>지수가 0 이라면 2^0 = 1 로 1이 기본값이 되는 현상을 피하기 위하여 사용한다.</code>
</br></p>
<blockquote>
</blockquote>
<p>지수부가 모두 0 인 경우 </p>
<blockquote>
<blockquote>
</blockquote>
<p>정수부를 0 으로 지수를 -126 으로 표현 <code>모든 비트가 0 이라면 0</code> </p>
</blockquote>
<p>지수부가 모두 1인 경우</p>
<blockquote>
<blockquote>
</blockquote>
<p>가수부가 모두 0 인경우 INF
가수부가 하나라도 1인 경우 NaN</p>
</blockquote>
<p><code>실제 지수 범위 -126 ~ 127</code></p>
<h3 id="부동-소수점-오차">부동 소수점 오차</h3>
<blockquote>
</blockquote>
<p>구조상 가수부 크기가 일정하기 때문에 지수가 가수부의 크기보다 커진다면 오차가 발생한다.</p>
<h3 id="문자열">문자열</h3>
<blockquote>
</blockquote>
<p> 문자들이 모여져 있는 집합</p>
<ul>
<li>C++ 표준 라이브러이에서 string 클래스 자료구조 제공.</li>
<li>NULL 종료 문자열로 문자열 끝을 판별 할 수 있음.</li>
</ul>
<h3 id="참조자">참조자</h3>
<blockquote>
</blockquote>
<p>Copy Pointer 를 의미한다.</p>
<ul>
<li>참조 연산자로 초기화시 주소 연산자 생략</li>
<li>직접 접근시 간접 연산자 생략</li>
<li>포인터 영역 마련후 초기화 되는 변수 주소가 포인터 영역에 써지게 되는 방식
<code>참조 객체의 메모리 공간 확부 및 주소 복사 포인터</code></li>
</ul>
<h3 id="타입-추론형">타입 추론형</h3>
<blockquote>
</blockquote>
<p>컴파일 타임에 초기화 된 값을 토대로 타입을 추론하여 적절한 타입으로 변경하는 자료형</p>
<ul>
<li>선언 즉시 초기화</li>
<li>참조 타입 사용시 키워드 앞 참조 연산자 작성</li>
</ul>
<h3 id="전처리-지시문">전처리 지시문</h3>
<blockquote>
</blockquote>
<ul>
<li>#define</li>
<li>#include</li>
<li>#pragma once</li>
<li>#if , #ifdef, #ifndef</li>
</ul>
<h3 id="가상-메모리">가상 메모리</h3>
<blockquote>
</blockquote>
<ul>
<li>메모리 영역이 프로세스에게 독립적으로 부여</li>
<li>타 프로세스 해당 메모리 영역 침범 불가</li>
<li>메모리 부여시 운영체제, 프로세스가 절반씩 사용</li>
</ul>
<h3 id="malloc--free--new--delete">malloc &amp; free , new &amp; delete</h3>
<blockquote>
</blockquote>
<ul>
<li>malloc<ul>
<li>size 를 인자로 받음.</li>
<li>할당한 주소 void * 반환</li>
<li>stdlib.h 필요</li>
<li>할당 가능한 영역 없을시 nullptr 반환</li>
</ul>
</li>
<li>new<ul>
<li>요소 개수를 받음</li>
<li>생성자 호출 가능</li>
<li>인자로 받은 타입으로 할당한 주소 반환</li>
<li>할당 가능한 영역 없을시 std::bad_alloc 예외 발생</li>
</ul>
</li>
<li>free<ul>
<li>주소를 인자로 받음</li>
</ul>
</li>
<li>delete<ul>
<li>변수명을 인자로 받으며 배열 해제시 []  작성</li>
<li>인자로 받은 타입 확인 후 소멸자 호출</li>
</ul>
</li>
</ul>
<h3 id="동적할당-공간-메모리-해제">동적할당 공간 메모리 해제</h3>
<blockquote>
</blockquote>
<ul>
<li>malloc 과 new 요청
힙관리자가 할당받은 메모리 분배후 부여받은 주소 , size 를 할당 내역에  기록</br></li>
<li>free , delete 요청
할당 내역에 기록해 놓은 주소와 size 토대로 검사후 메모리 회수</li>
</ul>
<p><code>힙관리자 : 힙 영역 관리, 프로세스 시작시 OS 에서 가상 메모리를 할당 받음</code></p>
<h3 id="delete">delete[]</h3>
<blockquote>
</blockquote>
<ul>
<li>동적 배열 할당 요청
내부에서 malloc 호출 시 인덱스 요소 개수를 저장할 추가로 메모리를 할당 받음.
반환시 인덱스 0 번째 주소를 반환하기 위해 추가받은 메모리 크기를 더한 주소를 받음.</br></li>
<li>해제
힙 관리자의 할당 내역을 통하여 추가로 받은 메모리 크기를 뺀 후 인덱스 요소 개수 파악
요소 개수만큼 소멸자 호출</li>
</ul>
<h3 id="선언-·-정의">선언 · 정의</h3>
<blockquote>
</blockquote>
<ul>
<li>정의
메모리 공간 확보</li>
<li>선언
해당 메모리 공간이 있다는 것을 알림</li>
</ul>
<h3 id="암시적-생성자--소멸자">암시적 생성자 , 소멸자</h3>
<blockquote>
</blockquote>
<p>컴파일러가 필요할 시 생성자와 소멸자가 명시되지 않았을 때 제공하는 생성자 · 소멸자</p>
<ul>
<li>명시되지 않은 모든 생성자 · 소멸자에 대하여 제공시<ul>
<li>불필요한 Code 영역 차지</li>
<li>객체 생성 , 소멸시 생성자와 소멸자를 확인하는 오버헤드 발생</li>
</ul>
</li>
</ul>
<h3 id="포인터">포인터</h3>
<blockquote>
</blockquote>
<p>메모리의 주소를 가리키는 객체로 간접 접근을 통한
메모리 낭비와 지역성이 다른 메모리에 접근이 가능하다.</p>
<ul>
<li>주소와 타입 정보를 가짐.</li>
<li>메모리 주소에 타입 정보를 기반으로 접근.</li>
<li>원천 타입이 아닐 경우 혼란 발생</li>
</ul>
<h3 id="구조체-·-클래스">구조체 · 클래스</h3>
<blockquote>
</blockquote>
<p>구조체 <code>public</code> 와 클래스 <code>private</code> 는 객체 지향 프로그램의 도입과 기존 라이브러리의 호환성을 보존하기 위해 나누어져 있다.</p>
<h3 id="메모리-배치-규칙">메모리 배치 규칙</h3>
<blockquote>
</blockquote>
<p>맴버 변수는 변수 타입의 크기 배수 일 때 CPU 의 메모리 접근 횟수가 최소화됨.
배치시 /Zp8 기준 변수의 타입 크기와 8중 더 작은 쪽이 최소배수.</p>
<h3 id="클래스-암시적-정의-메소드">클래스 암시적 정의 메소드</h3>
<blockquote>
</blockquote>
<p>기본 생성자 , 기본 소멸자 , 복사생성자 , 복사 대입 연산자 , 이동생성자 , 이동 대입 연산자</p>
<h3 id="복사생성자">복사생성자</h3>
<blockquote>
</blockquote>
<p>멤버의 값을 복사하여 생성하는 생성자 <code>인자는 const Type &amp;</code>
</br>
실행순서</p>
<ul>
<li><p>명시적</p>
<ul>
<li>초기화 리스트</li>
<li>선처리 영역의 부모 , 클래스 타입의 맴버 기본 생성자 호출</li>
<li>코드블럭 실행</li>
</ul>
</li>
<li><p>암시적</p>
<ul>
<li>부모 , 클래스 타입 타입의 맴버 복사 생성자 호출</li>
<li>기본 맴버 타입일 경우 복사 실행</li>
</ul>
<h3 id="암시적-복사-대입-연산자">암시적 복사 대입 연산자</h3>
<blockquote>
</blockquote>
<p>대입 연산자의 오버로딩</p>
<ul>
<li>인자 <code>const Type</code> 반환형 <code>자기자신</code></li>
<li>실행 순서<ul>
<li>부모의 복사 대입 연산자 호출</li>
<li>맴버가 기본 타입일 경우 메모리 복사</li>
<li>맴버중 const 지정자나 참조 타입이 있을 시 에러 발생</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[CA & OS]]></title>
            <link>https://velog.io/@clear_0324/CAOS</link>
            <guid>https://velog.io/@clear_0324/CAOS</guid>
            <pubDate>Wed, 15 Nov 2023 13:24:54 GMT</pubDate>
            <description><![CDATA[<h3 id="메모리-영역">메모리 영역</h3>
<blockquote>
</blockquote>
<ul>
<li>Code Area 
읽기 영역 (Text Area) 제어문 , 함수 , 상수</br>  </li>
<li>Data Area 
전역 · 정적 변수 ,  BSS 는 초기화되지 않는 전역변수</br>  </li>
<li>Heap Area
사용자가 관리하는 동적할당 공간</br>  </li>
<li>Stack Area
지역변수 , 매개변수 
함수 종료시 쓰레드에 해당하는 변수 해제</li>
</ul>
<h3 id="컴파일-과정-순서">컴파일 과정 순서</h3>
<blockquote>
</blockquote>
<ul>
<li>전처리 <code>(.i)</code>
외부에 선언된 소스코드 , 라이브러리 포함
주석제거 
매크로 치환 적용</br>  </li>
<li>컴파일 <code>(.s)</code>
전처리된 소스코드파일 어셈블리어 변환
언어문법 검사 
정적영역 메모리 할당</br>  </li>
<li>어셈블리 <code>(.o)</code>
어셈블리어 파일 -&gt; 오브젝트 파일 변환</br>  </li>
<li>링킹 <code>(.exe)</code>
오브젝트 파일 · 프로그램에 사용되는 라이브러리 링크 =&gt; 하나의 실행파일 변환</li>
</ul>
<h3 id="인출-사이클-레지스터">인출 사이클 레지스터</h3>
<blockquote>
</blockquote>
<ul>
<li><p>PC
메모리에서 가져올 명령어 주소 저장
특별한 경우 제외 순차적 주소 값 증가</p>
</br>  </li>
<li><p>MAR
PC 에서 주소 값을 받아 메모리 접근
제어장치의 제어신호화 함께 메모리 접근</p>
</br>  
- MBR
MAR 에서 접근한 메모리 명령어 · 데이터 저장
</br>  
- IR
MBR 에서 저장된 명령어 · 데이터 해석

<h3 id="인터럽트">인터럽트</h3>
<blockquote>
</blockquote>
<p>CPU 가 진행하고 있던 작업을 중단시키는 상황</p>
<ul>
<li>동기 인터럽트
CPU 가 직접 작업 중단</br>  </li>
<li>비동기 인터럽트
입출력 장치에서 인터럽트 요청신호 호출 ↓
FLag Register 의 IF 활성화 여부에 따라 인터럽트 결정 ↓
현재 작업 스택에 백업후 인터럽트 백터 확인 ↓
해당 장치의 인터럽트 서비스 루틴 실행 ↓
백업한 작업 재개</li>
</ul>
<h3 id="명령어-파이프라이닝">명령어 파이프라이닝</h3>
<blockquote>
</blockquote>
<p>명령어가 처리되는 과정을 순차적으로 처리하는 기법</p>
<ul>
<li>데이터 헤저드
데이터가 의존적일 때 둘중 하나의 명령어가 처리되지 못하는 상황</li>
<li>컨트롤 헤저드
분기로 인한 PC 의 갑작스러운 변환 <code>쓸모 없는 명령어 발생</code></li>
<li>스트럭쳐 헤저드
서로 다른 명령어가 같은 자원 접근</li>
</ul>
<h3 id="비순차적-명령어">비순차적 명령어</h3>
<blockquote>
</blockquote>
<p>명렁어들이 순차적으로 실행되지 않는 기법</p>
<ul>
<li>순서가 바뀌어도 진행에 영향을 주지 않는 명령어 우선 처리
명령어 처리 딜레이 <code>로스가 발생하지 않도록 함</code></li>
</ul>
<h3 id="cisc-·-risc">CISC · RISC</h3>
<blockquote>
</blockquote>
<ul>
<li>CISC
가변길이 명령어
복잡하고 다양한 기능 제공 <code>메모리 관리 효율적</code>
명령어의 크기 · 실행 시간이 일정하지 않음.
<span style="color:rgb(255, 60 , 60)"> 파이프라이닝 불리 </span></br>  </li>
<li>RISC
명령어의 종류 축소 · 규격화된 명령어 제공
작성되는 명령어 증가
한 클럭 내외 실행
<span style="color:rgb(103, 100, 255)"> 파이프라이닝 유리 </span></li>
</ul>
<h3 id="ram-의-종류">RAM 의 종류</h3>
<blockquote>
</blockquote>
<ul>
<li>DRAM
일정시간 이후 데이터 소멸을 막기 위한 재활성화
<span style="color:rgb(103, 100, 255)"> 소비전력 · 비용 ↓  </span>
<span style="color:rgb(103, 100, 255)"> 집적도 ↑ </span>
대용량 설계 유리
주기억 장치 사용 </br>  </li>
<li>SRAM
데이터 유지
<span style="color:rgb(103, 100, 255)"> 속도 ↑ </span>
<span style="color:rgb(255, 60 , 60)"> 집적도 ↓ </span>
<span style="color:rgb(255, 60 , 60)"> 소비전력 · 비용 ↑ </span>
캐시메모리 사용</li>
</ul>
</li>
</ul>
<h3 id="캐시-메모리">캐시 메모리</h3>
<blockquote>
</blockquote>
<p>CPU 에서 사용될 것으로 예측되는 데이터 미리 확보후 CPU 에서 제공하는 메모리 공간</p>
<ul>
<li>코어 내에서 개별 메모리 할당 <code>L1 · L2 캐시</code></li>
<li>코어 외에서 각 코어 캐시 메모리 공유 <code>L3 캐시</code></li>
<li>한번 접근한 곳에 접근 할 가능성 <code>시간지역성</code></li>
<li>접근한 메모리와 인정한 공간에 접근할 가능성 <code>공간지역성</code></li>
</ul>
<h3 id="컴파일-언어-·-인터프리터-언어">컴파일 언어 · 인터프리터 언어</h3>
<blockquote>
</blockquote>
<ul>
<li>컴파일 언어
소스 코드 전체 검사 -&gt; 저급 언어 변환 -&gt; 실행 파일 생성</br></li>
<li>인터프리터 언어
코드를 한줄 씩 저급 언어 변환후 실행 <code>컴파일 시간 · 실행 파일 생성 x</code>
실행 때 마다 인터프리터 과정 반복 수행</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Const Keyword]]></title>
            <link>https://velog.io/@clear_0324/Const-Keyword</link>
            <guid>https://velog.io/@clear_0324/Const-Keyword</guid>
            <pubDate>Fri, 16 Jun 2023 16:48:26 GMT</pubDate>
            <description><![CDATA[<h3 id="✔--note--const_iterator">&lt; ✔ &gt; Note : const_iterator</h3>
<blockquote>
<blockquote>
</blockquote>
</blockquote>
<pre><code class="language-cpp">std::vector&lt;int&gt; vec;
const std::vector::iterator iter = vec.begin();
// iter 는 T * const 처럼 동작한다.
*iter = 10;
++iter; // Error
&gt;&gt;
std::vector::const_iterator cIter = vec.begin();
// cIter 는 const T * 처럼 동작한다.
*cIter = 10; // Error
++cIter;</code></pre>
<blockquote>
</blockquote>
<p>Iterator 는 Pointer 를 본 뜬 것이기 때문에 기본적인 동작 원리가 T* 와 흡사하여 
const 로 선안한다는 것은 Pointer 를 상수로 선언하는 것과 같다.
Iterator 가 자신이 카리키는 대상이 아닌 것을 가리키는 경우가 허용되지 않지만,
가리키는 대상 자체를 변경이 가능하다.
변경 불가능한 Object 를 가리키는 Iterator 가 필요하다면 const_iterator 를 사용하자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ Floating point]]></title>
            <link>https://velog.io/@clear_0324/Floating-point</link>
            <guid>https://velog.io/@clear_0324/Floating-point</guid>
            <pubDate>Wed, 14 Jun 2023 15:48:56 GMT</pubDate>
            <description><![CDATA[<h3 id="fixed-point--floating-point">Fixed Point &amp; Floating Point</h3>
<blockquote>
</blockquote>
<p>Floating Point 에 대해 알아보기전 이해를 돕기 위하여
Fixed Point 에 대해서 알아보도록 하자. </br>
Fixed Point 란 소수점의 위치가 고정인 것을 의미하는데
123.456 이라는 수를 표현할 경우 정수 부분과 소수부분을 나누어 표현한다.
이때 한정된 비트에 정수와 소수를 분할 배치할 경우 나타낼 수 있는 범위가 매우 한정적인데 소수점의 위치가 고정이 아니라면 어떻게 될까 ?
123456 이라는 유효숫자와 3이라는 소수점 위치를 통해서 훨씬 많은 범위의 수를 표현할 수 있게 된다.
이렇게 나온 방식이 바로 Floating Point 이다.</p>
<p><code>Fixed Point | 고정 소수점</code>
<code>Floating Point | 부동 소수점</code></p>
<h3 id="binary-system-of-real-numbers">Binary system of Real numbers</h3>
<blockquote>
</blockquote>
<p>정수와 같은 경우 2의 보수법을 통하여 2진법으로 BitState 가 될 수 있는데 소수는 어떻게 2진법으로 표현하는 걸까 ?
Floating Point 를 제대로 이해하기 위해서는 실수를 2진법으로 표현하는 방법을 알고 있어야 한다. </br>
예시를 들어 -9.6875 를 2진법으로 나타낸다 하였을 때
부호 , 정수 , 소수로 나누어 생각한다.</p>
<blockquote>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th align="left">부호</th>
<th>-</th>
<th align="left">정수</th>
<th>9 &lt; 1001(2) &gt;</th>
<th align="left">소수</th>
<th>6875</th>
</tr>
</thead>
</table>
</blockquote>
<h6 id="-100110112-의-구조">-1001.1011(2) 의 구조</h6>
<blockquote>
</blockquote>
<p>위와 같이 부호는 음수이며 정수 9를 2진수로 1001 로 쉽게 변화할 수 있는데 소수부분을 어떻게 해결할까 ? </br>
정수의 반대로 생각하여 구하면 쉬워진다.
정수와 같은 경우 다음과 같이 2진법을 사용할 수 있다.
9 / 2 = 4 ... 1
4 / 2 = 2 ... 0
2 / 2 = 1 ... 0
1 / 2 = 0 ... 1
이처럼 나머지를 구하여 1001 이라는 표현으로 2진수로 구하지 않았는가 ?</p>
<blockquote>
</blockquote>
<p>이와 같이 소수는 반대로 2를 곱하여 정수부분을 취한다.
0.6875 * 2 = 1.375
0.375 ... 1
0.375 * 2 = 0.75 ... 0
0.75 * 2 = 1.5
0.5 ... 1
0.5 * 2 = 1.0 ... 1
이 처럼 정수부분을 모두 취한 소수부분의 2진수는 1011 이 나오게 되며
-9.6875 의 2진수 표현은 -1001.1011(2) 로 나오게 된다.
</br>
위와 같은 경우에는 최종결과가 0.0이 나와 멈출 수 있지만
보통 대부분의 실수는 무한히 순환하면서 반복되어 적당한 개수의 유효숫자만을 취하게 된다.</p>
<p><code>Binary System | 2진법</code>
<code>Real Number | 실수</code></p>
<h3 id="floating-point-structure">Floating Point Structure</h3>
<blockquote>
</blockquote>
<p>이제 앞서 예를 들었던 -1001.1011(2) 을 이용하여 부동 소수점의 구조를
알아보도록 하자. </br>
부동소수점으로 저장하기 위해선 정규화 과정을 거쳐야 하는데
지수를 이용하여 실수를 표현한다.
-1001.1011 은 -1.0011011 * 2^3 이 되는데
여기에서 정규화란 정수부를 1로 맞추어 놓고 적절하게 소수점 위치를 조정하는 것이다.
이 때 정규화를 거친 소수부의 유효 숫자를 가수부 , 지수를 지수부로 나누어 부동 소수점을 표시한다.</p>
<blockquote>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th align="left">부호부</th>
<th>-</th>
<th align="left">지수부</th>
<th>3</th>
<th align="left">가수부</th>
<th>0011011</th>
</tr>
</thead>
</table>
</blockquote>
<h6 id="-10011011--23-의-구조">-1.0011011 * 2^3 의 구조</h6>
<p>위와 같이 보호부 지수부 가수부로 나누어 Bit 로 변환하게 되는데
이때 해당 부분들이 얼마 만큼의 Bit 가 사용하는 지 알아보자.</p>
<blockquote>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th>자료형</th>
<th>부호부</th>
<th>지수부</th>
<th>가수부</th>
<th>총 Bit</th>
</tr>
</thead>
<tbody><tr>
<td>float</td>
<td>1 Bit</td>
<td>8Bit</td>
<td>23Bit</td>
<td>32 Bit</td>
</tr>
<tr>
<td>double</td>
<td>1 Bit</td>
<td>11Bit</td>
<td>52Bit</td>
<td>64 Bit</td>
</tr>
</tbody></table>
</blockquote>
<p>이제 위의 표를 가지고 BitState 로 변환하여 보자
부호부는 간단한데 양수면 0 , 음수면 1이다.</p>
<blockquote>
</blockquote>
<p>가수부 같은 경우엔 변환된 가수부를 왼쪽 부터 그대로 채우게 된다.</p>
<blockquote>
</blockquote>
<p>지수부와 같은 경우 8 bit 로 -127 ~ 128 까지의 256 단계를 나타내는데
이때 오해할 수 있는 것이 2의 보수를 취하여 표현하여 저장한다라고 생각 할 수 있지만 그렇지 않다.
지수부 8 bit 가 모두 0 으로 채워진 [ 0000 , 0000 ] 은 -127 을 나타내고 1 증가한 [0000, 0001] 은 - 126 을 나타낸다.
이렇게 하여 모두 [ 1111 , 1111 ] 은 128 을 나타나게 된다.
이러한 방식을 바이어스 표현법이라 한다.</p>
<blockquote>
</blockquote>
<p>이렇게 하여 -9.6875 를 BitState 로 저장하게 된다면
부호부 : 1
지수부 : 1000,0010 ( 참고 : 1000,0000 부터가 1이다. )
가수부 : 0011011000...0
으로 표현하여 저장하게 된다.</p>
<h3 id="bias">Bias</h3>
<blockquote>
</blockquote>
<p>위에서 어째서 불필요한 바이어스 표현법을 사용할까 ? 
라는 의구심이 생길수가 있다.
Bias 와 같은 경우 순수한 0 과 INF 를 표현하기 위해 사용한다.</p>
<blockquote>
</blockquote>
<p>실상 우리가 아는 컴퓨터의 0 의 표현법은 모든 메모리의 bit 가 0 으로 채워져 있을 때를 0 이라 가정한다.
실수의 모든 bit 가 0이라 채워져 있을 때를 가정하여 2의 보수를 취해 계산을 하게 된다면 + 1.00000...0 * 2^0 = 1 이 되어버린다.
이처럼 모든 bit 를 0 으로 채워버리면 기본값이 1이 되어버리는 경우가 발생한다.</p>
<blockquote>
</blockquote>
<p>바이어스 표현법을 사용하여 표현하게 된다면
1.0000..0 2 ^ -127 이 되며 이것은
1 / 2^127 이라는 아주 작은 수를 표현하게 된다.
이 또한 0 이 아닌데 만일 이 값을 0으로 지정하게 된다하면 이보다 작은 양수를 표현할 수 없게 되어 버린다.
이때 특별한 규정을 두었는데 지수부가 모두 0으로 채워진 경우에 유효숫자의 정수부가 1 이 아닌 0이 되도록 하였으며 그에 맞추어 지수를 -127 이 아닌 -126 으로 고정하였다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Skeletal Mesh & Animation]]></title>
            <link>https://velog.io/@clear_0324/Skeletal-Mesh-Key-FrameAnimation</link>
            <guid>https://velog.io/@clear_0324/Skeletal-Mesh-Key-FrameAnimation</guid>
            <pubDate>Fri, 19 May 2023 15:54:47 GMT</pubDate>
            <description><![CDATA[<h3 id="skeleton-asset">Skeleton Asset</h3>
<blockquote>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/clear_0324/post/b3912bf2-953b-4cde-b246-44a26e8320e7/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/clear_0324/post/37d0b3ee-9d9c-410f-852b-fc78c4bb613b/image.png" alt=""></th>
</tr>
</thead>
</table>
</blockquote>
<p>게임 내 캐릭터 또는 개체의 골격을 계층 구조화 시킨 시스템이다.
특정 모델을 애니메이션 하는데 사용되는 뼈의 배치와 이동을 정의 하는 에셋이다.</p>
<h3 id="skeletal-mesh">Skeletal Mesh</h3>
<blockquote>
</blockquote>
<p>Skeleton Asset 을 메시에 바인딩한 Asset 으로
캐릭터나 오브젝트의 시각적 표현을 제공한다.</p>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/0e6b16b0-e1f5-48fe-a637-3027181f1d14/image.png" alt=""></p>
</blockquote>
<h3 id="keyframeanimation">KeyFrameAnimation</h3>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/2bf555dc-eabb-40b2-8f86-6e6e813da1c6/image.png" alt=""></p>
</blockquote>
<p>특정 프레임에서 간격마다 Key 를 잡아 각 사이의 키에 대한 이동 회전 배율을 저장하고 키 사이의 Frame 을 보간하여 부드러운 전환을 생성하여 Animation 을 재생하는 기법</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Vector]]></title>
            <link>https://velog.io/@clear_0324/Vector</link>
            <guid>https://velog.io/@clear_0324/Vector</guid>
            <pubDate>Thu, 18 May 2023 14:36:10 GMT</pubDate>
            <description><![CDATA[<blockquote>
<blockquote>
</blockquote>
<span style="color:rgb(183, 240, 177)">
초록색과 같은 색상의 Keyword 는 한번 쯤 읽어볼만한 소재입니다.
</span>

<blockquote>
</blockquote>
<span style="color:rgb(255, 255, 90)">
노란색과 같은 색상의 Keyword 는 꼭 알아두어야 할 소재입니다.
</span>

<blockquote>
</blockquote>
<span style="color:rgb(103, 153, 255)">
파란색과 같은 색상의 Keyword 는 부가설명입니다.
</span>

<blockquote>
</blockquote>
<p>마지막으로 Game Math 글의 모든 Image 출저는 &#39;이득우의 게임 수학&#39; 임을 밝힙니다.</p>
</blockquote>
<hr>
<h3 id="°-cartesian-coordinate-system">° Cartesian coordinate system</h3>
<blockquote>
</blockquote>
<p>직선의 Number Set 을 수직으로 배치해 평면을 표기하는 방식</p>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/5b560fa1-863f-4ccb-a51a-af236f2f46ad/image.png" alt=""></p>
</blockquote>
<h6 id="cartesian-coordinate-system">Cartesian coordinate system</h6>
<blockquote>
</blockquote>
<p>Cartesian coordinate system 의 한 Element 는 순서쌍으로 표현하며
Coordinate 라 하며 ( x , y ) 로 표기한다.</p>
<p><code>Cartesian coordinate system | 데카르트 좌표계</code>
<code>Coordinate | 좌표</code></p>
<h3 id="°-span-stylecolorrgb255-255-90-vector-span">° <span style="color:rgb(255, 255, 90)"> Vector </span></h3>
<blockquote>
</blockquote>
<p>두 개 이상의 실수를 Cartesian Product 로 묶어 형성된 Set 을
Axiom Set Theory 의 관점에서 규정한 것을 Vector Space 라 하며
이러한 Vector Space 의 Element 를 Vector 라 한다.
또한 Vector 의 Element 를 Scalar 라고 한다.
즉 x , y 가 Scalar 인 것 이다.</p>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/b5f3d5af-c986-4142-b95c-724153fdb172/image.png" alt=""></p>
</blockquote>
<h6 id="vector-표기법">vector 표기법</h6>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/3e6e6e31-8830-4911-84c0-67574b14707e/image.png" alt=""></p>
</blockquote>
<h6 id="vector-space-의-8-가지-axiom">vector space 의 8 가지 Axiom</h6>
<h3 id="°-span-stylecolorrgb183-240-177-norm-span">° <span style="color:rgb(183, 240, 177)"> Norm </span></h3>
<blockquote>
</blockquote>
<p>Vector 의 크기를 말한다.
Norm 은 원점으로 부터의 최단 거리를 의미하는데
피타고라스 정리를 사용하여 거리를 측정한다.</p>
<blockquote>
<blockquote>
</blockquote>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/clear_0324/post/b41711d6-03df-4f6b-9fff-42dec19e4566/image.png" alt=""></th>
<th><img src="https://velog.velcdn.com/images/clear_0324/post/528141ab-6542-4875-8be3-d7786f712181/image.png" alt=""></th>
</tr>
</thead>
</table>
</blockquote>
<h6 id="피타고라스-정리와-이를-이용한-norm-의-크기-측정-방법">피타고라스 정리와 이를 이용한 Norm 의 크기 측정 방법</h6>
<h3 id="°-unit-vector">° Unit Vector</h3>
<blockquote>
</blockquote>
<p>크기가 1인 Vector 를 의미한다.
벡터의 크기를 측정하는 기준이 되며 Hat을 씌워 표시한다.</p>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/605ac296-4452-42f0-96be-73157df61318/image.png" alt=""></p>
</blockquote>
<h6 id="normalize">Normalize</h6>
<blockquote>
</blockquote>
<p>특정 vector 를 Norm 으로 나눈다면 Unit Vector 를 얻을 수 있는데
이렇게 크기를 1인 Vector 를 만드는 연산을 <span style="color:rgb(183, 240, 177)"> Normalize </span>라 한다.</p>
<p><code>Unit Vector | 단위 벡터</code>
<code>Hat | (^) 모자 기호</code>
<code>Normalize | 정규화</code></p>
<h3 id=""></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[Blend Space]]></title>
            <link>https://velog.io/@clear_0324/Blend-Space</link>
            <guid>https://velog.io/@clear_0324/Blend-Space</guid>
            <pubDate>Tue, 16 May 2023 22:47:08 GMT</pubDate>
            <description><![CDATA[<h3 id="blendspace">BlendSpace</h3>
<blockquote>
</blockquote>
<p>특정 값에 따라 Animation 을 블렌딩시켜주는 기능이다.</p>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/6d94adf1-4612-4625-9457-a51511eeb01d/image.png" alt=""></p>
</blockquote>
<p>그림과 같이 특정 축에 따라 애니메이션을 설정하고
Skeletal Mesh 의 Key Frame  Animation 이 특정 키 사이의
보간을 이용하는 것이기 때문에 값의 위치에 따라 보간 비율이 달라지며
각축 애니메이션들이 서로 블렌딩되어 Animation 이 출력된다. </br></p>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/e840c1c5-c68a-4f3d-a206-00746c110de8/image.png" alt=""></p>
</blockquote>
<h6 id="unreal-documentation">Unreal Documentation</h6>
<blockquote>
</blockquote>
<p>Blend Space 에서 사용할 기준 값 같은 경우 위의 그림과 같이 
게임 플레이의 코드 상등에서 값을 받아 가져온다.</p>
<blockquote>
</blockquote>
<p>1차원을 사용하였을 때 Blend Space 1D 를 사용할 수 있다. </p>
<h3 id="detail">Detail</h3>
<blockquote>
</blockquote>
<p>Input Interpolation</p>
<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/13f1c55f-3af6-4fd7-9158-26c54b93486e/image.png" alt=""></p>
</blockquote>
<p>애니메이션 속도 구동을 위한 축을 지정할 수 있는 기능이라고 하는데
정확히 어떠한 기능을 하고 있는 지는 모르겠으므로
추후 업데이트할 예정이다.</p>
</blockquote>
<p>Axis Settings</p>
<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/e456a3ed-5afd-4031-8277-c7ea924adc14/image.png" alt=""></p>
</blockquote>
</blockquote>
<ul>
<li>Name
에디터 그리드에 사용할 축 이름</li>
<li>Minimun &amp; Maximum Value
최소 최대 축값</li>
<li>Number of Grid Divisions
그리드 분할 수로 Aninmation Data 에서 보간에 사용할 지점수</li>
<li>Interpolation Time
보간 시간으로 지정한다면 해당 시간동안 보간을 유지하여 더 부드럽게 움직이는 효과를 줄 수 있음.</li>
<li>Interfolation Type
보간에 대한 유형 지정.<blockquote>
</blockquote>
Sample Interpolation<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/59683347-4fba-4b97-8304-8a7adb83214a/image.png" alt=""></p>
</blockquote>
</blockquote>
</li>
<li>Target Weight Interpolation
초당 타깃 웨이트 보간 속도로 해당 보간 속도를 
더 빨리 줄 수 있는 기능.</li>
<li>Per Bone Blend
특정 본에 타깃 웨이트 보간을 설정하여 설정된 본마다
다른 속도로 블렌드 인 될 수 있는 기능.<blockquote>
</blockquote>
Animation Notifies<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/2ca62c28-62f9-4b32-8e3a-cf1fec7a5fa4/image.png" alt=""></p>
</blockquote>
<p>Blend Space 에서 Notifie 의 실행 여부를 결정하는 기능
All Animations | 모든 노티파이 실행
Heigest Weighted Animation | 특정 가중치가 가장 높은
Notifie 만을 실행
None | 실행 여부 없음</p>
</blockquote>
<code>Notifies | 특정 이벤트를 알리는 것인데 추후에 알아볼 예정</code><blockquote>
</blockquote>
Meta Data<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/defdc931-33fc-4484-bdca-987c162d65e4/image.png" alt=""></p>
</blockquote>
<p>Metadata Animation Asset 할당 기능이다.
Metadata 는 추후 자세히 정리할 예정이다.</p>
</blockquote>
Thumbnail<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/3e440835-b9f0-4990-8b35-b752b436b26e/image.png" alt=""></p>
</blockquote>
<p>Content Browser 에서 미리 나오는 에셋의 미리보기 형식 ( ? )
을 비춰주는 카메라의 각도를 변화할 수 있는 옵션 같다.</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Character]]></title>
            <link>https://velog.io/@clear_0324/Character</link>
            <guid>https://velog.io/@clear_0324/Character</guid>
            <pubDate>Sat, 13 May 2023 15:03:45 GMT</pubDate>
            <description><![CDATA[<h3 id="character">Character</h3>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/66e754e5-3a50-47b2-b713-0d1efb9eb786/image.png" alt=""></p>
</blockquote>
<p>ACharacter Class 로 Blueprint 를 만들게 되며 해당과 같이
Component 들이 추가되어 있다.
이 장에서는 ACharacter 를 구성하는 Component 를 알아보도록 하자.</p>
<h3 id="capsulecomponent">CapsuleComponent</h3>
<blockquote>
<p>Character 충돌체 영역을 담당하며
RootComponent 로 설정이 되어 있어 모든 USceneComponet 의
기준이 되는 Component 입니다. </br>
CapsuleComponent 의 Detail Panel 살펴보도록 하자.</p>
</blockquote>
<p>Shape</p>
<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/b20e8edc-2521-4bf3-8525-330649a6255a/image.png" alt=""></p>
</blockquote>
</blockquote>
<ul>
<li>Capsule Half Halt Height
캡슐의 절반 높이를 설정하며 높이는 Radius 보다 작을 수 없다.</li>
<li>Capsule Radius
캡슐의 반지름을 설정한다.</li>
<li>Shape Color
캡슐이 그려지는 색상을 설정한다.<blockquote>
</blockquote>
</li>
</ul>
<h3 id="arrow-component">Arrow Component</h3>
<blockquote>
</blockquote>
<p>단순한 화살표가 Rendering 되는 Component 로
Character 가 바라보는 방향을 표시하는 Component 이다.</p>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/21778e05-2dd0-4ac9-89d5-aa91c02b1d91/image.png" alt=""></p>
</blockquote>
<h3 id="skeletal-mesh-component">Skeletal Mesh Component</h3>
<blockquote>
<p>Character 의 Mesh 를 결정하는 Component 로
StaticMesh 가 아닌 Skeletal Mesh 를 설정한다.
Skeletal Mesh 가 무엇인지에 대해서는 나중에 자세하게 다룰 예정이다.</p>
</blockquote>
<h3 id="character-movement-component">Character Movement Component</h3>
<blockquote>
</blockquote>
<p>Character 의 물리적인 움직임을 담당하는 Component 로
ACharacter 의 핵심 구성 요소이며  AActorComponent 의 파생클래스이다. </br>
General Settings</p>
<blockquote>
<blockquote>
<p>일반 적인 설정 기능을 담당한다.</p>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/970e7c32-8a5e-4acd-a5e4-5b961d22595d/image.png" alt=""></p>
</blockquote>
</blockquote>
<ul>
<li>Gravity Scale
중력이 곱해지는 정도를 설정한다.</li>
<li>Max Acceleration
최대 가속도를 설정하며 속도의 변화율을 결정한다.<blockquote>
<blockquote>
</br></blockquote>
</blockquote>
</li>
<li>Breaking Friction Factor</li>
<li>Breaking Friction</li>
<li>Use Separate Beraing Fiction
이 세가지는 제동 거리를 만들기 위한 마찰력과 관련된
기능같다.
나중에 추후에 업데이트 할 예정이다.<blockquote>
<blockquote>
</br></blockquote>
</blockquote>
</li>
<li>Crouched Half Height
앉거나 웅크릴 시의 Capusle 의 절반 높이를 설정한다.</li>
<li>Default Land Movement Mode
땅에 있을 시 기본 모드를 설정한다.</li>
<li>Default Land Movement Mode
물에 있을 시 기본 모드를 설정한다.<blockquote>
</blockquote>
Walking<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/de998f2a-868c-42cc-9082-e13ccc87b5bc/image.png" alt=""></p>
</blockquote>
</blockquote>
</li>
<li>Max Step Height
Pawn 이 계단을 올라 갈 수 있는 높이를 설정합니다.</li>
<li>Walkable Floor Angle
경사진 곳을 걸을 때 Pawn 이 최대로 걸을 수 있는
각도를 설정합니다.</li>
<li>Walkable Floor Z
업데이트 예정</li>
<li>Ground Friction
업데이트 예정</li>
<li>Max Walk Speed
걸을 때 최대 속력입니다.</li>
<li>Max Walk Speed Crouched
앉거나 웅크릴 시의 최대 속력입니다.</li>
<li>Min Analog Walk Speed
아날로그 스틱을 최소로 기울일 때 붙을 가속도에 관하여 
설정하는 기능</li>
<li>Breaking Deceleration Walking
걷기 상태에서 가속을 적용하지 않을 시 일어나는 감속을
설정하는 기능</li>
<li>Sweep While Nav Walking
보행 도중 Sweep Test 여부</li>
<li>Can Walk Off Ledges
절벽을 넘어 설 수 있는지에 대한 여부
True 시 절벽을 걸어다니며 False 시 절벽이라면 밖으로 걸아나가지
못하도록 설정하는 기능</li>
<li>Can Walk Off Ledges when Crouching
크런치 상태에서 절벽을 넘어 설 수 있는지에 대한 여부</li>
<li>Maintain Horizontal Ground Velocity
경사로 지면에서 Movement 의 속력이 가로 지면을 기준으로
이동하므로 경사로가 높을 수록 그만큼 보정되어 빠르게 이동하게
만들어주는 기능</li>
<li>Ignore Base Rotation
True 라면 현재 캐릭터의 월드 회전을 계속 유지하고
False 라면 움직이는 Base 와 더불어 같이 회전한다.<blockquote>
</blockquote>
Jumping / Falling<blockquote>
<blockquote>
<blockquote>
</blockquote>
<p><img src="https://velog.velcdn.com/images/clear_0324/post/2a522c18-f8eb-4dcd-b280-bbc0b430353b/image.png" alt=""></p>
</blockquote>
</blockquote>
</li>
<li>Jump Z Velocity
점프의 초기 속도로 점프할 때의 속력이다.
높으면 높을 수록 더 높이 점프한다.</li>
<li>Air Control
공중에서 캐릭터의 움직임을 얼마나 제어 가능한지에 대해서
조절하는 기능이다.</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>