<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>main_door</title>
        <link>https://velog.io/</link>
        <description>뉴트리아는 가시쥐과에 속하는 설치류의 일종이다. 오랫동안 뉴트리아과의 유일종으로 분류했지만, 현재는 가시쥐과에 포함시킨다. 늪너구리, 해리서 또는 코이푸라고도 한다. 뉴트리아는 스페인어로 수달을 의미하고, 출생지 남미에서는 이 종류를 코이푸라고 부른다.</description>
        <lastBuildDate>Wed, 22 Feb 2023 21:29:44 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>main_door</title>
            <url>https://images.velog.io/images/main_door/profile/e5043c31-ad84-4d3d-b8f5-6171ed476a5b/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. main_door. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/main_door" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[C++ 생성자 멤버 이니셜라이저와 대입 초기화 간단 성능비교.]]></title>
            <link>https://velog.io/@main_door/C-%EB%A9%A4%EB%B2%84-%EC%9D%B4%EB%8B%88%EC%85%9C%EB%9D%BC%EC%9D%B4%EC%A0%80%EC%99%80-%EB%8B%A8%EC%88%9C-%EB%8C%80%EC%9E%85-%EC%B4%88%EA%B8%B0%ED%99%94-%EA%B0%84%EB%8B%A8-%EC%84%B1%EB%8A%A5%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@main_door/C-%EB%A9%A4%EB%B2%84-%EC%9D%B4%EB%8B%88%EC%85%9C%EB%9D%BC%EC%9D%B4%EC%A0%80%EC%99%80-%EB%8B%A8%EC%88%9C-%EB%8C%80%EC%9E%85-%EC%B4%88%EA%B8%B0%ED%99%94-%EA%B0%84%EB%8B%A8-%EC%84%B1%EB%8A%A5%EB%B9%84%EA%B5%90</guid>
            <pubDate>Wed, 22 Feb 2023 21:29:44 GMT</pubDate>
            <description><![CDATA[<h1 id="개요">개요</h1>
<p>C++에선 생성자 내부에서 대입을 통해 멤버를 정의하는 방법보단 멤버 이니셜라이저라는 특수한 문법으로 정의를 해주는 것을 권장한다. 성능면에서 전자보단 후자가 상대적인 이득을 본다는 것인데, 다른 블로그를 찾아봐도 &quot;<strong>어느정도</strong> &quot; 차이가 나는지는 없어 짤막하게 테스트 해보려고 한다.</p>
<h1 id="코드">코드</h1>
<pre><code>#include &lt;iostream&gt;
#include &lt;thread&gt;
#include &lt;time.h&gt;

using namespace std;

class MyClass
{
public:
    MyClass() = delete;
    MyClass(int number)//이니셜라이저를 사용하지 않고, 대입을 통해 초기화
    {
        m_number1 = number;
        m_number2 = number;
        m_number3 = number;
        m_number4 = number;
    }
private:
    int m_number1;
    int m_number2;
    int m_number3;
    int m_number4;
};


class MyClass2
{
public:
    MyClass2() = delete;
    MyClass2(int number) ://이니셜라이저를 통해 초기화
        m_number1(number),
        m_number2(number),
        m_number3(number),
        m_number4(number)

    {

    }
private:
    int m_number1;
    int m_number2;
    int m_number3;
    int m_number4;

};


int main()
{
    bool ThreadDone1 = false;
    bool ThreadDone2 = false;

    thread Thread1([&amp;ThreadDone1]()
    {
        clock_t start = clock();

        for (int i = 0; i &lt; INT_MAX; i++)
        {
            MyClass a(5);
        }

        clock_t end = clock();

    std::cout &lt;&lt; &quot;Thread1 done Time : &quot; &lt;&lt; double(end - start) / CLOCKS_PER_SEC &lt;&lt; &quot;\n&quot;;
    ThreadDone1 = true;
    });
    Thread1.detach();


    thread Thread2([&amp;ThreadDone2]()
    {
        clock_t start = clock();

        for (int i = 0; i &lt; INT_MAX; i++)
        {
            MyClass2 a(5);
        }
        clock_t end = clock();
    std::cout &lt;&lt; &quot;Thread2 done Time : &quot; &lt;&lt; double(end - start) / CLOCKS_PER_SEC &lt;&lt; &quot;\n&quot;;

    ThreadDone2 = true;
    });
    Thread2.detach();

    while (ThreadDone1 != true || ThreadDone2 != true)
    {

    }

}</code></pre><p>스레드 1번은 단순 대입 초기화, 스레드2번은 멤버 이니셜라이저를 이용한 초기화를 해주는 클래스를 반복 생성한다.</p>
<h1 id="테스트-결과">테스트 결과</h1>
<p>테스트 1번
<img src="https://velog.velcdn.com/images/main_door/post/a10f0aac-783c-49b5-b3eb-e9d932737316/image.png" alt=""></p>
<p>테스트 2번
<img src="https://velog.velcdn.com/images/main_door/post/171da1e1-011a-4440-b7f8-d5f0ea3aac2a/image.png" alt=""></p>
<p>테스트 3번
<img src="https://velog.velcdn.com/images/main_door/post/267701d6-23da-4224-a02a-fdcfc2750c3a/image.png" alt=""></p>
<p>대략 6~9%정도의 성능 차이가 발생한다.</p>
<h1 id="결론">결론</h1>
<p>C++의 말대로, 정의해주는 위치만 변경되었을 뿐인데 명확한 성능 차이를 보인다. 습관을 들여서라도 멤버 이니셜라이저를 자주 사용해야겠다는 생각이 들었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Day3 - 보물, 기타줄]]></title>
            <link>https://velog.io/@main_door/Day3-%EB%B3%B4%EB%AC%BC-%EA%B8%B0%ED%83%80%EC%A4%84</link>
            <guid>https://velog.io/@main_door/Day3-%EB%B3%B4%EB%AC%BC-%EA%B8%B0%ED%83%80%EC%A4%84</guid>
            <pubDate>Fri, 10 Feb 2023 06:30:57 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>백준 온라인 저지에서 나온 문제입니다.</p>
</blockquote>
<h1 id="보물">보물</h1>
<p><img src="https://velog.velcdn.com/images/main_door/post/e5a857cc-6e76-42a4-8efe-f087701a9132/image.png" alt=""></p>
<p><a href="https://www.acmicpc.net/problem/1026">문제 바로가기</a></p>
<h2 id="구현-방식">구현 방식</h2>
<p>stl sort를 사용하여 입력받은 수를 정렬하는 방식으로 구현했습니다.</p>
<h2 id="코드">코드</h2>
<pre><code>

/*

https://www.acmicpc.net/problem/1026

*/

#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;

using namespace std;


int main()
{
    int    vecSize;
    int inputNumber;
    int total = 0;

    vector&lt;int&gt;    vecNumberA;
    vector&lt;int&gt;    vecNumberB;

    cin &gt;&gt; vecSize;

    vecNumberA.reserve(vecSize);
    vecNumberB.reserve(vecSize);

    for (int i = 0; i &lt; vecSize; i++)
    {
        cin &gt;&gt; inputNumber;
        vecNumberA.push_back(inputNumber);
    }
    for (int i = 0; i &lt; vecSize; i++)
    {
        cin &gt;&gt; inputNumber;
        vecNumberB.push_back(inputNumber);
    }

    sort(vecNumberA.begin(), vecNumberA.end(),greater&lt;int&gt;());
    sort(vecNumberB.begin(), vecNumberB.end(), less&lt;int&gt;());

    for (int i = 0; i &lt; vecSize; i++)
    {
        total += vecNumberA[i] * vecNumberB[i];
    }

    cout &lt;&lt; total &lt;&lt; endl;

    return 0;
}</code></pre><h2 id="코드-해설">코드 해설</h2>
<p>들어온 값들을 B는 내림차순으로, A는 오름차순으로 정렬해야 가장 적은 값이 나오는 문제입니다. 정렬을 간편하게 하기 위해서 sort함수를 사용하여 문제를 해결했습니다.</p>
<h1 id="기타줄">기타줄</h1>
<p><img src="https://velog.velcdn.com/images/main_door/post/bca57b54-22b7-4361-b1e0-06bec7eb7811/image.png" alt=""></p>
<p><a href="https://www.acmicpc.net/problem/1049">문제 바로가기</a></p>
<h2 id="해결-방식">해결 방식</h2>
<p>그때그때 최적의 값을 고르는 그리디 알고리즘이라, 별다른 방법 없이 구현했습니다.</p>
<h2 id="구현-코드">구현 코드</h2>
<pre><code>

/*
https://www.acmicpc.net/problem/1049
*/


#include &lt;algorithm&gt;
#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;algorithm&gt;

using namespace std;



int main()
{
    int guitarString = 0;
    int brandCount = 0;
    int result = 0;


    int cheapestPackage = 99999;
    int cheapestSingle = 99999;

    int inputPackageCost;
    int inputSingleCost;


    cin &gt;&gt; guitarString &gt;&gt; brandCount;

    for (int i = 0; i &lt; brandCount; i++)
    {
        cin &gt;&gt; inputPackageCost &gt;&gt; inputSingleCost;

        cheapestPackage = min(inputPackageCost, cheapestPackage);
        cheapestSingle = min(inputSingleCost, cheapestSingle);
    }

    if (cheapestPackage &gt; cheapestSingle * 6)//단품가가 세트가보다 쌀 경우 바로 구매
    {
        result = cheapestSingle * guitarString;
        cout &lt;&lt; result;
        return 0;
    }
    /*
    여기까지 왔으면 패키지가 단품보다 싸나,
    추가적으로 낱개로 구매할 상황이 나온 경우.
    */
    while (guitarString &gt; 0)
    {
        if (guitarString &gt;= 6)
        {
            result += cheapestPackage;
            guitarString -= 6;
        }
        else if (cheapestPackage &lt; cheapestSingle * guitarString)//줄의 개수가 6개 이하인데
        {
            result += cheapestPackage;
            guitarString = 0;
        }
        else
        {
            result += cheapestSingle;
            guitarString--;
        }
    }
    cout &lt;&lt; result;

    return 0;
}</code></pre><h1 id="결과">결과</h1>
<p><img src="https://velog.velcdn.com/images/main_door/post/2d1ee92e-974a-443c-8ec0-878ea5682350/image.png" alt="">
랭크업 굿</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Day2 - 피보나치 함수]]></title>
            <link>https://velog.io/@main_door/Day2-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@main_door/Day2-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%ED%95%A8%EC%88%98</guid>
            <pubDate>Thu, 09 Feb 2023 08:57:04 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>해당 문제는 백준 온라인 저지에서 나온 문제입니다</p>
</blockquote>
<h1 id="피보나치-함수">피보나치 함수</h1>
<p><img src="https://velog.velcdn.com/images/main_door/post/ab7c18df-8ad1-4d6a-86f0-fae53025c232/image.png" alt=""></p>
<p><a href="https://www.acmicpc.net/problem/1003">문제 바로가기</a></p>
<h2 id="해결방식">해결방식</h2>
<p>제한시간 0.25초 내에 입력된 값을 처리해야하는 문제입니다. 다이나믹 프로그래밍 알고리즘을 활용하고, 값을 배열에 등록하여 재귀를 타고 수열을 쪼개는 횟수를 줄여야 하는 것이 중요한 문제였습니다.</p>
<h2 id="코드">코드</h2>
<pre><code>


/*
https://www.acmicpc.net/problem/1003
*/

/*

기존 피보나치는 Top-Down 방식으로 작업해도 괜찮았지만,
여기 피보나치에서 요구하는 것은 짧은(중요) 시간 내에 정해진 값에 도달하는 것입니다.
그러므로 천천히 값을 쌓아서 올라가는 방식인 Bottom-UP 방식으로 진행됩니다.
오히려 코드의 구현은 사람이 피보나치 수열을 만들때의 그것과 유사합니다.

배열에 값을 저장하고, 다음 값이 올때 이를 출력하는 것입니다.
*/


#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;

using namespace std;

pair&lt;int, int&gt;    CalledFibonacci[40];

pair&lt;int, int&gt; fibonacci(int n, int goal)[0]
{
    pair&lt;int, int&gt;    currentPair;

    if (n == 0)
        currentPair = { 1,0 };

    if (n == 1)
        currentPair = { 0,1 };

    if (n &gt; 1)
    {    
        currentPair.first = CalledFibonacci[n - 1].first + CalledFibonacci[n - 2].first;
        currentPair.second = CalledFibonacci[n - 1].second + CalledFibonacci[n - 2].second;
    }
    CalledFibonacci[n] = currentPair;
    if (n == goal)
    {
        return currentPair;
    }
    return fibonacci(++n, goal);
}

int main()
{
    int        inputCount = 0;
    int        inputNumber = 0;
    vector&lt;int&gt; vecTestNumber;

    cin &gt;&gt; inputCount;

    for (int i = 0; i &lt; inputCount; i++)
    {
        cin &gt;&gt; inputNumber;
        vecTestNumber.push_back(inputNumber);
    }

    for (int i = 0; i &lt; inputCount; i++)
    {
        pair&lt;int, int&gt; result;

        if (vecTestNumber[i] == 1)
            result = fibonacci(1, vecTestNumber[i]);
        else
            result = fibonacci(0, vecTestNumber[i]);

        cout &lt;&lt; result.first &lt;&lt; &quot; &quot; &lt;&lt; result.second &lt;&lt; endl;

    }
    return 0;
}</code></pre><h2 id="코드-해설">코드 해설</h2>
<p>pair 구조체를 활용하여 기존 피보나치 수열의 방식과 유사하게 작업했습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Day2 - 단어 정렬, 영화감독 숌]]></title>
            <link>https://velog.io/@main_door/Day2-%EB%8B%A8%EC%96%B4-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@main_door/Day2-%EB%8B%A8%EC%96%B4-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Thu, 09 Feb 2023 02:33:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>해당 문제는 백준 온라인 저지에서 나온 문제입니다</p>
</blockquote>
<h1 id="단어-정렬">단어 정렬</h1>
<p><img src="https://velog.velcdn.com/images/main_door/post/0c59dd7c-5245-4fe9-93f0-08397ff5000f/image.png" alt="">
<a href="https://www.acmicpc.net/problem/1181">문제 바로가기</a></p>
<h2 id="해결-방식">해결 방식</h2>
<p>자동 정렬과 조건을 수행하기 위해 STL 컨테이너 중 우선순위 큐를 사용하여 문제를 해결했습니다.</p>
<h2 id="코드">코드</h2>
<pre><code>// Baekjoon.cpp : 이 파일에는 &#39;main&#39; 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//


/*
https://www.acmicpc.net/problem/1181
*/


#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;queue&gt;
#include &lt;list&gt;
#include &lt;string.h&gt;
using namespace std;

struct cmp [0]
{
    bool operator()(string dest, string sour)
    {
        if (dest.size() == sour.size())
        {
            int compare = strcmp(dest.c_str(), sour.c_str());

            return compare &gt; 0;
        }
        else
        {
            return dest.size() &gt; sour.size();
        }
    }
};


int main()
{
    priority_queue&lt;string, vector&lt;string&gt;, cmp&gt; wordQueue;
    string    popedWord;

    int wordCount = 0;
    string word;

    cin &gt;&gt; wordCount;

    for (int i = 0; i &lt; wordCount; i++)
    {
        cin &gt;&gt; word;
        wordQueue.push(word);
    }

    while (!wordQueue.empty())
    {
        if (!popedWord.empty() &amp;&amp;
            strcmp(wordQueue.top().c_str(), popedWord.c_str()) == 0)
        {
            wordQueue.pop();
        }
        else
        {
            cout &lt;&lt; wordQueue.top() &lt;&lt; endl;
            popedWord = wordQueue.top();
            wordQueue.pop();
        }
    }
}

</code></pre><h2 id="코드-해설">코드 해설</h2>
<p>0번 구문은 함수호출 연산자를 활용하여 두 원소를 비교하여 매번 처리를 진행했습니다.
string이 비용이 많이 잡아먹긴 하나, 성능이 강력하고 문제에서 제시한 메모리 비용을 넘지 않을 것이라 예상해 사용했습니다.</p>
<p>중복되는 값을 처리하기 위해, 가장 최근에 pop된 문자열을 기억하고 있다가, 중복되는 값이 나오면 출력을 건너뛰게 처리했습니다.</p>
<h1 id="영화감독-숌">영화감독 숌</h1>
<p><img src="https://velog.velcdn.com/images/main_door/post/2da4e897-0d15-4a80-80ec-af01e9ec502c/image.png" alt=""></p>
<p><a href="https://www.acmicpc.net/problem/1181">문제 바로가기</a></p>
<h2 id="해결-방식-1">해결 방식</h2>
<p>브루트 포스 알고리즘, 완전 탐색 알고리즘이라 부르는 방식으로 모든 경우의 수를 가정하여 작업했습니다.</p>
<h2 id="코드-1">코드</h2>
<pre><code>
// Baekjoon.cpp : 이 파일에는 &#39;main&#39; 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//


/*
https://www.acmicpc.net/problem/1181
*/

#include &lt;iostream&gt;
#include &lt;stdio.h&gt;
#include &lt;string&gt;
using namespace std;

bool    inNumber666(int number)[0]
{
    string numberStr;

    numberStr = to_string(number);

    int        count = 0;
    for (int i = 0; i &lt; numberStr.size() - 2; i++)
    {
        if (numberStr[i] != &#39;6&#39;)[1]
            continue;
        count = 0;
        for (int j = i; j &lt; i + 3; j++)
        {
            if (numberStr[j] == &#39;6&#39;)
                count++;
            else[2]
                break;
        }
        if (count &gt;= 3)
        {
            return true;
        }
    }
    return false;
}

int main()
{
    int movieNumber = 666;

    int index = 0;
    int findNumber = 0;

    cin &gt;&gt; findNumber;

    while (1)
    {
        if (inNumber666(movieNumber))
        {
            index++;
            if (index == findNumber)
                break;
        }
        movieNumber++;
    }

    cout &lt;&lt; movieNumber;

    return 0;
}
</code></pre><h2 id="코드-해설-1">코드 해설</h2>
<p>모든 경우의 수를 검사하는 완전탐색 문제이므로 0번 구문의 조건에 맞을때까지 반복문을 돌며 정답을 찾습니다.</p>
<p>1번과 2번 구문은 해당 값이 &quot;완전히&quot; 조건에서 벗어난 케이스를 예외처리 하여 검사횟수를 줄였습니다.</p>
<h1 id="오늘-점수">오늘 점수</h1>
<p><img src="https://velog.velcdn.com/images/main_door/post/75e59ac1-6008-47c9-b49d-e00ece83c30a/image.png" alt=""></p>
<p>계속 ㄱㄱ</p>
<h1 id="여담">여담</h1>
<p>2번 영화감독 숌의 경우, 처음에는 완전탐색 문제인지 모르고 효율적인 방식을 찾아보겠다고 이리저리 고집하다가, 결국 반복문을 돌리는 것으로 끝났습니다. 문제를 제대로 판별하는 능력을 기르는 것이 중요하겠네요.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Day1 - 펠린드롬수, 체스판 다시 칠하기]]></title>
            <link>https://velog.io/@main_door/Day1-%ED%8E%A0%EB%A6%B0%EB%93%9C%EB%A1%AC%EC%88%98-%EC%B2%B4%EC%8A%A4%ED%8C%90-%EB%8B%A4%EC%8B%9C-%EC%B9%A0%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@main_door/Day1-%ED%8E%A0%EB%A6%B0%EB%93%9C%EB%A1%AC%EC%88%98-%EC%B2%B4%EC%8A%A4%ED%8C%90-%EB%8B%A4%EC%8B%9C-%EC%B9%A0%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 08 Feb 2023 03:31:26 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>해당 문제는 백준 온라인 저지에서 나온 문제입니다.</p>
</blockquote>
<h1 id="펠린드롬-수">펠린드롬 수</h1>
<p><a href="https://www.acmicpc.net/problem/1259">문제 바로가기</a>
<img src="https://velog.velcdn.com/images/main_door/post/67a704b1-ac8d-4dec-ae58-4db496162c02/image.png" alt=""></p>
<h2 id="해결-방식">해결 방식</h2>
<p>탐욕 알고리즘으로, 검사할 때마다 앞뒤 두 숫자를 잘라서 비교하는 방식으로 문제를 해결했습니다.</p>
<h2 id="해결-방식을-고른-이유">해결 방식을 고른 이유</h2>
<p>그때그때 가장 최적의 값을 고르는 그리디 알고리즘 문제였기에, 별다른 알고리즘 없이 해결하였습니다.</p>
<h2 id="코드">코드</h2>
<pre><code>// Baekjoon.cpp : 이 파일에는 &#39;main&#39; 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//


/*
https://www.acmicpc.net/problem/1259
*/


#include &lt;iostream&gt;

using namespace std;


int main()
{
    int numberList[1000];

    int inputNumber = 0;
    bool bIsCompare;
    while (1)
    {
        cin &gt;&gt; numberList[inputNumber];

        if (numberList[inputNumber] == 0)
            break;
        inputNumber++;
    }
    for (int i = 0; i &lt; inputNumber; i++)
    {
        if (numberList[i] &lt; 10)//예외조건
        {
            cout &lt;&lt; &quot;yes&quot; &lt;&lt; endl;
            continue;
        }
        bIsCompare = true;


        //정의[1]
        int frontDigit = 1;
        while (frontDigit * 10 &lt; numberList[i])
        {
            frontDigit *= 10;
        }
        //비교[2]
        while (numberList[i] &gt; 0)
        {

            int numberHead = numberList[i] / frontDigit;
            int numberTail = numberList[i] % 10;

            if (numberHead != numberTail)
            {
                bIsCompare = false;
                break;
            }
            numberList[i] %= frontDigit;
            numberList[i] /= 10;

            frontDigit /= 100;

            if (numberList[i] &lt; 10)
                break;
        }
        //출력[3]
        if (bIsCompare)
        {
            cout &lt;&lt; &quot;yes&quot; &lt;&lt; endl;
        }
        else
         {
            cout &lt;&lt; &quot;no&quot; &lt;&lt; endl;
        }
    }
}
</code></pre><h2 id="코드-해설">코드 해설</h2>
<p> [1]번 구문에서 통해 앞에서 자를 숫자단위를 구했습니다.
 [2]번 구문에서 구한 값을 통해 해당배열 숫자의 앞자리, 뒷자리 숫자를 구해 값이 같은지 검사했습니다.</p>
<h1 id="체스판-다시-칠하기">체스판 다시 칠하기</h1>
<p> <a href="https://www.acmicpc.net/problem/1018">문제 바로가기</a></p>
<p> <img src="https://velog.velcdn.com/images/main_door/post/6fc7e130-7594-44d9-959d-9a96e73faa75/image.png" alt=""></p>
<h2 id="해결-방식-1">해결 방식</h2>
<p>검은색으로 시작하는 체스판과 하얀색으로 시작하는 두개의 체스판을 만들어, 입력받은 체스판과 매번 비교해 최소값을 구했습니다.</p>
<h2 id="해결방식을-고른-이유">해결방식을 고른 이유</h2>
<p>모든 경우의 수를 비교해야하기에, 완전탐색을 활용하여 구현했습니다.</p>
<h2 id="코드-1">코드</h2>
<pre><code>// Baekjoon.cpp : 이 파일에는 &#39;main&#39; 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//


/*
https://www.acmicpc.net/problem/1018
*/


#include &lt;iostream&gt;
#include &lt;algorithm&gt;
using namespace std;

//[0]검사용 체스판을 만드는 함수
void MakeBoardCase(char*** board, int width, int height, bool startColor)
{
    *board = new char* [height];
    bool color;
    for (int i = 0; i &lt; height; i++)
    {
        (*board)[i] = new char[width];
        (*board)[i][width] = &#39;\0&#39;;

        color = startColor;
        for (int j = 0; j &lt; width; j++)
        {
            if (color)
            {
                (*board)[i][j] = &#39;B&#39;;
            }
            else
            {
                (*board)[i][j] = &#39;W&#39;;
            }
            color = !color;
        }
        startColor = !startColor;
    }
}

//[1]검사용 체스과 체스판을 검사해, 다시 칠해야 하는 부분을 리턴하는 함수

int SolvedPainted(char** board, char** checkBoard, int startX, int endX, int startY, int endY)
{
    int    paintedCount = 0;

    int checkI = 0;
    int checkJ = 0;


    for (int i = startY; i &lt; endY; i++)
    {
        checkJ = 0;
        for (int j = startX; j &lt; endX; j++)
        {
            if (board[i][j] != checkBoard[checkI][checkJ])
            {
                paintedCount++;
            }
            checkJ++;
        }
        checkI++;
    }
    return paintedCount;
}


int main()
{
    int width =        0;
    int height =    0;
    int minPaintCount = 99999;


    char** board;
    char** CheckCase1;
    char** CheckCase2;

    MakeBoardCase(&amp;CheckCase1, 8, 8, 1);
    MakeBoardCase(&amp;CheckCase2, 8, 8, 0);

    cin &gt;&gt; height &gt;&gt; width;
    board = new char* [height];

    for (int i = 0; i &lt; height; i++)
    {
        board[i] = new char[width];

        cin &gt;&gt; board[i];
    }

    for (int i = 0; i &lt; height; i++)
    {
        if (i + 8 &gt; height)
            continue;
        for (int j = 0; j &lt; width; j++)
        {
            if (j + 8 &gt; width)
                continue;

            int paintCount1 = SolvedPainted(board, CheckCase1, j, j + 8, i, i + 8);
            int paintCount2 = SolvedPainted(board, CheckCase2, j, j + 8, i, i + 8);

            minPaintCount = min(minPaintCount, paintCount1);
            minPaintCount = min(minPaintCount, paintCount2);
        }
    }
    cout &lt;&lt; minPaintCount;

    /*
    cout &lt;&lt; endl &lt;&lt; &quot;case1&quot; &lt;&lt; endl;
    for (int i = 0; i &lt; 8; i++)
    {
        cout &lt;&lt; CheckCase1[i];
        cout &lt;&lt; endl;
    }

    cout &lt;&lt; endl &lt;&lt; &quot;case2&quot; &lt;&lt; endl;
    for (int i = 0; i &lt; 8; i++)
    {
        cout &lt;&lt; CheckCase2[i];
        cout &lt;&lt; endl;
    }
    */

}
</code></pre><h2 id="코드-해설-1">코드 해설</h2>
<p>검사용 체스판을 만들기 위해 [0]번 함수를 작성했습니다.
반복문을 돌며 입력받은 체스판과 , 두 개의 검사용 체스판과 매번 비교해 최소값을 구해 이를 출력하였습니다</p>
<h1 id="백준-랭크">백준 랭크</h1>
<p><img src="https://velog.velcdn.com/images/main_door/post/c10e3c0b-160d-4a02-b906-d0fee3a3c052/image.png" alt=""></p>
<p>차근차근 올립시다</p>
<h1 id="여담">여담</h1>
<p>제가 글을 대충읽는 성격이라그런지, 체스판 칠하기 문제를 잘못 이해해서 시간이 한참 걸렸네요. 문제를 정확하게 파악하는 능력을 길러야할 것 같습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[클래스의 메모리 구조]]></title>
            <link>https://velog.io/@main_door/%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@main_door/%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Sun, 19 Dec 2021 06:57:00 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/main_door/post/23f279fc-45e6-418d-a8f2-f2d6ff151143/image.png" alt=""></p>
<blockquote>
<p>해당 글은 fundamental C++을 참고하여 작성되었습니다.</p>
</blockquote>
<p>이번 글에서는 클래스의 메모리가 어떻게 배치되는지와 메모리의 오프셋에 대해 알아보겠습니다.</p>
<h2 id="1멤버-변수와-정적-멤버-변수의-차이">1.멤버 변수와 정적 멤버 변수의 차이.</h2>
<p>간단한 코드를 하나 작성하겠습니다.
<img src="https://images.velog.io/images/main_door/post/c4c5fd2d-db2f-40ff-8892-97bb4a103ad8/image.png" alt="">
myClass타입의 객체 temp를 생성했습니다.
<img src="https://images.velog.io/images/main_door/post/c5d54c6d-3612-4d0f-9934-bdbf80e0f344/image.png" alt="">
선언된 temp의 메모리 구조는 대략 이렇습니다. 중요한 것은 정적 멤버 변수인 m_SInt와
멤버 함수인 m_func는 메모리 영역에 포함되어 있지 않다는 점입니다. 실제로 메모리 영역에 포함되어 있는 것은 일반 멤버 변수들뿐이죠.</p>
<p>멤버 변수는 객체의 상태나 정보를 나타내기 위해서 존재합니다. 그에 비해서 정적 멤버 변수는 객체가 아닌 클래스의 상태와 정보를 나타냅니다. 따라서 멤버 변수는 각 객체마다 존재하지만, 정적 멤버 변수는 하나만 존재할 수 있습니다. 이는 전역변수와 같이 어떤 객체에서든 정적 멤버 변수에 접근할 수 있기에, m_SInt는 전역변수가 저장되는 전역 메모리 데이터 영역에 4바이트만큼 존재하며, myClass에 모든 객체가 이를 공유할 수 있습니다.
<img src="https://images.velog.io/images/main_door/post/430d1980-6a1e-4e5a-b2c8-6e66ffc9c1ab/image.png" alt=""></p>
<p>그렇다면 실제 메모리 영역에서 멤버 변수들은 어떻게 저장될까요?
<img src="https://images.velog.io/images/main_door/post/92f0b898-8a7b-47ed-bc4a-f7adb934e8dc/image.png" alt="">
위에 코드는 0을 myClass* 타입으로 캐스팅하여 시작 주소를 0으로 맞춰놓은 뒤, 각 멤버 변수의 시작 위치를 출력시키는 코드입니다. 참고로 멤버 변수의 주소는 클래스에서 선언한 순서대로 쌓이게 됩니다. 한번 코드를 실행시켜봅시다.
<img src="https://images.velog.io/images/main_door/post/d37e7106-445e-4575-a824-7bb26df0b3dd/image.png" alt="">
뭔가 이상하죠? byte의 값으로 봤을 때 이상적인 출력결과는 분명 [1,4,5]인데 말이죠. 여기에는 한가지 비밀이 숨어있습니다. 바로 오프셋이라는 친구가말이에요.</p>
<h2 id="2멤버-변수의-오프셋">2.멤버 변수의 오프셋</h2>
<p>오프셋의 정의부터 먼저 짚고 넘어갑시다.
<img src="https://images.velog.io/images/main_door/post/1cccf31c-3624-40d3-9770-b3bc40aa3ad4/image.png" alt="">
간단하게 풀어설명하자면, &quot;두개의 값 사이의 간격&quot;정도로 생각하면 되겠습니다.</p>
<p>컴파일러는 생각보다 하는일이 꽤 많습니다. 소스코드를 읽어 어셈블리언어로 변환하는게 주된 일이지만, 코드의 성능을 높이기 위해 코드를 직접 최적화하기도 합니다.(예를 들면 암시적 형변환이 있겠네요.) 클래스 객체의 메모리 배치도 컴파일러가 하는 일 중에 하나입니다.</p>
<p>컴파일러는 /ZpN 옵션을 가지고 객체의 메모리 오프셋을 설정합니다. 비주얼 스튜디오에서는 프로젝트속성에서 확인 할 수 있습니다.
<img src="https://images.velog.io/images/main_door/post/f128e591-c001-4a12-93fc-3309e788a4f0/image.png" alt="">
컴파일러는 멤버 변수를 메모리에 위치시킬 때, 변수 타입의 크기와 N(기본값은 8입니다)중 작은 쪽의 최소 배수가 되도록 조정을 하게 됩니다. 그렇기에 m_char는 첫 멤버 변수이므로 0에 위치하게 되며, m_int는 (4,8)중에서 작은 쪽인 4의 배수인 4의 오프셋을 가지게됩니다. 이후 double는 1 + 3 + 4 = 8이므로 자연스럽게 오프셋 8에 위치합니다.
<img src="https://images.velog.io/images/main_door/post/904f7e9d-b6c8-4717-83ab-8ba8fe3a1521/image.png" alt="">
감이 잘 안잡히죠? 예시로 몇개 더 해봅시다.</p>
<h4 id="zp8-일-경우-클래스-메모리의-오프셋이-어떻게-출력될까요">Zp8 일 경우, 클래스 메모리의 오프셋이 어떻게 출력될까요?</h4>
<p><img src="https://images.velog.io/images/main_door/post/b37c0ed1-a676-4c53-bf1c-b1179ae801fa/image.png" alt="">
1.[0, 1, 9]
2.[0, 8, 9]
3.[0, 8, 16]</p>
<p><img src="https://images.velog.io/images/main_door/post/e11d4e83-15c3-4bfd-beb8-7f8eb4cadf79/image.png" alt="">
1.[0, 4, 8]
2.[0, 8, 12]
3.[0, 4, 12]</p>
<p><img src="https://images.velog.io/images/main_door/post/8b641c7d-255d-433b-9d21-c45af4f92d43/image.png" alt=""></p>
<p>1.[0, 8, 12]
2.[0, 8, 9]
3.[0, 8, 16]</p>
<p>기본적인 메모리 배치만 알면 되겠고, Zp1, Zp2 등등... 많긴 한데 그것들까지 다 할 필요성까지는 느끼지 못했네요. 오늘은 여기까지 하고 정답은 댓글로 남겨놓겠습니다.</p>
<p>그럼 바윙~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[C++에서 구조체와 클래스의 차이]]></title>
            <link>https://velog.io/@main_door/C%EC%97%90%EC%84%9C-%EA%B5%AC%EC%A1%B0%EC%B2%B4%EC%99%80-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@main_door/C%EC%97%90%EC%84%9C-%EA%B5%AC%EC%A1%B0%EC%B2%B4%EC%99%80-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Sat, 18 Dec 2021 05:17:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/main_door/post/23f279fc-45e6-418d-a8f2-f2d6ff151143/image.png" alt=""></p>
<blockquote>
<p>이 글은 fundamental c++의 내용을 참고하여 작성되었습니다.</p>
</blockquote>
<h2 id="1c의-구조체-c의-구조체">1.C의 구조체, C++의 구조체.</h2>
<p>C를 공부하신 분들은 구조체에 대해 아실겁니다. 명확하게 정의를 하자면 &quot;여러 타입의 자료형을 한 곳에 모아놓은 확장 자료형&quot;이죠. 말 그대로 확장된 자료형이기에 함수를 추가한다거나 하는 행동은 C에서는 불가능합니다. 그럼 C++에서는 과연 어떨까요?</p>
<pre><code>#include &lt;stdio.h&gt;

typedef struct myStruct
{
    int        a;
    int        b;
    void    printMyName()
    {
        printf(&quot;my name is 뉴트리아!\n&quot;);
    }
}            myStruct;

int    main()
{
    myStruct    myStruct;
    myStruct.printMyName();
    return 0;
}</code></pre><p>아래 코드를 각각  c, c++환경에서 컴파일 해보겠습니다.
<img src="https://images.velog.io/images/main_door/post/c900b33b-ad1a-423f-9862-a23728a20042/image.png" alt="">
예상했던대로 c에서는 printMyName이란 멤버를 가질 수 없다고 나오죠.
<img src="https://images.velog.io/images/main_door/post/116732aa-46cf-4329-b0ae-54e578f66520/image.png" alt="">
c++에서 동일한 코드가 정상적으로 나오는 것을 볼 수 있습니다. 이는 C++ 컴파일러를 사용하면서 구조체의 기능이 클래스처럼 확장되었다고 보는것이 맞다고 할 수 있습니다.</p>
<p>이렇게 보면 구조체와 클래스는 차이점이 없다고 볼 수 있지만, 접근 지정자 부분에서 꽤나 큰 차이를 보입니다.</p>
<h2 id="2-클래스와-구조체의-기본-접근-지정자">2. 클래스와 구조체의 기본 접근 지정자</h2>
<p>둘의 차이 중 하나는 기본적으로 주어지는 접근 지정자가 다르다는 것입니다.</p>
<p>구조체의 기본 접근 지정자는 public, 클래스의 기본 접근 지정하는 private로 서로 다른 것을 알 수 있습니다.</p>
<pre><code>typedef struct myStruct
{
    int        a;
    int        b;
    void    printMyName()
    {
        printf(&quot;구조체 : my name is 뉴트리아!\n&quot;);
    }
}myStruct;

class    myClass
{
    int        a;
    int        b;
    void    printMyName()
    {
        printf(&quot;클래스 : my name is 뉴트리아!\n&quot;);
    }
};</code></pre><p>여기 동일한 기능을 하는 구조체와 클래스가 있습니다. 멤버 모두 동일하며 접근 지정자를 따로 선언하지도 않았습니다. 먼저 구조체부터 다시 실행시켜보겠습니다.
<img src="https://images.velog.io/images/main_door/post/02d4429d-cf29-4337-9d73-d9cc99573464/image.png" alt="">
정상적으로 실행됩니다. 그러면 클래스도 동일하게 실행시켜보겠습니다.
<img src="https://images.velog.io/images/main_door/post/e891f0d3-2e5d-471c-be32-81420657539e/image.png" alt="">
호출하려는 해당 함수가 private라 접근이 불가능하다고 컴파일 단계에서 오류를 띄워줍니다. 당연하게도 접근 지정자를 pulbic으로 해주면 문제는 해결되지요. 그렇다면 왜 구조체와 클래스의 기본 접근 지정자가 다른 것일까요?</p>
<p>C언어에서는 예전부터 아~주 많은 프로그램에서 구조체가 사용되고 있었으며, 애초에 그 당시엔 구조체에 접근 지정자라는 개념 자체가 없었습니다. 만약 구조체의 기본 접근 지정자가 private라면, 그동안 만들어진 모든 소스코드들 모드 컴파일이 되지 않을 것입니다. 또한 접근 지정자는 객체지향 개념에서 클래스의 캡슐화(또는 정보은닉화)개념을 구현하기 위해 도입된 것이므로, 하위 호환성 고려는 물론 외부의 접근을 자유롭게 허용하는 구조체는 당연히 public으로 지정될 수 밖에 없는 것이지요.</p>
<p>하지만 클래스는 캡슐화를 기본으로 하면서 외부에 공개할 것을 특별히 public을 지정하도록 설계가 되어있기에 기본 접근 지정자가 private인 것입니다.</p>
<p>저는 코드를 작성할 때 작은 범위의 클래스가 필요할때는 구조체를 주로 사용하고, 나머지는 클래스로 작성하는 스타일을 가지고 있습니다. 예를 들어 RPG를 만든다면, 몬스터의 클래스 안에 몬스터의 좌표를 저장하는 pt라는 구조체를 사용하는 형태로 코드를 작성합니다.</p>
<blockquote>
<p>요약.
1.구조체는 기본 접근 지정자가public인 이유는 호환성 때문.
2.클래스는 기본 접근 지정자가 private인 이유는 객체지향 설계 때문.
3.상황에 맞게 잘 쓰자.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 알파벳]]></title>
            <link>https://velog.io/@main_door/%EC%95%8C%ED%8C%8C%EB%B2%B3</link>
            <guid>https://velog.io/@main_door/%EC%95%8C%ED%8C%8C%EB%B2%B3</guid>
            <pubDate>Tue, 10 Aug 2021 06:21:26 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>해당 문제는 <a href="https://www.acmicpc.net/problem/1987">백준</a>온라인 저지에서 나온 문제입니다.</p>
</blockquote>
<h2 id="해결-방식">해결 방식</h2>
<p>백트래킹 알고리즘을 활용하여 작성하였습니다
<a href="https://chanhuiseok.github.io/posts/algo-23/">백트래킹 자료 1</a>
<a href="https://jeongdowon.medium.com/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-backtracking-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-13492b18bfa1">백트래킹 자료 2</a>
두가지 블로그를 참고하였습니다.</p>
<h2 id="해결-방식을-고른-이유">해결 방식을 고른 이유</h2>
<p>인접한 모든 노드를 집어넣고 탐색을 시작하는 BFS알고리즘의 방식은 문제의 조건때문에 선택하기가 힘들다고 판단하였습니다. 따라서 DFS방식을 활용한 백트래킹 알고리즘을 선택하였습니다.</p>
<h2 id="코드">코드</h2>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string&gt;

using namespace std;

char map[20][20];
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };//이동할 방향

vector&lt;char&gt; road;
int cnt =  0;
int R, C;//R이 세로 C가 가로
bool    isValid(char num)//중복되지 않는 문자인지 검사
{
    if (road.empty())
        return true;
    for (int i = 0; i &lt; road.size(); i++)
    {
        if (road[i] == num)
            return false;
    }
    return true;
}

void solution(int x, int y)
{
    road.push_back(map[y][x]);
    for (int i = 0; i &lt; 4; i++)
    {
        if (x + dir[i][0] &gt;= C || y + dir[i][1] &gt;= R)
            continue;
        if (x + dir[i][0] &lt; 0 || y + dir[i][1] &lt; 0)
            continue;
        if (!isValid(map[y + dir[i][1]][x + dir[i][0]]))
            continue;
        solution(x + dir[i][0], y + dir[i][1]);
    }
    if (!road.empty())//[1]
    {
        if ((int)road.size() &gt; cnt)
            cnt = (int)road.size();
        road.pop_back();
    }
}

int main()
{
    string str;
    cin &gt;&gt; R &gt;&gt; C;
    for (int i = 0; i &lt; R; i++)
    {
        cin &gt;&gt; str;
        for (int j = 0; j &lt; C; j++)
        {
            map[i][j] = str[j];
        }
    }
    solution(0, 0);
    cout &lt;&lt; cnt &lt;&lt; endl;
}

</code></pre><h2 id="코드-해설">코드 해설</h2>
<p>코드의 핵심 부분은 solution 함수입니다. 반복문을 돌며 상하좌우 조건에 맞는 경로를 재귀로 호출하여 이동합니다. 탐색이 끝난 경로는 리스트에서 제외해야 하기 때문에 [1]의 제어문을 두어 현재 경로와 최장 경로를 비교하고(현재 경로가 크다면 cnt를 이로 바꿔줍니다.) pop_back을 통해 마지막으로 이동한 경로를 지워 다음 탐색을 진행합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 숨바꼭질]]></title>
            <link>https://velog.io/@main_door/%EC%88%A8%EB%B0%94%EA%BC%AD%EC%A7%88</link>
            <guid>https://velog.io/@main_door/%EC%88%A8%EB%B0%94%EA%BC%AD%EC%A7%88</guid>
            <pubDate>Mon, 09 Aug 2021 23:34:26 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>해당 문제는 <a href="https://www.acmicpc.net/problem/1697">백준</a>온라인 저지에서 나온 문제입니다.</p>
</blockquote>
<h2 id="해결-방식">해결 방식</h2>
<p>너비 우선 탐색 알고리즘(BFS)을 베이스로 작성하였습니다.</p>
<h2 id="해결-방식을-고른-이유">해결 방식을 고른 이유</h2>
<p>완전탐색을 요구하는 문제로 깊이우선탐색으로는 정확한 해를 찾을 수 없다고 생각하여, 너비우선탐색 알고리즘을 선택하여 작성하였습니다.</p>
<p>저는 깊이우선방식과 너비우선방식 중에서 선택을 할때, 문제의 키워드를 보고 고릅니다.
대략적으로 최적의,가장 빠른 같은 키워드가 나올때는 너비우선탐색으로 진행하고, 그렇지 않은 경우 깊이우선탐색으로 코드를 짜는 편입니다.</p>
<h2 id="코드">코드</h2>
<pre><code>#include &lt;iostream&gt;
#include &lt;queue&gt;

using namespace std;

queue&lt;int&gt; ql;
queue&lt;int&gt; qc;
int visted[100001];
void push_q(int range, int cnt)
{
    ql.push(range);
    qc.push(cnt);
}

void    pop_q(int* range, int* cnt)
{
    *range = ql.front();
    ql.pop();
    *cnt = qc.front();
    qc.pop();
}

int main()
{
    int N, K;
    int    range, c;
    range = 0;
    c = 0;
    cin &gt;&gt; N &gt;&gt; K;
    push_q(N, 0);
    visted[N] = 1;
    while (qc.size() != 0 &amp;&amp; ql.size() != 0)
    {
        pop_q(&amp;range, &amp;c);
        if (range == K)
        {
            cout &lt;&lt; c &lt;&lt; endl;
            break;
        }
        if (range + 1 &lt;= 100000 &amp;&amp; visted[range + 1] == 0)
        {
            push_q(range + 1, c + 1);
            visted[range + 1] = 1;
        }
        if (range * 2 &lt;= 100000 &amp;&amp; visted[range * 2] == 0)
        {
            push_q(range * 2, c + 1);
            visted[range * 2] = 1;
        }
        if (range - 1 &lt;= 100000 &amp;&amp; visted[range - 1] == 0 &amp;&amp; range - 1 &gt;= 0)
        {
            push_q(range - 1, c + 1);
            visted[range - 1] = 1;
        }
    }
}
</code></pre><h2 id="코드-해설">코드 해설</h2>
<p>주변에 존재하는 모든 노드를 넣고 탐색을 진행하는 너비 우선 탐색은 큐를 사용하여 작성하는것이 편합니다.
visted 변수는 같은 수를 계산하지 않기 위해서 넣은 것입니다. 예를 들어서 
N =1, K = 1000의 경우, 맨 처음 while문에서 2,2,0의 값이 들어갑니다. 다음 반복에서 2를 꺼내어 3,4,1을 넣을 것이고, 그 다음 반복문에서도 2를 꺼내 3,4,1을 넣습니다. 이처럼 같은 값이 반복되서 들어가는 것을 막기 위해 visted변수를 놓아 중복을 막는것입니다.
계속 push,pop을 반복하며 pop한 값이 K값과 같다면 c를 출력하고 반복문을 끝냅니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 유기농 배추]]></title>
            <link>https://velog.io/@main_door/%EB%B0%B1%EC%A4%80</link>
            <guid>https://velog.io/@main_door/%EB%B0%B1%EC%A4%80</guid>
            <pubDate>Mon, 09 Aug 2021 07:42:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>해당 문제는 <a href="https://www.acmicpc.net/problem/1012">백준</a>온라인 저지에서 나온 문제입니다.</p>
</blockquote>
<h2 id="해결-방식">해결 방식</h2>
<p>깊이 우선 탐색 알고리즘(DFS)을 베이스로 작성하였습니다.</p>
<h2 id="해결-방식을-고른-이유">해결 방식을 고른 이유</h2>
<p>너비 우선 탐색 알고리즘은 최적의 해를 찾기 유용하지만, 그만큼 비용이 많이들어가며, 형제인 모든 노드를 탐색하기때문에 상대적으로 시간이 많이걸립니다.
깊이 우선 탐색은 상대적으로 구현이 간단하고, 목표 노드가 깊은 곳에 있을 경우 빠른 속도로 해를 구할 수 있습니다. 단점으로는 주변 모든 노드를 탐색하는것이 아니라 자신이 선택한 뎁스에서만 탐색을 진행하기 때문에, 얻어진 해가 최적의 결과가 아닐 수가 있습니다.</p>
<p>해당 문제는 깊이우선탐색으로도 최적의 해를 구할 수 있으며, 구현이 간단하기에 이를 선택하였습니다.</p>
<h2 id="코드">코드</h2>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

using namespace std;

int map[50][50] = { 0, };
int mask[50][50] = { 0, };
int    dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };//이동할 방향
int M, N, K;
void    clear_map(int width, int height)
{
    for (int i = 0; i &lt; height; i++)
    {
        for (int j = 0; j &lt; width; j++)
        {
            map[i][j] = 0;
            mask[i][j] = 0;
        }
    }
}

void    solution(int x, int y)
{
    if (map[y][x] == 0)//배추가 존재한다면
        return;
    if (mask[y][x] == 0)//처음 지나가는 배추일 경우.
        mask[y][x] = 1;//다음번 탐색에서 제외
    for (int i = 0; i &lt; 4; i++)
    {
        if ((x + dir[i][0] &gt;= M || y + dir[i][1] &gt;= N) || (x + dir[i][0] &lt; 0 || y + dir[i][1] &lt; 0))//이동할 경로가 맵의 범위를 벗어나는 경우
            continue;
        if (mask[y + dir[i][1]][x + dir[i][0]] == 1)//해당 경로에 배추가 있는지
            continue;
        mask[y + dir[i][1]][x + dir[i][0]] == 1;
        solution(x + dir[i][0], y + dir[i][1]);
    }
}
int main()
{
    int T;
    cin &gt;&gt; T;
    vector&lt;int&gt; answer;

    for (int t_case = 0; t_case &lt; T; t_case++)
    {
        //init start
        int x, y;
        int cnt = 0;
        cin &gt;&gt; M &gt;&gt; N &gt;&gt; K;
        clear_map(M, N);

        for (int i = 0; i &lt; K; i++)
        {
            cin &gt;&gt; x &gt;&gt; y;
            map[y][x] = 1;
        }
        //init end
        for (int y = 0; y &lt; N; y++)
        {
            for (int x = 0; x &lt; M; x++)
            {
                if (map[y][x] == 1 &amp;&amp; mask[y][x] == 0)
                {
                    solution(x, y);
                    cnt++;
                }
            }
        }
        answer.push_back(cnt);
    }
    for (int i = 0; i &lt; answer.size(); i++)
        cout &lt;&lt; answer[i] &lt;&lt; endl;
}
</code></pre><h2 id="코드-해설">코드 해설</h2>
<p>핵심적인 부분은 solution 부분입니다.</p>
<p>DFS 알고리즘을 활용하여, 재귀를 돌며 조건에 맞을 때까지 탐색을 진행합니다.
map은 배추밭 농장을 의미하고, mask는 이미 탐색한 경로를 의미합니다.
mask가 필요한 이유는 이미 지나온 노드를 한번 더 탐색하는 것을 방지하기 위한 것인데,
<img src="https://images.velog.io/images/main_door/post/48330f42-6c91-405a-bb85-c00bd3a501bd/image.png" alt="">
만약 지나온 곳을 적어놓지 않는다면, 0,0번째 배열에서 탐색을 진행하고, 0,1번째 배열에서 또다시 탐색을 진행할 것입니다. 이런 문제를 방지하기 위해 mask라는 이중배열을 선언하여 지나온 곳을 적어놓아 다음번 탐색에서 제외해놓는 겁니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[파리퇴치]]></title>
            <link>https://velog.io/@main_door/%ED%8C%8C%EB%A6%AC%ED%87%B4%EC%B9%98</link>
            <guid>https://velog.io/@main_door/%ED%8C%8C%EB%A6%AC%ED%87%B4%EC%B9%98</guid>
            <pubDate>Sun, 01 Aug 2021 23:12:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>해당 문제는 삼성 익스퍼트 아카데미에서 나온 <a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&amp;contestProbId=AV5PzOCKAigDFAUq&amp;categoryId=AV5PzOCKAigDFAUq&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=FIRST_REG_DATETIME&amp;selectCodeLang=ALL&amp;select-1=2&amp;pageSize=10&amp;pageIndex=1">파리퇴치</a> 문제입니다.</p>
</blockquote>
<h2 id="해결-방식">해결 방식</h2>
<p>브루트 포스 알고리즘을 바탕으로 코드를 작성하였습니다</p>
<h2 id="해결-방식을-고른-이유">해결 방식을 고른 이유</h2>
<p>문제에서 제시하는 방식이 DP, BFS, DFS를 활용하지 않아도 충분히 풀 수 있다고 생각하였고,
위 알고리즘을 해결하여 작성하여도 수행속도가 크게 차이가 나지 않을것이라 판단하여
구현이 간단한 해결 방식을 골랐습니다.</p>
<h2 id="코드">코드</h2>
<pre><code>#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
using namespace std;

int        n;//배열의 크기
int        m;//파리채의 크기.
int**        list;
int        sol(int y, int x)
{
    int temp = 0;
    for (int i = 0; i &lt; m; i++)
    {
        for (int j = 0; j &lt; m; j++)
        {
            temp += list[y + i][x + j];
        }
    }
    return temp;
}

int main()
{
    int        big = 0;
    int        temp = 0;

    //벡터 초기화.
    cin &gt;&gt; n &gt;&gt; m;
    list = (int**)malloc(sizeof(int*) * n);
    for (int i = 0; i &lt; n; i++)
        list[i] = (int*)malloc(sizeof(int) * n);
    int range = (n + 1) - m;//파리채의 범위 내에서 반복문을 돌기 위해 범위 설정
    for (int i = 0; i &lt; range; i++)
    {
        for (int j = 0; j &lt; range; j++)
        {
            temp = sol(i, j);
            if (big &lt; temp)
                big = temp;
        }
    }
    cout &lt;&lt; big &lt;&lt; endl;
}</code></pre><h2 id="코드-해설">코드 해설</h2>
<p>파리채로 파리가 가장 많이 있는 곳을 후려쳐, 죽인 수를 출력하는게 문제에서 요구하는 것입니다. 
즉, 특정한 수가 아닌 최대 개수를 구하는 것이 목적이기에, 파리채의 범위를 벗어나는 구간은 탐색하지 않아도 됩니다.(가로세로 5칸의 배열, 2*2크기의 파리채의 경우, 배열의 5번째 칸을 시작으로 파리채를 후려치는 상황은 생각하지 않아도 된다는겁니다.)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 바이러스(2606)]]></title>
            <link>https://velog.io/@main_door/%EB%B0%B1%EC%A4%80-%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A42606</link>
            <guid>https://velog.io/@main_door/%EB%B0%B1%EC%A4%80-%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A42606</guid>
            <pubDate>Sat, 22 May 2021 02:58:29 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/main_door/post/fd72b70c-bccd-4b91-a527-369896ad3305/image.png" alt="">
<img src="https://images.velog.io/images/main_door/post/18435733-4083-457e-aecd-87d028ca9d54/image.png" alt=""></p>
<p>dfs,bfs를 활용하여 1을 제외한 노드를 탐색할 때마다 개수를 1개씩 누적하여 이를 출력하는 프로그램을 작성하는것이 문제의 요지이다. 미로찾기처럼 중간에 답이 있는것이 아닌, 모든 노드를 탐색해야하는 문제이다. 그렇기에 큐를 쓰는 bfs알고리즘보다는 dfs를 활용하여 간단하게 코드를 작성하였다.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;

using namespace std;

vector&lt;int&gt; nodes[101];
int visited[101] = { 0, };
int cnt = 0;

void    dfs(int i)
{
    for (int j = 0; j &lt; nodes[i].size(); j++)
    {
        if (visited[nodes[i][j]] == 0)
        {
            cnt++;
            visited[nodes[i][j]] = 1;
            dfs(nodes[i][j]);
        }
    }
    return;
}

int main()
{
    int node_cnt;
    int link_cnt;
    int node_i;
    int link;

    scanf(&quot;%d&quot;, &amp;node_cnt);
    scanf(&quot;%d&quot;, &amp;link_cnt);

    for (int i = 1; i &lt;= link_cnt; i++)
    {

        scanf(&quot;%d %d&quot;, &amp;node_i, &amp;link);
        nodes[node_i].push_back(link);
        nodes[link].push_back(node_i);
    }
    visited[1] = 1;
    dfs(1);
    printf(&quot;%d&quot;, cnt);
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[백준 단지번호붙이기(2667)]]></title>
            <link>https://velog.io/@main_door/%EB%B0%B1%EC%A4%80-%EB%8B%A8%EC%A7%80%EB%B2%88%ED%98%B8%EB%B6%99%EC%9D%B4%EA%B8%B02667</link>
            <guid>https://velog.io/@main_door/%EB%B0%B1%EC%A4%80-%EB%8B%A8%EC%A7%80%EB%B2%88%ED%98%B8%EB%B6%99%EC%9D%B4%EA%B8%B02667</guid>
            <pubDate>Fri, 21 May 2021 17:42:56 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/main_door/post/bb712db7-da77-46d5-9a38-410137a7e479/image.png" alt="">
<img src="https://images.velog.io/images/main_door/post/19edb30f-44c8-4e96-82dd-f732123ce2f8/image.png" alt=""></p>
<p>1을 만났을 때, 상하좌우에 인접한 다른 1이 있는지를 계속 검사한다. 내가 원하는 선택지로부터 계속해서 파고들기때문에, 이는 dfs알고리즘을 활용하여 푸는것이 적절하다고 생각하였다.</p>
<p>visited배열이 필요한 이유 : 한번 이동한 경로를 체크해야 다음 번 반복문에서 같은 노드를 중첩하여 검사하지 않기 때문이다.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
using namespace std;

int map[25][25] = { 0, };
int visited[25][25] = { 0, };
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int cnt = 0;

void dfs(int x, int y,int size)
{
    if (map[y][x] == 1)
    {
        cnt++;
        visited[y][x] = 1;
        for (int i = 0; i &lt; 4; i++)
        {
            if (x + dir[i][0] &gt;= size || y + dir[i][1] &gt;= size ||
                x + dir[i][0] &lt; 0 || y + dir[i][1] &lt; 0)
                continue;
            if (visited[y + dir[i][1]][x + dir[i][0]] == 1)
                continue;
            if (map[y + dir[i][1]][x + dir[i][0]] == 0)
                continue;
            visited[y + dir[i][1]][x + dir[i][0]] = 1;
            dfs(x + dir[i][0], y + dir[i][1], size);
        }
        return;
    }
    return;
}
int main()
{
    int size;

    vector&lt;int&gt; cnts;
    scanf(&quot;%d&quot;, &amp;size);
    for (int i = 0; i &lt; size; i++)
    {
        for (int j = 0; j &lt; size; j++)
            scanf(&quot;%1d&quot;, &amp;map[i][j]);
    }
    for (int i = 0; i &lt; size; i++)
    {
        for (int j = 0; j &lt; size; j++)
        {
            cnt = 0;
            if (map[i][j] == 1 &amp;&amp; visited[i][j] == 0)
            {
                visited[i][j] = 1;
                dfs(j, i, size);
                cnts.push_back(cnt);
                cnt = 0;
            }
        }
    }
    sort(cnts.begin(), cnts.end(), less&lt;int&gt;());
    printf(&quot;%d\n&quot;,cnts.size());
    for (int i = 0; i &lt; cnts.size(); i++)
    {
        printf(&quot;%d\n&quot;, cnts[i]);
    }
}

</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[cub3d 팁 모음(경험)]]></title>
            <link>https://velog.io/@main_door/cub3d-%ED%8C%81-%EB%AA%A8%EC%9D%8C%EA%B2%BD%ED%97%98</link>
            <guid>https://velog.io/@main_door/cub3d-%ED%8C%81-%EB%AA%A8%EC%9D%8C%EA%B2%BD%ED%97%98</guid>
            <pubDate>Wed, 07 Apr 2021 02:13:02 GMT</pubDate>
            <description><![CDATA[<h3 id="1파일-불러오고나서-0붙여주기">1.파일 불러오고나서 \0붙여주기.</h3>
<p>read 파일은 매개변수    buf에 최대 size만큼의 값을 불러오고, 불러온 값은 int형으로 리턴한다. 이때, buf의 마지막에 \0이 붙는다는 보장이 없기에,
사용자가 알아서 붙여줘야함. 맵 파싱할때 이거 깜빡했다가 이틀정도 날려먹었음.</p>
<h3 id="2되도록-이미지를-생성해서-그려주기">2.되도록 이미지를 생성해서 그려주기.</h3>
<p>처음에는 pixel_put함수가 직관적이여서 편할 수 있으나, 가면 갈수록 프레임이 기하급수적으로 떨어지는걸 볼 수 있음. mlx_do_sync랑 mlx이미지를 활용해서 렌더링을 구현하자.</p>
<h3 id="3윈도우즈-환경에서-n은-newline이랑-캐리지-리턴이-존재한다">3.윈도우즈 환경에서 \n은 newline이랑 캐리지 리턴이 존재한다.</h3>
<p>간단하게 얘기하면, 맥에서는 개행문자가 \n만 존재하지만, 윈도우즈에선 캐리지 리턴이라는 것이 추가적으로 존재한다.(자세한건 검색으로) 그래서 맵의 y값을 리드할때 한줄 더 읽어와서 버퍼 오버플로가 뜨는 경험이 있었음. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 주식가격]]></title>
            <link>https://velog.io/@main_door/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A3%BC%EC%8B%9D%EA%B0%80%EA%B2%A9</link>
            <guid>https://velog.io/@main_door/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A3%BC%EC%8B%9D%EA%B0%80%EA%B2%A9</guid>
            <pubDate>Thu, 04 Mar 2021 08:13:17 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/main_door/post/42f010f2-6cfa-4573-bd0e-397aa8e3de63/image.png" alt=""></p>
<p>스택을 써도 되고, 큐를 써도 되고, 배열을 써도 되는 문제. 나는 머리속에서 가장 빨리 떠오른 방법으로 해결했다.</p>
<h4 id="해결-방법">해결 방법</h4>
<p>주식을 산 뒤, 기본적으로 1초는 보장된다. 그러니 time에 1값을 준뒤에 이중 for문으로 검사를 진행하면 된다.</p>
<h4 id="해결-코드">해결 코드</h4>
<pre><code>#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

vector&lt;int&gt; solution(vector&lt;int&gt; prices) {
    vector&lt;int&gt; answer;
    int i = 0;
    int j =0;
    int time = 0;
    while(i &lt; prices.size() -1)
    {
        j = i + 1;
        time = 1;
        while(j &lt; prices.size()-1)
        {
           if (prices[i] &gt; prices[j])
               break;
           time++;
           j++;
        }
        answer.push_back(time);
        i++;
    }
    answer.push_back(0);
    return answer;
}</code></pre><p>스택이나 큐로 진행해도 되는거지만, 기본적인 처리속도는 같기에.(큰 while문이 돌때마다 작은 while문의 반복이 1씩 줄어들기에, 스택과 큐의 처리구조와 크게 다를것이 없음)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 다리를 지나는 트럭]]></title>
            <link>https://velog.io/@main_door/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8B%A4%EB%A6%AC%EB%A5%BC-%EC%A7%80%EB%82%98%EB%8A%94-%ED%8A%B8%EB%9F%AD</link>
            <guid>https://velog.io/@main_door/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8B%A4%EB%A6%AC%EB%A5%BC-%EC%A7%80%EB%82%98%EB%8A%94-%ED%8A%B8%EB%9F%AD</guid>
            <pubDate>Thu, 04 Mar 2021 06:35:49 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/main_door/post/88253dad-c82a-4724-8f97-2387daa5eee7/image.png" alt=""></p>
<p>해당 문제는 큐 자료구조에 대한 기초적인 이해를 필요로합니다.</p>
<h4 id="큐-자료구조">큐 자료구조?</h4>
<p><img src="https://images.velog.io/images/main_door/post/d091c326-5c47-4743-ab3c-bbbfef730ace/image.png" alt="">
당신은 세금처리를 위해 은행에 와 있습니다. 대기표를 뽑고 먼저 온 사람들의 업무가 끝날때까지 기다렸다가, 전광판에 자신의 번호가 나와서야 업무를 처리할 수 있죠. 당신보다 늦게 온 사람이 먼저 불려나가는 일은 좀처럼 없습니다. 이처럼 먼저 들어온 것이 먼저 나가는 방식을 FIFO(First In First Out)라고 부르고, 이것의 대표격이 바로 큐(Queue)알고리즘입니다.</p>
<h4 id="문제의-해결-순서">문제의 해결 순서.</h4>
<p>저는 문제의 순서를 3단계로 나누었습니다
1.트럭이 존재한다면, 모든 트럭을 한칸씩 땡긴다.
2.만약 다리에 트럭이 존재하지 않고, 대기 트럭이 없을 경우 진행된 시간을 리턴.
3.다리에 존재한느 모든 트럭의 무게 + 대기 트럭의 첫번째의 무게가 다리의 무게제한보다 같거나 작을 경우, 맨 앞에 있는 대기트럭을 다리에 올림.</p>
<p>이것을 반복하는 것으로 문제를 해결했습니다.</p>
<h4 id="문제의-해결-코드">문제의 해결 코드</h4>
<pre><code>#include &lt;string&gt;
#include &lt;vector&gt;

using namespace std;

bool on_truck(vector&lt;int&gt; bridge)//트럭이 올라와있는지 검사
{
    int i = 0;
    while (i &lt; bridge.size())
    {
        if (bridge[i] &gt; 0)
            return true;
        i++;
    }
    return false;
}

void move_truck(vector&lt;int&gt;* bridge)//트럭을 한칸씩 땡기는 함수.
{
    int i = 0;
    while (i &lt; bridge-&gt;size() - 1)
    {
        (*bridge)[i] = (*bridge)[i + 1];
        i++;
    }
    (*bridge)[i] = 0;
}
int on_truck_weight(vector&lt;int&gt; bridge)//다리에 있는 모든 트럭의 무게를 리턴.
{
    int i = 0;
    int weight = 0;
    while (i &lt; bridge.size())
    {
        weight += bridge[i];
        i++;
    }
    return weight;
}

int solution(int bridge_length, int weight, vector&lt;int&gt; trucks) {
    int answer = 0;
    int time = 0;
    vector&lt;int&gt; bridge(bridge_length);
    while (true)
    {
        if (on_truck(bridge))
            move_truck(&amp;bridge);
        else if (trucks.size() &lt; 1)
            return time;
        if (trucks.size() &gt; 0 &amp;&amp; (on_truck_weight(bridge) + trucks.front()) &lt;= weight)
        {
            bridge.back() = trucks.front();
            trucks.erase(trucks.begin());
        }
        time++;
    }
    return time;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[ft_printf %cspc처리]]></title>
            <link>https://velog.io/@main_door/ftprintf-cspc%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@main_door/ftprintf-cspc%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Wed, 06 Jan 2021 11:19:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/main_door/post/d289deb7-5889-4daf-905e-e5f13b935f05/image.png" alt=""></p>
<p>type %,c,s는 처리가 그렇게 어렵지 않아, 넘어가도록 한다.</p>
<h3 id="type-p의-처리">type P의 처리.</h3>
<p>p옵션은 들어온 포인터 변수의 주소를 16진수로 변환시켜 보여주는 타입이다. 이를 처리하기 위해 매개변수로 받은 가변인자를 long long자료형으로 변환시켜 사용한다. 사실상 방법은 그렇게 어렵지 않다. 기존에 정수형 10진수를 16진수로 변형시키는 x옵션이 있는데, 자료형만 바꿔 그 똑같이 문자열을 처리해주면 된다.</p>
<pre><code>int            ft_print_type_pointer(t_format *t_form, va_list *va)
{
    char        *str;
    long long    p;
    int            i;

    i = 0;
    ft_putstr_fd(&quot;0x&quot;,1);//앞에 기본적으로 붙는 문자
    str = ft_lltoh((long long)va_arg(*va, long long));
    while (i &lt; 12)
    {
        ft_putchar_fd(str[i],1);
        i++;
    }
    free(str);
    return (14);//%p가 리턴하는 문자열은 0x + 12개의 16진수로 항상 14개이다.
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[ft_printf 형식지정자 xX처리.]]></title>
            <link>https://velog.io/@main_door/ftprintf-%ED%98%95%EC%8B%9D%EC%A7%80%EC%A0%95%EC%9E%90-xX%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@main_door/ftprintf-%ED%98%95%EC%8B%9D%EC%A7%80%EC%A0%95%EC%9E%90-xX%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Tue, 05 Jan 2021 13:33:03 GMT</pubDate>
            <description><![CDATA[<p>printf에는 16진수를 출력하는 서식지정자x,X가 있다.(x는 출력시 소문자, X는 대문자)
이를 똑같이 처리하기 위해 itoh라는 함수를 따로 작성해야했다.</p>
<pre><code>//unit은 서식지정자의 문자-23의 값. 어차피 x,X밖에 들어올 것이 없기 떄문에 거기서
//-23을 해주면 a또는 A가 나오게 된다.
char        *ft_itoh(unsigned int n, char unit)
{
    int        len;
    char    *c;

    len = ft_ulen(n, 16);//16진수로 변환할 숫자의 길이를 얻는 함수. 뒤에 붙는것은
      //10진법, 8진법에서도 사용할 수 있도록 몇진법인지를 명시해놓도록 했다.
    c = (char *)ft_calloc(len + 1, 1);
    if (c == NULL)
        return (0);
    c[len] = &#39;\0&#39;;
    len--;
    while (len &gt;= 0)
    {
        if (n % 16 &lt; 10)
            c[len] = &#39;0&#39; + n % 16;//0~9
        else
            c[len] = unit + ((n % 16) - 10);//a~f,A~F
        len--;
        n /= 16;
    }
    return (c);
}</code></pre><p><img src="https://images.velog.io/images/main_door/post/34ad144d-2b5b-4745-b69c-46be1d7ec95c/image.png" alt="">
<img src="https://images.velog.io/images/main_door/post/d6bf64e4-c5e1-4275-9fdc-b040815ad20b/image.png" alt="">
잘 나오고 있다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[가변 인자]]></title>
            <link>https://velog.io/@main_door/%EA%B0%80%EB%B3%80-%EC%9D%B8%EC%9E%90</link>
            <guid>https://velog.io/@main_door/%EA%B0%80%EB%B3%80-%EC%9D%B8%EC%9E%90</guid>
            <pubDate>Fri, 04 Dec 2020 07:42:27 GMT</pubDate>
            <description><![CDATA[<h3 id="시작-하기-전">시작 하기 전...</h3>
<p>보통 우리가 쓰는 함수들은 매개변수의 개수가 정해져있어, 지정한 개수와 다른 인자를 넣게되면 오류를 뿜어낸다. 그렇다면 하나에 의문이 든다. 우리가 평소에 자주쓰는 printf또한 함수인데, 이는 어떻게 각종 타입의 변수를, 개수에 상관없이 넣을 수 있는 것인가? </p>
<p>그 해답은 바로 <strong>가변 인자</strong>에 있다.</p>
<h3 id="가변-인자variable-argument란">가변 인자(variable argument)란?</h3>
<p>가변 인자는 이름 그대로, 변할 수 있는 인자란 뜻이다. 아래 코드를 보자.</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;stdarg.h&gt;

void    PrintNumbers(int argc, ...)
{
    va_list ap;
    int     i;

    va_start(ap, argc);
    for (i = 0; i &lt; argc; i++)
    {
        printf(&quot;%d &quot;, va_arg(ap, int));
    }
    printf(&quot;\n&quot;);
    va_end(ap);
}

int main()
{

    PrintNumbers(1, 10);
    PrintNumbers(2, 10, 100);
    PrintNumbers(3, 10, 100, 1000);
    PrintNumbers(4, 10, 100, 1000, 10000);

    return 1;
}</code></pre><p><img src="https://images.velog.io/images/main_door/post/be100428-7362-4f73-bc1e-a843400eeaef/image.png" alt=""></p>
<h2 id="가변-인자-매크로">가변 인자 매크로</h2>
<p>va_start, va_arg, va_end얘네들에 대해 설명하기 전에 짚고 넘어갈 것은, 얘네들은 함수가 아닌 매크로라는 것이다. 비주얼 스튜디오에서는 함수를 노란색, 매크로를 보라색으로 표시하는데 이미지를 보면 가변 인자 관련된 녀석들은 모두 보라색인걸 알 수 있다.
<img src="https://images.velog.io/images/main_door/post/f29f9173-626f-4c1f-932f-8218c3c24aef/image.png" alt=""></p>
<blockquote>
<p>va_start(ap,마지막 고정 인수)</p>
</blockquote>
<p>이 명령은 가변 인수를 읽기 위한 준비를 하는데, ap가 첫번째 가변 인수를 가리키도록 초기화한다. 여기서 마지막 고정 인수라고 한 이유는 va_start내부에서 ap가 마지막 고정 인수 다음부터 가변 인수를 읽을 수 있기 때문이다.</p>
<blockquote>
<p>va_arg(ap, 인수타입)</p>
</blockquote>
<p>가변 인수를 실제로 읽어오는 매크로. va_start가 ap를 첫번째 가변 인수 번지로 맞춰주기 때문에, ap위치에 있는 값을 읽기만 하면 된다. 단, 인자로 들어온 값이 어떤 타입인지를 명시해주어야 이 매크로가 값을 제대로 읽을 수 있기에 두번째 인수로 읽고자 하는 값의 타입을 지정해준다. 변수의 타입을 매개로 전달할 수 있는 이유는 이가 매크로이기 때문이다. 내부적으로 sizeof연산자와 캐스트 연산자로 전달되기 때문에 타입명이 될 수 있다.
<img src="https://images.velog.io/images/main_door/post/a867f63e-6906-4197-8b44-906d1ab82a52/image.png" alt="">
저렇게말이다.</p>
<blockquote>
<p>va_end(ap)</p>
</blockquote>
<p>가변인수를 읽는 것을 마치겠다는 명령. read후 close를 해주는 것과 비슷하다고 보면 된다.</p>
<h3 id="가변-인수-함수의-조건">가변 인수 함수의 조건</h3>
<p>가변 인수를 활용한 함수를 제대로 작성하기 위해선 몇가지 조건이 필요하다.</p>
<p>1.가변 인수 함수는 반드시 하나 이상의 고정 인수를 가져야 한다. 왜냐면 가변 인수를 읽기 위한 포인터 ap를 초기화 하기 위해서 마지막 고정 인수의 번지를 알아야 하기 때문이다.</p>
<p>2.함수 내부에서 자신에게 전달된 가변 인수의 개수를 알 수 있도록 해야한다. 전달될 수 있는 인수의 개수에는 제한이 없으며 컴파일러는 함수가 호출될 때 인수의 개수를 점검하지 않는다. 그렇기때문에 호출하는 쪽에서 가변 인수의 개수를 알려주지 않으면 함수 내부에서는 인수의 개수를 알 수 있는 방법이 없다. 함수에서 인수의 갯수를 알 수 있도록 호출쪽에서 정보를 제공해야한다.</p>
<p>3.함수의 개수와 마찬가지로 가변 인수의 타입 또한 알 수 있어야한다. 2,3번을 대표적으로 보여주는것이 바로 printf인데, 예를 들어</p>
<pre><code>printf(&quot;%s %d&quot;,&quot;HELLO WORLD!!!&quot;,15);</code></pre><p>구문을 보면, 우리는 첫번째 인수에서 2개의 변수를 받고, 각각 문자열과 정수형 타입의 변수가 순서대로 들어간다는 정보를 함수에게 알려준 것이다.</p>
<p>참고한 자료 및 사이트</p>
<p><a href="https://aossuper8.tistory.com/17">C언어 가변인자</a>
<a href="https://dojang.io/mod/page/view.php?id=577">코딩도장</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[네트워크 ip와 클래스, 서브넷마스크]]></title>
            <link>https://velog.io/@main_door/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-ip%EC%99%80-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%84%9C%EB%B8%8C%EB%84%B7%EB%A7%88%EC%8A%A4%ED%81%AC</link>
            <guid>https://velog.io/@main_door/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-ip%EC%99%80-%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%84%9C%EB%B8%8C%EB%84%B7%EB%A7%88%EC%8A%A4%ED%81%AC</guid>
            <pubDate>Wed, 25 Nov 2020 11:01:01 GMT</pubDate>
            <description><![CDATA[<p>iP주소란? (Internet Protocol)
호스트(장치)를 식별하는 32비트 숫자이다.간단하게 말해, 각 장치들의 주민등록번호라고 생각하면 된다.
ip주소는 보통 네 개의 영역이 점으로 분리된 십진수 형식으로 표현된다.예시) 192.168.219.1원래는 2진수 8자리의 4묶음(여기서 한 섹션의 단위를 옥텟이라 부른다)이지만, 알아보기가 불편해서이를 10진수로 변환한 것이다.
IP의 클래스IP를 클래스로 나누는 이유?하나의 네트워크에서 몇개의 호스트IP를 가질 수 있느냐를 나누기 위해 존재하는 것.</p>
<p><img src="https://t1.daumcdn.net/cfile/tistory/99068D495BE8101D34" alt="img">
A클래스 -&gt; 1<del>126까지의 값을 사용할 수 있음.(127은 제외됨)
B클래스 -&gt;128 ~ 191.255.255.255까지 쓸 수 있음.
C클래스 -&gt;192</del>223.255.255.255까지 쓸 수 있음.
참고 : 네트워크에서 0은 호스트 부분이라는 뜻
호스트 주소가 가질 수 있는 값은? 네트워크 주소를 뺀 나머지의 -2 이다.예를 들어, C클래스의 호스트주소가 가질 수 있는 최대 개수는 2의 8승 -2이다.-2가 빠지는 이유는, 호스트의 모든 값이 1일 경우 브로드캐스트, 0일 경우 네트워크 주소로 사용하기 때문.
<img src="file:///C:/Users/Mgh/AppData/Local/Temp/enhtmlclip/Image(2).png" alt="img"><img src="data:image/png;base64,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" alt="img">
왜 필요한가?컴퓨터의 경우 각각 사용하는 운영체제가 달랐고, 프로그램의 경우 , 저마다 구현된 언어가 다르기 때문에, 이들이 서로 통신할 수 있는 공통된 프로토콜이 필요했다. 1960년대에는 저마다 다른 프로토콜을 사용하고 있었고, 다른 회사의 장비와는 통신이 힘들거나, 불가능했다. 이 때문에 국제표준화기구에서 1977년에 OSI 7계층 모델을 발표한다.
OSI 7계층 모델에서, 3계층(네트워크 계승)에 위치하는 프로토콜이다.</p>
<p>호스트에서 호스트까지의 통신(즉, 보내는 컴퓨터와 받는 컴퓨터까지의 통신)을 책임진다. 
간단하게 설명하면, 편지 봉투에 보내는 주소, 받는 주소를 작성하고 우표를 붙여서 우체통에 넣는 일과, 우편함에 들어온 편지를 꺼내서 나한테 온 편지가 맞는지 확인하는 정도의 작업이라고 생각하면 된다.</p>
<p>서브네팅이란?
네트워크의 관리자가 네트워크 성능을 향상시키기 위해 자원을 효율적으로 분배하는 것을 말한다.여기서 효율적으로 분배한다는 것은, 네트워크의 영역과 호스트 영역을 분할하는 것.
너무 큰 브로드캐스트 도메인은 네트워크 환경에서 패킷전송을 느리게하고, 성능을 저하시킨다. 따라서 네트워크를 쪼개성능을 보장하는 것을 의미함.</p>
<p>요약하자면 
서브네팅 : 네트워크를 성능 항샹 및 자원의 효율적 분배를 위해, 네트워크 영역과 호스트 영역을 쪼개는 작업.
ip : ip는 32자리로 이루어진 2진수, ip는 네트워크 영역과 호스트 영역으로 구성됨, 동일한 네트워크 내에서, 호스트 ip는 각자 달라야한다.
즉, 어떤 기관에서 배정받은 하나의 네트워크 주소를 다시 여러개의 작은 네트워크로 나누어 효율적이게 사용하는 방식을 말한다.</p>
<p>넷마스크, 서브넷 마스크란?
네트워크 내의 주소에 해당하는 IP 주소 중 네트워크를 식별하기 위해 몇 비트를 네트워크 주소에 사용할 지 정의하는 것이다.(마스킹)네트워크 ID부분과 호스트 ID부분을 구별해준다.
마스킹은 
주의 : 서브넷 마스크는 1과 0으로 이루어져 있다. 중요한 것은, 여기서 1이 연속적으로 이뤄져야 한다는 것이다.예를 들어1111 = O1110 = O1001 = X0101 = X
서브넷 마스크는 ip의 뒤에 붙일 수 있다예를 들어 192.168.219.1/24 라고 하면, 이는 C클래스이고 디폴트 마스크는 255.255.255.0이다. ip의 /뒤에 붙는 숫자는바로 이 마스크의 1의 개수를 적어놓은 것. 만약 마스크가 255.255.255.128이라면 192.168.219.1/25가 된다.
<img src="file:///C:/Users/Mgh/AppData/Local/Temp/enhtmlclip/Image(3).png" alt="img"><img src="data:image/png;base64,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" alt="img">위 이미지처럼, cmd에서 ifconfig를 치면 서브넷 마스크가 나온다.이는 192.168.219.1~192.168.219.255까지(255는 브로드캐스트 도메인) 곧 해당 서브넷의 네트워크란 뜻이다. 별개의 서브넷마스크를 생성하지 않아도, 기본적으로 적용되어 있는 것이 기본 서브넷마스크이고, 기본 서브넷마스크로 쪼개진 네트워크 주소를 서브넷 네트워크라고 한다.즉ip = 192.168.219.100서브넷 마스크 : 255.255.255.0서브넷 네트워크 : 192.168.219.0저 두개를 and연산하여 나온것이 아래 서브넷 네트워크라고 할 수 있다.</p>
]]></description>
        </item>
    </channel>
</rss>