<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>matcha_.log</title>
        <link>https://velog.io/</link>
        <description>https://k-ang.tistory.com/ 이전했어요</description>
        <lastBuildDate>Tue, 28 Jun 2022 09:01:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. matcha_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/matcha_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Spring] 하도하도 헷갈려서 내가올리는 JSP에서 UTF-8 변경 방법]]></title>
            <link>https://velog.io/@matcha_/Spring-%ED%95%98%EB%8F%84%ED%95%98%EB%8F%84-%ED%97%B7%EA%B0%88%EB%A0%A4%EC%84%9C-%EB%82%B4%EA%B0%80%EC%98%AC%EB%A6%AC%EB%8A%94-JSP%EC%97%90%EC%84%9C-UTF-8-%EB%B3%80%EA%B2%BD-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@matcha_/Spring-%ED%95%98%EB%8F%84%ED%95%98%EB%8F%84-%ED%97%B7%EA%B0%88%EB%A0%A4%EC%84%9C-%EB%82%B4%EA%B0%80%EC%98%AC%EB%A6%AC%EB%8A%94-JSP%EC%97%90%EC%84%9C-UTF-8-%EB%B3%80%EA%B2%BD-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 28 Jun 2022 09:01:12 GMT</pubDate>
            <description><![CDATA[<p>어떻게 JSP를 UTF-8로 설정하는 방법은 할 때마다 헷갈려서 찾아보게 되는걸까??
또 헷갈릴 때 더 이상 찾아보러 다니지 말고 여기와서 설정하자 <del>,.</del></p>
<p>근데 왜 EUC-KR은 쓰면 깨지는 걸까?</p>
<p><strong>EUC-KR</strong></p>
<ul>
<li>ASCII 인코딩 방식의 확장<ul>
<li>ASCII 인코딩 방식은 원래 영어만 고려한 1byte 길이의 인코딩 방식</li>
<li>한글을 사용할 수 있도록 만든 2byte 길이의 국가 언어 코드</li>
</ul>
</li>
</ul>
<p>하지만 이 EUC-KR 방식은 <strong>우리나라에서만</strong> 쓸 수 있도록 만든 코드.
<strong>공통으로 사용되는 인코딩 방식이 아니므로 다른 환경에서는 한글이 깨지는 경우가 발생</strong>한다.
이를 해결하기 위해 새롭게 개발된 인코딩 방식이 UTF-8
용량이 더 작은 EUC-KR 방식을 선호하는 곳도 많았지만,
현재는 용량보다는 <strong>글로벌 환경</strong>을 고려해야 하므로 UTF-8을 많이 쓴다.</p>
<p><strong>UTF-8</strong></p>
<ul>
<li>한글을 지원하는 3byte 크기의 국가 언어 코드</li>
</ul>
<p>출처:<a href="https://suzxc2468.tistory.com/180">https://suzxc2468.tistory.com/180</a></p>
<hr>
<h3 id="방법은">방법은</h3>
<p>Windows &gt; Preferences 에서
encod까지만 검색하면 나오는 아이들이 있다.
이 아이들에서 ISO-8859~~ 이거나 EUC-KR 로 설정되어 있는 모든 아이들을
UTF-8로 변경해주면 된다.
(참고로 UTF-8은 ISO-10646/Unicode)</p>
<p>정리</p>
<ol>
<li>Windows &gt; Preferences 에서 encod까지만 검색</li>
<li>General</li>
</ol>
<ul>
<li>Content Types &gt; <strong>Java Class File</strong> : UTF-8 하고 Update</li>
<li>Content Types &gt; Text &gt; <strong>JSP</strong>/<strong>XML</strong>/<strong>JavaPropertyFiles</strong> : UTF-8 하고 Update</li>
<li><strong>Workspace</strong>에서 UTF-8 하고 Update </li>
</ul>
<ol start="3">
<li>Web</li>
</ol>
<ul>
<li><strong>CSS</strong> : UTF-8 하고 Update</li>
<li><strong>HTML</strong> : UTF-8 하고 Update</li>
<li><strong>JSP</strong> : UTF-8 하고 Update</li>
</ul>
<p>총 8개를 UTF-8로 설정해줘야함.</p>
<p>이렇게 해줬는데도 JSP 파일은 UTF-8로 변경될 생각을 안한다.
<img src="https://velog.velcdn.com/images/matcha_/post/8ff3fc4d-d59d-4e7f-9a1b-e76ea74d0ae3/image.png" alt=""></p>
<p>알고보니......
위의 방법은 <strong>파일을 생성하기 전 초기 셋팅 작업</strong>이었던 것.
<strong>이미 생성한 프로젝트에 대해서 UTF-8로 변경하는 방법</strong>은
Alt + Enter &gt; Resources &gt; Others를 UTF-8로 변경
<img src="https://velog.velcdn.com/images/matcha_/post/dcdc0bd6-edac-4038-bdfe-972fe0611767/image.png" alt=""></p>
<p>이미 만들어놓은 파일의 인코딩 방식을 UTF-8로 변경하면
<img src="https://velog.velcdn.com/images/matcha_/post/47b1e8d5-d471-4a1e-acab-a1ea38e2b23a/image.png" alt="">
이처럼 다 깨진다는 부작용이 있다.</p>
<h4 id="미리-백업해두자"><strong>미리 백업해두자</strong></h4>
<p>출처 : <a href="https://yakongs.tistory.com/entry/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90-UTF-8-%EC%9D%B8%EC%BD%94%EB%94%A9-%EC%84%A4%EC%A0%95-%EC%9D%B8%EC%BD%94%EB%94%A9-%EB%B3%80%EA%B2%BD">https://yakongs.tistory.com/entry/%EC%9D%B4%ED%81%B4%EB%A6%BD%EC%8A%A4Eclipse-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90-UTF-8-%EC%9D%B8%EC%BD%94%EB%94%A9-%EC%84%A4%EC%A0%95-%EC%9D%B8%EC%BD%94%EB%94%A9-%EB%B3%80%EA%B2%BD</a></p>
<hr>
<p>참고 : <a href="https://sayit.tistory.com/entry/UTF8-for-Eclipse">https://sayit.tistory.com/entry/UTF8-for-Eclipse</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] 간단한 게시판 프로젝트를 만들어 봅시다]]></title>
            <link>https://velog.io/@matcha_/Spring-%EA%B0%84%EB%8B%A8%ED%95%9C-%EA%B2%8C%EC%8B%9C%ED%8C%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4</link>
            <guid>https://velog.io/@matcha_/Spring-%EA%B0%84%EB%8B%A8%ED%95%9C-%EA%B2%8C%EC%8B%9C%ED%8C%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-%EB%A7%8C%EB%93%A4%EC%96%B4-%EB%B4%85%EC%8B%9C%EB%8B%A4</guid>
            <pubDate>Tue, 28 Jun 2022 08:40:26 GMT</pubDate>
            <description><![CDATA[<p>간단한 게시판을 만들어보자</p>
<p>개발환경은
프레임워크 : 스프링
언어 : java jdk1.8
DB : MySQL
DB연동은</p>
<ol>
<li>프레임워크 없이 연동</li>
<li>MyBatis로 변경</li>
<li>JPA로 변경</li>
</ol>
<hr>
<h2 id="1-프레임워크-없이-연동">1. 프레임워크 없이 연동</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[C언어에서 EOF]]></title>
            <link>https://velog.io/@matcha_/C%EC%96%B8%EC%96%B4%EC%97%90%EC%84%9C-EOF</link>
            <guid>https://velog.io/@matcha_/C%EC%96%B8%EC%96%B4%EC%97%90%EC%84%9C-EOF</guid>
            <pubDate>Tue, 05 Apr 2022 10:45:42 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-c">while(fgets(str, sizeof(str),stdin) != NULL)</code></pre>
<p>fgets : 문자열 공백포함 입력</p>
<p>문자열 공백포함 입력방법</p>
<ol>
<li>scanf(&quot;%[^\n]s&quot;, str);</li>
<li>fgets(str, sizeof(str), stdin);</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 10451 순열사이클 C언어 (BFS, DFS)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-10451-%EC%88%9C%EC%97%B4%EC%82%AC%EC%9D%B4%ED%81%B4-C%EC%96%B8%EC%96%B4-BFS-DFS</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-10451-%EC%88%9C%EC%97%B4%EC%82%AC%EC%9D%B4%ED%81%B4-C%EC%96%B8%EC%96%B4-BFS-DFS</guid>
            <pubDate>Thu, 31 Mar 2022 15:35:33 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

int N; /* 순열의 크기 */

void DFS(int start, int *arr, int *visited);

int main()
{
    int K;
    int idx;
    int cnt;
    scanf(&quot;%d&quot;, &amp;K);
    while (K--)
    {
        /* 순열 크기 입력 */
        scanf(&quot;%d&quot;, &amp;N);

        /* 순열 생성 */
        int *arr = (int *)malloc(sizeof(int) * (N + 1));
        /* 방문기록 생성 */
        int *visited = (int *)malloc(sizeof(int) * (N + 1));

        /* 순열에 값 넣어주기 */
        idx = 1;
        while (idx &lt;= N)
        {
            scanf(&quot;%d&quot;, &amp;arr[idx]);
            idx++;
        }

        /* 사이클 개수 찾으러 가자 */
        cnt = 0;
        idx = 1;
        while (idx &lt;= N) /* 빠지는 노드 없이 방문하기 위함 */
        {
            if (visited[idx] == 0)
            {
                DFS(idx, arr, visited);
                cnt++;
            }
            idx++;
        }
        printf(&quot;%d\n&quot;, cnt);
    }
}

void DFS(int start, int *arr, int *visited)
{
    visited[start] = 1;
    /* 방향이 있고, 연결 노드는 단 1개 뿐이므로
        연결노드 여러개를 신경쓸 때 쓰는 while을 써주지 않아도 된다. */
    if (visited[arr[start]] == 0)
    {
        DFS(arr[start], arr, visited);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 1260 DFS와 BFS C언어 (BFS, DFS)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80-BFS-C%EC%96%B8%EC%96%B4-BFS-DFS</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80-BFS-C%EC%96%B8%EC%96%B4-BFS-DFS</guid>
            <pubDate>Thu, 31 Mar 2022 15:34:43 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt; /* malloc */
#include &lt;string.h&gt; /* memset */
//int arr[1001][1001];
//int visited[1001];
int queue[1001]; /* queue 이름의 배열 생성 */
int N;             /* 정점 개수 */
int M;             /* 간선 개수 */

/* DFS */
void DFS(int start, int** arr, int* visited)
{
    visited[start] = 1;
    printf(&quot;%d &quot;, start); /* 방문한점 출력 */
    int idx;
    idx = 1;
    while (idx &lt;= N)
    {
        if (arr[start][idx] == 1 &amp;&amp; visited[idx] == 0)
        {
            DFS(idx, arr, visited);
        }
        idx++;
    }
}

/* BFS */
void BFS(int start, int** arr, int* visited)
{
    visited[start] = 1;
    printf(&quot;%d &quot;, start);
    int idx;
    int front;
    int rear;
    int pop;
    front = 0;
    rear = 1;
    queue[front] = start;
    while (front &lt; rear)
    {
        pop = queue[front];
        idx = 0;
        while (idx &lt;= N)
        {
            if (arr[pop][idx] == 1 &amp;&amp; visited[idx] == 0)
            {
                visited[idx] = 1;
                printf(&quot;%d &quot;, idx);
                queue[rear] = idx;
                rear++;
            }
            idx++;
        }
        front++;
    }
}

int main()
{
    int V; /* 시작정점 번호 */
    int idx;
    int n;
    int v;
    scanf(&quot;%d %d %d&quot;, &amp;N, &amp;M, &amp;V);

    /* 인접행렬 동적할당 &amp; 초기화 - 메모리크기를 정해주고 선언해야하는 배열에 비해 메모리 낭비를 줄일 수 있다.*/
    int **  arr = (int **) malloc(sizeof(int)*(N+1));
    idx = 0;
    while (idx &lt;= N)
    {
        arr[idx] = (int *)malloc(sizeof(int*)*(N+1));
        int idx2 = 1;
        while (idx2 &lt;= N)
        {
            arr[idx][idx2] = 0;
            idx2++;
        }
        idx++;
    }

    /* 방문기록 동적할당 &amp; 초기화 */
    int * visited = (int*) malloc(sizeof(int)*(N+1));
    memset(visited, 0, sizeof(int)*(N+1));

    /* 요소 입력 */
    idx = 1;
    while (idx &lt;= M)
    {
        scanf(&quot;%d %d&quot;, &amp;n, &amp;v);
        arr[n][v] = 1;
        arr[v][n] = 1;
        idx++;
    }

    /* DFS로 탐색 */
    DFS(V, arr, visited);
    /* 초기화 */
    memset(visited, 0, sizeof(int)*(N+1));
    printf(&quot;\n&quot;);
    /* BFS로 탐색 */
    BFS(V, arr, visited);

    /* 동적할당 해제 */
    /*idx = 0;
    while (idx &lt; N)
    {
        free(arr[idx]);
        idx++;
    }*/
    free(arr);
    free(visited);
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 11724 연결요소의 개수 C언어 (BFS, DFS)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-11724-%EC%97%B0%EA%B2%B0%EC%9A%94%EC%86%8C%EC%9D%98-%EA%B0%9C%EC%88%98-C%EC%96%B8%EC%96%B4-BFS-DFS</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-11724-%EC%97%B0%EA%B2%B0%EC%9A%94%EC%86%8C%EC%9D%98-%EA%B0%9C%EC%88%98-C%EC%96%B8%EC%96%B4-BFS-DFS</guid>
            <pubDate>Thu, 31 Mar 2022 15:33:41 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt; /* malloc */
#include &lt;string.h&gt; /* memset */

int N; /* 노드 개수 */
int M; /* 간선 개수 */

void DFS(int start, int ** arr, int * visited);
void BFS(int start, int ** arr, int * visited);

int main()
{
    int idx;
    int u;
    int v;
    int cnt; /* 연결 요소 개수 */
    int **arr;      /* 그래프 */
    int *visited; /* 방문기록 */

    scanf(&quot;%d %d&quot;, &amp;N, &amp;M);

    /* 인접행렬 동적할당 */
    arr = (int **)malloc(sizeof(int) * (N + 1));
    idx = 0; /* 0부터 할당해줘야한다!!! 1부터 할당하면 오류남*/
    while (idx &lt;= N)
    {
        arr[idx] = (int *)malloc(sizeof(int*) * (N + 1));
        /* 초기화 */
        int idx2;
        idx2 = 0;
        while (idx2 &lt;= N)
        {
            arr[idx][idx2] = 0;
            idx2++;
        }
        idx++;
    }

    /* 방문기록 동적할당 */
    visited = (int *)malloc(sizeof(int) * (N + 1));
    memset(visited, 0, sizeof(int) * (N + 1));

    /* 요소 입력 */
    idx = 0;
    while (idx &lt; M)
    {
        scanf(&quot;%d %d&quot;, &amp;u, &amp;v);
        arr[u][v] = 1;
        arr[v][u] = 1;
        idx++;
    }

    /* DFS &amp; BFS 각각 주석해서 실행 */
    /* 빠짐없이 탐색하기 위해 노드 1부터 N까지 다 돌려봄 */
    idx = 1;
    cnt = 0;
    while (idx &lt;= N)
    {
        if (visited[idx] == 0)
        {
            //DFS(idx, arr, visited);
            BFS(idx, arr, visited);
            cnt++;
        }
        idx++;
    }
    /* 연결요소 개수 */
    printf(&quot;%d&quot;, cnt);

    /* 할당 해제 */
    //free(visited);
    //free(arr);
}

void DFS(int start, int **arr, int *visited)
{
    /* 방문기록 남김 */
    visited[start] = 1;
    /* 인접 노드 탐색하러 감 */
    int idx;
    idx = 1;
    while (idx &lt;= N)
    {
        if (arr[start][idx] == 1 &amp;&amp; visited[idx] == 0)
        {
            DFS(idx, arr, visited);
        }
        idx++;
    }
}

void BFS(int start, int **arr, int *visited)
{
    /* 방문기록 표시 */
    visited[start] = 1;
    /* 큐 생성 */
    int *queue;
    queue = (int *)malloc(sizeof(int) * (N+1));
    int front;
    int rear;
    int pop;
    /* 큐에 시작값 넣어주고 탐색 시작 */
    front = 0;
    rear = 1;
    queue[front] = start;

    int idx;
    while (front &lt; rear) /* 큐 원소 다 방문할 때까지 반복 */
    {
        idx = 1;
        /* 맨 앞에 원소 pop 예정 */
        pop = queue[front]; 
        /* 맨 앞에 원소와 인접한 노드 모두 큐에 넣어줌 */
        while (idx &lt;= N)
        {
            if (arr[pop][idx] == 1 &amp;&amp; visited[idx] == 0)
            {
                visited[idx] = 1;
                queue[rear] = idx;
                rear++;
            }
            idx++;
        }
        front++;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[C언어 2차원배열 동적할당]]></title>
            <link>https://velog.io/@matcha_/C%EC%96%B8%EC%96%B4-2%EC%B0%A8%EC%9B%90%EB%B0%B0%EC%97%B4-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9</link>
            <guid>https://velog.io/@matcha_/C%EC%96%B8%EC%96%B4-2%EC%B0%A8%EC%9B%90%EB%B0%B0%EC%97%B4-%EB%8F%99%EC%A0%81%ED%95%A0%EB%8B%B9</guid>
            <pubDate>Mon, 28 Mar 2022 04:16:24 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-c">char *str = malloc(sizeof(char) * 1000);
    memset(str, &#39;0&#39;, sizeof(char) * 1000);
    scanf(&quot;%s&quot;, str);
    int idx = 0;
    int cnt = 0;</code></pre>
<br/>
<br/>

<pre><code class="language-c">/* 문자열 길이 카운트 */
    while (idx &lt;= 1000)
    {
        if (str[idx] != &#39;0&#39;)
        {
            cnt++;
        }
        else
        {
            break;
        }
        idx++;
    }
    cnt--;</code></pre>
<pre><code class="language-c">    /* 동적할당 */
    char **tails = (char**)malloc(sizeof(char*) * cnt); /* 높이동적할당 */
    idx = 0;
    while (idx &lt; cnt) /* 너비동적할당 */
    {
        tails[idx] = (char*)malloc(sizeof(char) * cnt);
        idx++;
    }</code></pre>
<pre><code class="language-c">    /* 값넣어주기 */
    idx = 0;
    while(idx &lt; cnt)
    {
        int idx2 = idx;
        while(idx2 &lt; cnt)
        {
            tails[idx][idx2] = str[idx2];
            idx2++;
        }
        idx++;
    }</code></pre>
<pre><code class="language-c">    /* 배열 출력 */
    idx = 0;
    while(idx &lt; cnt)
    {
        int idx2 = idx;
        while(idx2 &lt; cnt)
        {
            //printf(&quot;%c&quot;, tails[idx][idx2]);
            write(1, &amp;tails[idx][idx2], 1);
            idx2++;
        }
        idx++;
        write(1, &quot;\n&quot;, 1);
    }</code></pre>
<pre><code class="language-c">    /* 동적 할당 해제 */
    idx = 0;
    while(idx &lt; cnt)
    {
        free(tails[idx]);
        idx++;
    }
    free(tails);</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Windows에서 리눅스 명령어 사용하기 (WSL)]]></title>
            <link>https://velog.io/@matcha_/Windows%EC%97%90%EC%84%9C-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-WSL</link>
            <guid>https://velog.io/@matcha_/Windows%EC%97%90%EC%84%9C-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-WSL</guid>
            <pubDate>Wed, 23 Mar 2022 02:39:34 GMT</pubDate>
            <description><![CDATA[<p>Windows에서 리눅스 명령어 사용하려면 여러가지 방법이 있다.
그 중 WSL를 사용했다.</p>
<p>순서는</p>
<ol>
<li>WSL 설치</li>
<li>환경설정</li>
<li>WSL용 리눅스배포판 설치</li>
</ol>
<p><strong>1. WSL 설치</strong>
마이크로소프트 스토어(Microsoft store)에서
terminal 검색 후 windows terminal 설치</p>
<p><strong>2. 환경설정</strong>
windows terminal을 관리자 권한으로 실행 후</p>
<pre><code class="language-c">dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart</code></pre>
<pre><code class="language-c">dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart</code></pre>
<p>두 명령어를 실행해준다.<br><img src="https://images.velog.io/images/matcha_/post/7f8a408e-e0d8-4214-a526-2857ff5097d1/image.png" alt=""></p>
<p>WSL을 관리하기 위해서는 wsl 명령어를 사용해야하는데 동작하지 않는다.
재부팅을 해준다.
<img src="https://images.velog.io/images/matcha_/post/e3cffaac-9480-4e2a-b216-c550b6433bf9/image.png" alt=""></p>
<p><strong>3. WSL용 리눅스 배포판을 설치</strong>
WSL을 사용하려면 리눅스 배포판이 있어야한다.
또 마이크로소프트 스토어에서
우분투를 검색한다.
<img src="https://images.velog.io/images/matcha_/post/5913374f-6469-4228-841a-6d28c453e122/image.png" alt=""></p>
<p>설치한다.
설치가 완료되면 우분투를 실행한다.</p>
<p><img src="https://images.velog.io/images/matcha_/post/0d4dbd15-23f3-46f9-bbba-0db974c7bea2/image.png" alt="">
꽤 오래걸린다.</p>
<p><img src="https://images.velog.io/images/matcha_/post/c255b9f0-4b4c-40f7-a63e-c8959461c19f/image.png" alt="">
리눅스 사용자 이름과 패스워드를 지정해준다.</p>
<p><img src="https://images.velog.io/images/matcha_/post/91564f5f-851e-4053-abb4-bac44386755e/image.png" alt="">
이후 다시 wsl 명령어를 사용하면 동작한다.
이러면 설치가 잘 되었다.</p>
<p>(+)
WSL에서 chmod가 작동하지 않는다.
아래 코드를 입력해주자</p>
<pre><code class="language-c">sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 11724 연결요소의 개수 C++ (BFS, DFS)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-11724-%EC%97%B0%EA%B2%B0%EC%9A%94%EC%86%8C%EC%9D%98-%EA%B0%9C%EC%88%98-C-BFS-DFS</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-11724-%EC%97%B0%EA%B2%B0%EC%9A%94%EC%86%8C%EC%9D%98-%EA%B0%9C%EC%88%98-C-BFS-DFS</guid>
            <pubDate>Sat, 19 Mar 2022 06:47:33 GMT</pubDate>
            <description><![CDATA[<p>📌백준 11724 연결요소의 개수
<a href="https://www.acmicpc.net/problem/11724">https://www.acmicpc.net/problem/11724</a></p>
<hr>
<p>그래프가 다 이어질 수도 있고 중간에 끊길 수도 있다.
이어지다가 끊기면 하나의 연결요소가 되는 것이다.
이 연결요소가 몇 개 있는지를 출력하는 문제이다.</p>
<p>DFS 함수는 연결된 요소들이 있으면 연속해서 호출된다. 그리고 더 이상 방문기록 없는 연결된 요소가 없으면 끝난다. 이어지다가 끊긴 것으로, 연결 요소 하나가 만들어졌다. 그리고 main()으로 돌아오는데, main()에서 인접리스트 요소 중 방문기록이 없으면 또 실행한다. 
즉 main()에서 DFS를 실행할 때 연결요소 개수가 +1 되는 것이다.</p>
<p>BFS 함수는 큐가 빌 때까지 탐색한다. 즉 연결된 노드들을 탐색하고 끝나는 것이다. 이것도 DFS와 마찬가지로 더 이상 방문기록 없는 연결된 요소가 없으면 끝이나서 main()으로 돌아온다. 이때도 main()에서 BFS를 실행해줄 때 연결요소 개수가 +1 되는 것이다.</p>
<hr>
<h3 id="dfs-풀이">DFS 풀이</h3>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
using namespace std;

vector&lt;int&gt; vect[1001]; //인접리스트
int visited[1001];      //방문기록
int N, M;

/* DFS : 방문기록 남기는 용도 */
void DFS(int vertex)
{
    visited[vertex] = 1;
    for (int i = 0; i &lt; vect[vertex].size(); i++) //최댓값 주의 : 벡터 그 원소에 해당하는 크기만큼 돌아야함
    {
        int idx = vect[vertex][i];
        if (visited[idx] == 0)
        {
            DFS(idx);
        }
    }
}

int main()
{
    int u, v;
    int cnt = 0;
    cin &gt;&gt; N &gt;&gt; M;
    for (int i = 0; i &lt; M; i++)
    {
        cin &gt;&gt; u &gt;&gt; v;
        vect[u].push_back(v);
        vect[v].push_back(u); //무방향 그래프이기 때문
    }

    for (int i = 1; i &lt;= N; i++) //빠짐없이 탐색하기 위해
    {
        if (visited[i] == 0)
        {
            cnt++;
            DFS(i);
        }
    }
    cout &lt;&lt; cnt &lt;&lt; &quot;\n&quot;;
}</code></pre>
<h3 id="bfs-풀이">BFS 풀이</h3>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;queue&gt;
using namespace std;

vector&lt;int&gt; vect[1001];
int visited[1001];
int N, M;

void BFS(int start)
{
    queue&lt;int&gt; q;
    q.push(start);
    visited[start] = 1;

    while (q.size() != 0)
    {
        // start가 아닌 가장 앞의 값에 인근 정점을 push 해줘야함
        int current = q.front();
        q.pop();
        for (int i = 0; i &lt; vect[current].size(); i++)
        {
            if (visited[vect[current][i]] == 0)
            {
                visited[vect[current][i]] = 1; 
                q.push(vect[current][i]);
                //BFS는 재귀가 아니라서 큐에 push 해주는 동시에 방문기록 남겨야함.
            }
        }
    }
}

int main()
{
    int cnt = 0; //연결요소 개수 세는 변수
    int u, v;
    cin &gt;&gt; N &gt;&gt; M;
    for (int i = 0; i &lt; M; i++)
    {
        cin &gt;&gt; u &gt;&gt; v;
        vect[u].push_back(v);
        vect[v].push_back(u);
    }

    //빠짐없이 탐색하기 위해
    for (int i = 1; i &lt;= N; i++)
    {
        if (visited[i] == 0)
        {
            BFS(i);
            cnt++;
        }
    }
    cout &lt;&lt; cnt;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 1707 이분그래프 C++ (BFS, DFS)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-1707-%EC%9D%B4%EB%B6%84%EA%B7%B8%EB%9E%98%ED%94%84-C-BFS-DFS</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-1707-%EC%9D%B4%EB%B6%84%EA%B7%B8%EB%9E%98%ED%94%84-C-BFS-DFS</guid>
            <pubDate>Sat, 19 Mar 2022 06:29:48 GMT</pubDate>
            <description><![CDATA[<p>📌백준 1707 이분그래프
<a href="https://www.acmicpc.net/problem/1707">https://www.acmicpc.net/problem/1707</a></p>
<hr>
<p><img src="https://images.velog.io/images/matcha_/post/e0575e86-35d6-40f6-9e4d-3c47253209ff/image.png" alt=""></p>
<hr>
<p>저번에 인접행렬을 사용해봤으니 이번엔 인접리스트를 사용해보자.
이번엔 visited에 방문했다는 표시 1 말고 색깔을 넣을 것이다. 빨간색이면 RED(2), 파란색이면 BLUE(3)를 넣었다.</p>
<ul>
<li>인접리스트, 방문기록, 노드 수, 간선 수를 전역에다 선언해준다. 인접리스트는 vector로 만들어주었다.</li>
<li>main()에서 테스트케이스를 입력받고 각 테스트케이스별 노드 수, 간선 수와 각각 노드를 입력받았다. 그리고 인접리스트에 넣어줌</li>
</ul>
<p><strong>1. DFS</strong></p>
<ul>
<li>빠짐없이 방문하기 위해서 1부터 N까지 다 돌려줌 대신 방문기록 있는 것들만 DFS 돌려줌</li>
<li>처음 방문하는 점이면 방문기록에 RED 넣어줌</li>
<li>연결된 점 탐색하러 가는데 연결된 점도 방문한 적이 없다? 그럼 여기서 조건을 걸어줌. 탐색 시작한 노드가 RED라면 연결된 점에는 BLUE를, BLUE라면 RED를 넣어줌.</li>
<li>그리고 요소별로 방문. 이것을 반복함(재귀)</li>
</ul>
<p><strong>2. BFS</strong></p>
<ul>
<li>큐 만들어주고 시작점 큐에 push</li>
<li>큐 맨 앞 값 복사해주고 큐 pop</li>
<li>큐 맨 앞 값이 RED다? 그러면 인접리스트에 연결된 노드들은 모두 BLUE로 넣어줌. (BLUE면 RED로) </li>
</ul>
<br/>

<ul>
<li>check()함수로 이분그래프 검사를 할 것이다. 인접한 노드와 시작점 노드가 색이 같으면 이분그래프 X. 한번이라도 같은게 있으면 바로 리턴해버림</li>
<li>그리고 중요한 것이 있다. 이 문제는 테스트케이스가 있으므로 인접리스트와 방문기록을 여러 번 써야한다는 것. 그러기 위해서는 초기화 작업이 필요하므로 memset을 사용해준다.</li>
</ul>
<hr>
<p><strong>DFS 풀이</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;string.h&gt;
using namespace std;

#define RED 2
#define BLUE 3

vector&lt;int&gt; vect[20001]; //인접리스트
int visited[20001];      //방문기록
int V, E;

/* DFS 실행 */
void DFS(int start)
{
    //방문안한 점이면 RED
    if (visited[start] == 0)
        visited[start] = RED;

    //연결된 점들 방문
    for (int i = 0; i &lt; vect[start].size(); i++)
    {
        int idx = vect[start][i];
        if (visited[idx] == 0) //방문 안한 점이면
        {
            //요소에 방문기록 남김(색칠하기)
            if (visited[start] == RED)
                visited[idx] = BLUE;
            else if (visited[start] == BLUE)
                visited[idx] = RED;

            //요소별로 방문
            DFS(idx);
        }
    }
}

/* 이분그래프 검사 */
int check()
{
    //인접한 노드와 색이 같으면 이분그래프 X
    for (int i = 1; i &lt;= V; i++)
    {
        //연결된게 자기자신 뿐일 경우엔 size가 0이라서 돌아가지 않는다.
        for (int j = 0; j &lt; vect[i].size(); j++)
        {
            int idx = vect[i][j];
            if (visited[i] == visited[idx]) 
            {
                return false;
            }
        }
    }
    return true;
}

int main()
{
    int T;    //테스트케이스
    int u, v; //노드 담을 변수

    cin &gt;&gt; T;
    while (T--)
    {
        cin &gt;&gt; V &gt;&gt; E;
        for (int i = 0; i &lt; E; i++)
        {
            cin &gt;&gt; u &gt;&gt; v;
            vect[u].push_back(v);
            vect[v].push_back(u);
        }


        //빠짐없이 방문하기 위해 1부터 원소 개수까지 다 방문해봄
        for (int i = 1; i &lt;= V; i++)
        {
            if (visited[i] == 0)
                DFS(i);
        }

        if (check() == 0) //이분그래프인지 검사
            cout &lt;&lt; &quot;NO\n&quot;;
        else
            cout &lt;&lt; &quot;YES\n&quot;;

        memset(visited, 0, sizeof(visited));
        memset(vect, 0, sizeof(vect));
    }
}</code></pre>
<p><strong>BFS 풀이</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;queue&gt;
#include &lt;vector&gt;
#include &lt;cstring&gt;
using namespace std;

#define RED 1
#define BLUE 2

vector&lt;int&gt; vect[20001];
int visited[20001];
int V, E;

void BFS(int start)
{
    visited[start] = RED;
    queue&lt;int&gt; q;
    q.push(start);

    while(q.size()!=0) //큐가 빌 때 까지 반복(전체)
    {
        int now = q.front();
        q.pop();
        for(int i=0; i&lt;vect[now].size(); i++)
        {
            if(visited[vect[now][i]] == 0)
            {
                q.push(vect[now][i]);

                if(visited[now] == RED) visited[vect[now][i]] = BLUE;
                else if(visited[now] == BLUE) visited[vect[now][i]] = RED;
            }
        }

    }

}

bool check()
{
    for (int i = 1; i &lt;= V; i++)
    {
        for (int j = 0; j &lt; vect[i].size(); j++)
        {
            if (visited[i] == visited[vect[i][j]])
                return false;
        }
    }
    return true;
}

int main()
{
    int K, u, v;
    cin &gt;&gt; K;

    while (K--)
    {
        cin &gt;&gt; V &gt;&gt; E;
        for (int i = 0; i &lt; E; i++)
        {
            cin &gt;&gt; u &gt;&gt; v;
            vect[u].push_back(v);
            vect[v].push_back(u);
        }

        //빠짐없이 방문하기 위해 노드 개수만큼 BFS 돌려줘야함
        for (int i = 1; i &lt;= V; i++)
        {
            if (visited[i] == 0)
            {
                BFS(i);
            }
        }

        //이분그래프 검사
        if (check())
            cout &lt;&lt; &quot;YES\n&quot;;
        else
            cout &lt;&lt; &quot;NO\n&quot;;

        memset(visited, 0, sizeof(visited));
        memset(vect, 0, sizeof(vect));
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 1260 DFS와 BFS C++ (BFS/DFS)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80-BFS-C-BFSDFS</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80-BFS-C-BFSDFS</guid>
            <pubDate>Sat, 19 Mar 2022 05:27:39 GMT</pubDate>
            <description><![CDATA[<p>📌백준 1260 DFS와 BFS
<a href="https://www.acmicpc.net/problem/1260">https://www.acmicpc.net/problem/1260</a></p>
<hr>
<p><img src="https://images.velog.io/images/matcha_/post/70c12bd5-59e1-42a2-a82e-6baf3e52c484/image.png" alt=""></p>
<hr>
<p>BFS와 DFS문제는 처음이다. 다른 블로그를 참고하며 풀었다.
<strong>BFS</strong>는 <strong>큐 [선입선출 FIFO]</strong>
<strong>DFS</strong>는 <strong>재귀 + 브루트포스(완전탐색) [후입선출 LIFO]</strong>
를 사용한 방식이었다.
DFS는 스택을 사용하는 후입선출 방식이다. 재귀를 통해 시스템 스택을 사용한다.</p>
<p>그래프 표현 방식에는 인접 행렬과 인접 리스트가 있다.
인접 행렬은 2차원 배열(행렬) 형태이고 인접 리스트는 vector와 같은 배열 형태이다. 
공간복잡도는 인접행렬 O(V^2), 인접리스트 O(V+E) 이고
시간복잡도는 각 노드별로 연결된 모든 노드 탐색 시 인접행렬 O(V), 인접리스트 O(E)이다.</p>
<p>인접리스트는 인접행렬보다 공간복잡도도 작고, 탐색시간도 비교적 빠른편이라서 인접리스트가 많이 쓰인다고 한다.
여기서는 인접행렬을 사용하였다.</p>
<ul>
<li>먼저 DFS, BFS를 수행하기 위해선 그래프(인접행렬)와 방문기록이 필요하다. </li>
<li>인접행렬, 방문기록, 노드 수, 간선 수를 전역으로 선언한다.</li>
<li>전역으로 선언해주면 자동으로 0으로 초기화된다.</li>
<li>main()에서 노드, 간선 개수와 시작점을 입력받고 
인접행렬에서 입력받은 두 노드가 만나는 곳에 1을 넣어준다. (1 = 연결됨을 의미)</li>
<li>DFS를 수행하고, 순서대로 출력해준다.</li>
<li>memset을 이용하여 초기화해준다. <a href="https://velog.io/@matcha_/CC-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%EC%B4%88%EA%B8%B0%ED%99%94">memset 사용법</a></li>
<li>BFS를 수행하고, 순서대로 출력해주고 끝</li>
</ul>
<p><strong>1. DFS</strong>
방문기록에 넣어주고, 연결된 다른 요소들이 있는데 방문기록이 없을 경우 그 요소에 대해 DFS를 수행하고 이를 반복한다.(재귀)
<strong>2. BFS</strong>
방문기록에 넣어주고 큐를 생성한다. 큐에 현재노드를 push하고,
큐의 맨 앞 노드를 복사한 다음에 큐에서 지워준다. 복사한 노드와 연결된 다른 노드들이 있을 것이다. 그럼 그 노드들을 큐에 넣어준다. 순서는 상관없다. 그리고 그 노드들도 방문기록에 남겨준다. 이것을 큐가 빌 때까지 반복한다.</p>
<p>뭔가 BFS보다 DFS가 더 쉽게 느껴졌던 것 같다. 큐를 많이 사용해보지 않아서 그런걸까 골고루 적용해보면서 익혀야겠다.</p>
<hr>
<h3 id="코드"><strong>코드</strong></h3>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;queue&gt;    //BFS에서 활용
#include &lt;string.h&gt; //memset 쓰려면 필요
using namespace std;

/* 전역으로 정의 - 자동 0 초기화 */
int arr[1001][1001]; //인접행렬
int visited[1001];   //방문기록
int N, M, V;

/* DFS - 재귀(시스템 스택 사용) (후입선출 LIFO) */
void DFS(int V)
{
    visited[V] = 1;   //시작점 방문기록
    cout &lt;&lt; V &lt;&lt; &quot; &quot;; //방문한 노드 출력

    for (int i = 1; i &lt;= N; i++)
    {
        if (arr[V][i] == 1 &amp;&amp; visited[i] == 0)
        {
            DFS(i); //스택에 i 넣는 셈
        }
        if (i == N)
            return;
    }
}

/* BFS - 큐 사용 (선입선출 FIFO) */
void BFS(int V)
{
    queue&lt;int&gt; q; //큐 생성
    q.push(V);    //시작노드 큐에 넣음

    while (!q.empty())
    {
        int next = q.front(); //큐 맨 앞에 값을 방문
        visited[next] = 1;    //방문기록
        cout &lt;&lt; next &lt;&lt; &quot; &quot;;  //방문한 노드 출력
        q.pop();              //큐에서 뺌

        //방문했던 노드와 가까운 노드 큐에 넣어줌
        for (int i = 1; i &lt;= N; i++)
        {
            if (arr[next][i] == 1 &amp;&amp; visited[i] == 0)
            {
                q.push(i);         //큐에 넣어줌
                visited[i] = 1; // i 점은 미리 방문기록 - 안하면 중복으로 방문할 수도 있다
            }
        }
    }

}

int main()
{
    int u, v;
    cin &gt;&gt; N &gt;&gt; M &gt;&gt; V;

    for (int i = 0; i &lt; M; i++)
    {
        cin &gt;&gt; u &gt;&gt; v;
        arr[u][v] = 1;
        arr[v][u] = 1; //자리바꿔서도 해주는 이유 : 무방향이기 때문
    }                  //입력 즉시 인접행렬에 넣어줌, 다 돌면 인접행렬 완성

    DFS(V); // DFS 수행

    cout &lt;&lt; &quot;\n&quot;;                        //개행
    memset(visited, 0, sizeof(visited)); //방문기록 visited 초기화

    BFS(V); // BFS 수행
}</code></pre>
<hr>
<p>📌참고
<a href="https://velog.io/@leobit/%EB%B3%B5%EC%9E%A1%EB%8F%84Complexity">https://velog.io/@leobit/%EB%B3%B5%EC%9E%A1%EB%8F%84Complexity</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C/C++] memset 사용법 2차원 배열 초기화]]></title>
            <link>https://velog.io/@matcha_/CC-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%EC%B4%88%EA%B8%B0%ED%99%94</link>
            <guid>https://velog.io/@matcha_/CC-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%EC%B4%88%EA%B8%B0%ED%99%94</guid>
            <pubDate>Tue, 15 Mar 2022 07:16:17 GMT</pubDate>
            <description><![CDATA[<h3 id="2차원배열-초기화-하는-방법">2차원배열 초기화 하는 방법</h3>
<ol>
<li>fill : 특정 값으로 초기화</li>
<li>memset : 0또는 1로 초기화</li>
</ol>
<h3 id="사용방법">사용방법</h3>
<h4 id="1-fill">1. fill</h4>
<p>필요한 헤더파일 : <code>#include&lt;algorithm&gt;</code>
fill(시작주소, 끝주소, 특정 값);
-&gt; <code>fill(arr, arr+N, 1);</code></p>
<h4 id="2-memset">2. memset</h4>
<p>필요한 헤더파일 : <code>#include&lt;string.h&gt;</code>
memset(시작주소, 0 또는 1, 배열크기);
-&gt; <code>memset(arr, 0, sizeof(arr));</code></p>
<p>알고리즘 문제를 풀 때는 0으로 초기화 하는 경우가 많아
memset을 자주 사용한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[메모리 구조를 알아보자]]></title>
            <link>https://velog.io/@matcha_/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@matcha_/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Mon, 14 Mar 2022 02:50:25 GMT</pubDate>
            <description><![CDATA[<p>저장공간은 레지스터, 캐시, 메모리로 구성되어있다. </p>
<h3 id="캐시">캐시</h3>
<p>자주 사용되는 데이터를 메모리에서 복사해놓는 임시 저장장소</p>
<p><img src="https://images.velog.io/images/matcha_/post/8847e324-1161-4dbe-b241-866f134a7f6a/image.png" alt=""></p>
<br/>

<h3 id="메모리">메모리</h3>
<p>프로세스의 메모리 구조
<img src="https://images.velog.io/images/matcha_/post/bbd38096-6fee-40ca-9f8e-6c5b2aff9c6a/image.png" alt=""></p>
<p>메모리 상에서 힙 영역(낮은주소-&gt;높은주소), 스택 영역(높은주소-&gt;낮은주소)은 서로 반대로 데이터를 채워 나가서 서로의 영역을 침범할 수도 있다.</p>
<ul>
<li>Stack Overflow : 스택이 힙 영역을 침범함</li>
<li>Heap Overflow : 힙이 스택 영역을 침범함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 10989 수 정렬하기 3 C++ (정렬)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-10989-%EC%88%98-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-3-C-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-10989-%EC%88%98-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-3-C-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Mon, 14 Mar 2022 02:12:17 GMT</pubDate>
            <description><![CDATA[<p>📌 백준 10989 수 정렬하기 3
<a href="https://www.acmicpc.net/problem/10989">https://www.acmicpc.net/problem/10989</a></p>
<hr>
<p><img src="https://images.velog.io/images/matcha_/post/5bb81de0-cacf-44d9-801d-baf9cccfbaf5/image.png" alt=""></p>
<hr>
<p>이 문제는 주목해야할 부분이 있다. 바로 이것
<img src="https://images.velog.io/images/matcha_/post/2347c029-46ec-4930-b745-4d801ddb17dc/image.png" alt=""></p>
<p>간단하게 생각해보면
N개의 원소를 가지는 배열을 만들어 주고
배열에 원소를 입력 받아서 sort() 해준 후 출력하면 된다.
근데 이렇게 하면 메모리가 초과가 난다.
N은 1부터 1000만까지다.
int 배열이니까 4byte x 1000만 = 40MB다.
8MB? 어림도 없다.</p>
<p>그럼 어떻게 해야할까
문제에서 제한을 준게 또 하나 있다. N개의 수를 입력받을 때 입력받는 수는 10000보다 작다는 것이다.
크기가 10001인 배열을 만들고, 입력 값이 idx와 동일하면 value로 개수를 +1 해서 넣어주는 것이다. 
풀이는 아래와 같다.</p>
<hr>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N, idx;
    int cnt[10001] = {};
    cin &gt;&gt; N;

    for (int i = 1; i &lt;= N; i++)
    {
        cin &gt;&gt; idx;
        cnt[idx] += 1;
    }

    for (int i = 1; i &lt;= 10000; i++)
    {
        for (int j = 1; j &lt;= cnt[i]; j++)
        {
            cout &lt;&lt; i &lt;&lt; &quot;\n&quot;;
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 10825 국영수 C++ (정렬)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-10825-%EA%B5%AD%EC%98%81%EC%88%98-C-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-10825-%EA%B5%AD%EC%98%81%EC%88%98-C-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Mon, 14 Mar 2022 01:58:51 GMT</pubDate>
            <description><![CDATA[<p>📌 백준 10825 국영수
<a href="https://www.acmicpc.net/problem/10825">https://www.acmicpc.net/problem/10825</a></p>
<hr>
<p><img src="https://images.velog.io/images/matcha_/post/f3d1d33a-6f52-4e44-af6b-68a41ebb0faf/image.png" alt=""></p>
<hr>
<p>벡터의 자료형으로 구조체를 사용했다. 
국어 점수를 내림차순으로 정렬,
국어 점수가 같으면 영어 점수를 오름차순으로 정렬,
영어 점수가 같으면 수학 점수를 내림차순으로 정렬하는 문제다.</p>
<p>sort()와 비교함수 compare()을 사용해서 문제를 풀었다.</p>
<hr>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
#include &lt;string&gt;
using namespace std;

struct student
{
    int kor;
    int eng;
    int math;
    string name;
};

//전체 비교
bool compare(const student&amp; now, const student&amp; last)
{
    if(now.kor != last.kor) return now.kor &gt; last.kor;
    else 
    {
        if(now.eng != last.eng) return now.eng &lt; last.eng;
        else 
        {
            if(now.math != last.math) return now.math &gt; last.math;
                return now.name &lt; last.name;
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N;
    cin&gt;&gt;N;

    vector&lt;student&gt; students(N);

    //입력
    for(int i=0; i&lt;N; i++)
        cin &gt;&gt; students[i].name &gt;&gt; students[i].kor &gt;&gt; students[i].eng &gt;&gt; students[i].math;

    //정렬
    sort(students.begin(), students.end(), compare);

    //출력
    //cout&lt;&lt;&quot;answer==\n&quot;;
    for(int i=0; i&lt;N; i++)
        cout &lt;&lt; students[i].name&lt;&lt; &quot;\n&quot;;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 10814 나이순 정렬 C++ (정렬)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-10814-%EB%82%98%EC%9D%B4%EC%88%9C-%EC%A0%95%EB%A0%AC-C-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-10814-%EB%82%98%EC%9D%B4%EC%88%9C-%EC%A0%95%EB%A0%AC-C-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Mon, 14 Mar 2022 01:51:35 GMT</pubDate>
            <description><![CDATA[<p>📌 백준 10814 나이순 정렬
<a href="https://www.acmicpc.net/problem/10814">https://www.acmicpc.net/problem/10814</a></p>
<hr>
<p><img src="https://images.velog.io/images/matcha_/post/0296ff4d-4195-4fdd-956c-382af47363fe/image.png" alt=""></p>
<hr>
<p>이 문제는 두 가지 방법으로 풀었다. 
답을 제출하면 계속 틀렸습니다가 나왔고 내가 무슨 부분을 놓치고 있는지 잘 모르겠더라. 그래서 고민 끝에 질문 게시판에 처음으로 글을 올렸고 어떤 천사 같은 분이 도움을 주셨다. 감사합니다 🙇‍♀️</p>
<p>내가 놓치고 있었던 부분은
조건을 하나 걸어주지 않았던 것이다. 정확히 말하면 sort()를 모르고 썼다.</p>
<p>이 문제를 풀 때 고려해줘야하는 조건은 2개다.</p>
<ol>
<li>나이 순으로 정렬한다.</li>
<li>나이가 같으면 가입한 순으로 정렬한다.</li>
</ol>
<p>오류가 났던 코드는 배열에 입력 값을 저장하고 sort()로 나이 순서대로 정렬했다. sort()를 쓰면 나이 순서대로 정렬 되고 같은 나이면 입력한 순서대로 출력하는줄 알았다.</p>
<p>그러나 그것은 아주 큰 오해</p>
<p>sort()는 배열의 두 원소를 비교하는 도구로 사용된다.
그런데 배열의 원소가 한 개가 아니라 지금처럼 여러 개로 묶여있다면?
배열의 x좌표를 주루룩 정렬했다고 치자. 만약 x좌표가 같은 것들이 있을 때, y좌표는 어떤 순서로 정렬될까?</p>
<p>sort()는 첫 번째 원소가 같을 경우, 두 번째 원소의 입력 순서대로 출력한다는 보장이 없다. 그래서 예측이 불가능한 불안정 정렬이다.
그럼 나머지 원소들을 입력 순서대로 출력하려면 어떻게 해야할까. 방법은 2가지다.</p>
<ol>
<li>sort() 비교 함수(compare) 내에 조건을 추가해준다.
멤버 변수로 idx를 추가해주었다. 나이가 같을 경우, idx를 오름차순으로 정렬하도록 했다.</li>
<li>stable_sort() 를 사용한다.
stable_sort()는 sort()와 비슷하지만 다른 정렬 도구다.
첫 번째 원소가 같을 경우, 두 번째 원소의 입력 순서대로 출력을 보장한다. 즉 동일한 값에 대해 기존 순서가 보장되는, 예측할 수 있는 안정적인 정렬이다.</li>
</ol>
<p><img src="https://images.velog.io/images/matcha_/post/8391ed82-7ac2-49b4-8ca6-02dcff66b05a/image.png" alt=""></p>
<blockquote>
<p>*<em>sort() *</em></p>
</blockquote>
<ul>
<li>첫 번째 원소가 같을 경우, 두 번째 원소의 입력 순서대로 출력한다는 보장이 없다.</li>
<li>동일한 값에 대해 기존 순서가 뒤바뀔 수 있다.</li>
<li>예측이 불가능한 불안정 정렬</li>
</ul>
<blockquote>
<p><strong>stable_sort()</strong></p>
</blockquote>
<ul>
<li><p>첫 번째 원소가 같을 경우, 두 번째 원소의 입력 순서대로 출력을 보장한다.</p>
</li>
<li><p>동일한 값에 대해 기존 순서가 보장된다.</p>
</li>
<li><p>예측 가능한 안정적 정렬</p>
<p>그래서 여기서는 나이 순서대로 정렬하고 나이가 같으면 입력 순서대로 받기 위해 stable_sort()를 사용했다. 사용법은 sort()와 동일하다.</p>
</li>
</ul>
<hr>
<h4 id="비교함수에-조건-추가">비교함수에 조건 추가</h4>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;algorithm&gt;
using namespace std;

struct person
{
    int age, idx;
    string name; //int로 바꿔주면 오류 안남
};

bool compare(const person&amp; now, const person&amp; last)
{
    if(now.age != last.age) return now.age &lt; last.age;
    return now.idx &lt; last.idx;
}

int main()
{    
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N;
    cin &gt;&gt; N;
    person people[100001]; //구조체 배열

    for (int i = 0; i &lt; N; i++) //배열에 값 넣어줌
    {    
        cin &gt;&gt; people[i].age &gt;&gt; people[i].name;
        people[i].idx = i;
    }

    //정렬
    //stable_sort(people, people + N, compare);
    sort(people, people + N, compare);

    //답 출력
    for (int i = 0; i &lt; N; i++)
        cout &lt;&lt; people[i].age &lt;&lt; &quot; &quot; &lt;&lt; people[i].name &lt;&lt; &quot;\n&quot;;
}</code></pre>
<h4 id="stable_sort-사용">stable_sort() 사용</h4>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;algorithm&gt;
using namespace std;

struct person
{
    int age;
    string name; //int로 바꿔주면 오류 안남
};

bool compare(const person&amp; now, const person&amp; last)
{
    if(now.age != last.age) return now.age &lt; last.age;
    return false;
}

int main()
{    
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int N;
    cin &gt;&gt; N;
    person people[100001]; //구조체 배열

    for (int i = 0; i &lt; N; i++) //배열에 값 넣어줌
        cin &gt;&gt; people[i].age &gt;&gt; people[i].name;

    //정렬
    stable_sort(people, people + N, compare);

    //답 출력
    for (int i = 0; i &lt; N; i++)
        cout &lt;&lt; people[i].age &lt;&lt; &quot; &quot; &lt;&lt; people[i].name &lt;&lt; &quot;\n&quot;;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 11650 좌표 정렬하기 C++ (정렬)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-11650-%EC%A2%8C%ED%91%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-C-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-11650-%EC%A2%8C%ED%91%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-C-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Mon, 14 Mar 2022 01:28:28 GMT</pubDate>
            <description><![CDATA[<p>📌 백준 11650 좌표 정렬하기
<a href="https://www.acmicpc.net/problem/11650">https://www.acmicpc.net/problem/11650</a></p>
<hr>
<p><img src="https://images.velog.io/images/matcha_/post/45205b16-5505-4780-9223-7e71023ac527/image.png" alt=""></p>
<hr>
<p>좌표를 입력 받고 배열에 저장한 후 정렬해서 출력하는 문제이다.
구조체를 만들고 멤버 변수로 x, y 좌표를 정의했다. </p>
<p>이 문제에서 주목할 부분은 바로 
<strong>x좌표가 같으면 y좌표가 증가하는 순서로 정렬한다</strong>는 것이다.</p>
<p>나는 배열 원소들의 정렬을 위해 sort()를 썼는데,
이 sort()에는 주의할 점이 있다.</p>
<p>우선 sort()는 3개의 매개변수를 가진다.
<strong>sort(A, B, 함수명)</strong>
A는 배열의 시작 주소, B는 배열의 끝 주소다. 함수명에는 배열의 원소들을 비교하기 위한 함수의 이름만 적어준다. 파라미터까지 적어줄 필요 없다.
sort()함수에 대한 자세한 건 <a href="">여기</a>에 정리했다.</p>
<p>여기서 sort(A,B) 같이 매개변수 2개만 있는 경우도 본 적이 있다.
이 때는 디폴트 값으로 오름차순으로 정렬한다는 뜻이다.</p>
<p>sort()의 비교함수(compare())가 true를 리턴하면 자리를 바꾸고,
false를 리턴하면 자리를 바꾸지 않는다.</p>
<hr>
<pre><code class="language-xpp">#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
#include &lt;vector&gt;
using namespace std;

struct position
{
    int x, y;
};

bool compare(position now, position last)
{
    if (now.x &gt; last.x) return false;
    if (now.x == last.x &amp;&amp; now.y &gt; last.y) return false;
    else return true;
}

int main()
{
    int N;
    scanf(&quot;%d&quot;, &amp;N);
    struct position arr[100001];

    for (int i = 0; i &lt; N; i++)
    {
        scanf(&quot;%d %d&quot;, &amp;arr[i].x, &amp;arr[i].y);
    }

    //정렬
    sort(arr, arr + N, compare);

    for (int i = 0; i &lt;N; i++)
        printf(&quot;%d %d\n&quot;, arr[i].x, arr[i].y);
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그램, 프로세스란?]]></title>
            <link>https://velog.io/@matcha_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%9E%80</link>
            <guid>https://velog.io/@matcha_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%9E%80</guid>
            <pubDate>Sat, 12 Mar 2022 13:04:06 GMT</pubDate>
            <description><![CDATA[<p><strong><span style="color:red;">프로그램</span></strong>이란 실행하기 전 정적인 상태로, <strong>실행파일</strong>이다.</p>
<p><strong>프로그램을 실행하면 프로세스가 된다.</strong></p>
<p><strong><span style="color:blue;">프로세스</span></strong>란 <strong>실행중인 프로그램</strong>이다.
프로그램이 실행되려면 OS에서 주소공간, 파일, 메모리 등을 할당받아야 하는데, 이러한 것들을 할당받아서 실행 중인 상태를 말한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] C++ cin, cout 입출력 속도 빠르게 하는 법]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-C-cin-cout-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%86%8D%EB%8F%84-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%95%98%EB%8A%94-%EB%B2%95</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-C-cin-cout-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%86%8D%EB%8F%84-%EB%B9%A0%EB%A5%B4%EA%B2%8C-%ED%95%98%EB%8A%94-%EB%B2%95</guid>
            <pubDate>Sat, 12 Mar 2022 02:22:45 GMT</pubDate>
            <description><![CDATA[<p>본인은 C++을 이용해서 백준 문제를 풀고있다. 그런데 풀다가 이상한 광경을 목격했다. 다른 사람의 코드를 봤는데, 분명 코드 구조는 같은데 실행 시간이 훨씬 빨랐다. 뭐가 다른걸까 비교해보니 내 코드에는 두 줄이 없었다.</p>
<blockquote>
<p>ios::sync_with_stdio(false);
cin.tie(NULL);</p>
</blockquote>
<hr>
<p><img src="https://images.velog.io/images/matcha_/post/7771658f-0f40-4b2e-957b-33d24447cb45/image.png" alt="">
<em>출처 <a href="https://coding-insider.tistory.com/entry/cin-cout-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%86%8D%EB%8F%84-%EB%B9%A0%EB%A5%B4%EA%B2%8C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">https://coding-insider.tistory.com/entry/cin-cout-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%86%8D%EB%8F%84-%EB%B9%A0%EB%A5%B4%EA%B2%8C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</a></em></p>
<p>C++로 알고리즘을 풀 때 cin, cout은 속도가 느리다.
C++의 cin, cout는 scanf, printf에 비해 속도가 현저히 느리다.
cin, cout을 printf, scanf만큼 빠르게 쓸 수 있는 방법이 있다.</p>
<p><strong>ios::sync_with_stdio(false);
cin.tie(NULL);</strong></p>
<p>이 두 줄이 무슨 뜻일까</p>
<h3 id="iossync_with_stdiofalse">ios::sync_with_stdio(false);</h3>
<p>stdio.h는 C에서 printf, scanf를 사용할 수 있는 헤더이다.
iostream은 C++에서 cout, cin을 사용할 수 있는 헤더이다.</p>
<p>cin, cout은 기본적으로 C의 stdio.h와 동기화되어있다.
stdio.h의 버퍼와 iostream의 버퍼를 같이 쓴다는 말이다. 동기화를 유지하는 작업이 추가되다 보니 상대적으로 속도가 느리다.</p>
<blockquote>
<p>버퍼(buffer) : 데이터가 전송될 때 일시적으로 그 데이터를 보관하는 메모리 영역</p>
</blockquote>
<p>여기서 stdio.h와 동기화를 안해주면 어떻게 될까?
iostream 버퍼만 쓰게되어 버퍼가 줄어든다. 그럼 속도가 빨라지는 것이다.</p>
<p>ios::sync_with_stdio의 기본 디폴트 값은 true이다. stdio.h와 동기화해서 쓰겠다는 것이다. ios::sync_with_stdio()에 false 값을 넣어주면 동기화가 해제된다. </p>
<blockquote>
<p>stdio.h와 동기화해서 쓰는 이유는 입력 버퍼링을 방지하기 위함이라고 한다. 알고리즘에서는 입력 형식이 제한되어있어 입력 버퍼링 방지를 할 필요가 없다.</p>
</blockquote>
<p>근데 유의할 점이 있다.</p>
<ol>
<li>C의 입출력 방식과 동시 사용 불가 (printf, scanf, getchar, puts, gets)</li>
</ol>
<p>-&gt; 동기화를 해제했기 때문에 C의 버퍼와 C++의 버퍼가 독립적이다. 따라서 출력되는 순서를 보장할 수 없다.</p>
<ol start="2">
<li>멀티쓰레드 불가 - 싱글쓰레드 환경에서만 사용(실무에서 사용 불가)</li>
</ol>
<p>입출력 속도를 빠르게 하기 위한 일종의 편법이다.
<br/></p>
<h3 id="cintienull">cin.tie(NULL);</h3>
<p>cin과 cout은 하나로 묶여있어서 서로 연결되어있다.(커플링)
cin을 통해 입력이 발생하면 cout 출력 버퍼(buffer)를 플러시(flush)시켜 출력이된 후 입력을 받는다.</p>
<blockquote>
<p>버퍼(buffer)는 꽉 차면 출력이 되는 방식이다. 플러시(flush)는 버퍼가 꽉 차지 않아도 즉시 출력해서 버퍼를 비워주는 것이다.</p>
</blockquote>
<p>이게 무슨말이냐
cin과 cout은 서로 연결되어있어서 cin을 쓰면 출력 버퍼를 비우고 입력이 발생한다. 
이러한 플러시 과정(버퍼를 비우는 작업)도 시간이 든다.
그래서 cin, cout의 상호 연결을 끊어주기 위해 cin.tie(NULL);를 사용한다.</p>
<br/>

<h3 id="개행문자">개행문자</h3>
<p>endl보다 &quot;\n&quot;이 더 빠르다. endl도 불러오는 것이기 때문이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 11055 가장 큰 증가 부분 수열 C++ (DP)]]></title>
            <link>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-11055-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%A6%9D%EA%B0%80-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4-C-DP</link>
            <guid>https://velog.io/@matcha_/%EB%B0%B1%EC%A4%80-11055-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%A6%9D%EA%B0%80-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4-C-DP</guid>
            <pubDate>Sat, 12 Mar 2022 01:16:58 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/matcha_/post/7979b1f2-e059-4a32-928d-965e52a91531/image.png" alt="">
📌백준 11055 가장 큰 증가 부분 수열
<a href="https://www.acmicpc.net/problem/11055">https://www.acmicpc.net/problem/11055</a></p>
<hr>
<p>11053 가장 긴 증가하는 부분수열을 풀어봤다면
수월하게 풀 수 있다.</p>
<p>탐색 순서는
i=3일 때 1, 2번째
i=4일 때 1, 2, 3번째와
비교한다.</p>
<p>입력받는 수를 담을 배열 arr[]와
i번째까지 증가하는 수열의 합을 담을 배열 dp[]를
정의해준다.</p>
<p>d[]의 모든 원소는 arr[] 자기자신 값으로 초기화해준다.
가장 긴 증가하는 수열이 자기자신 뿐으로 총 합이 자기자신일 수도 있다.</p>
<p>i=3일 때 j=1, 2
i=4일 때 j=1, 2, 3 이라고 하면</p>
<p>arr[i]가 arr[j]보다 작을 경우는 패쓰하고
arr[i]가 arr[j]보다 클 경우에는 d[i] = d[j] + arr[i]을 해준다.
여기서 주의할 점
arr[4]가 arr[2]보다 크고 arr[3]보다 큰데
d[2] = 1, d[3] = 100일 때 d[4]는 100이 되어야 한다.
그러면 매번 d[j]+arr[i]값을 비교했을 때 더 큰 값을 선택해주면 된다.
즉, d[i] = max(d[i], d[j]+arr[i])을 반복해주면 된다.</p>
<hr>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;algorithm&gt;
using namespace std;

int main()
{
    int N;
    scanf(&quot;%d&quot;, &amp;N);

    int arr[1001];
    for(int i=1; i&lt;=N; i++) scanf(&quot;%d&quot;, &amp;arr[i]);

    int dp[1001];
    for(int i = 1; i&lt;=N; i++) dp[i] = arr[i];

    for(int i = 1; i&lt;=N; i++)
    {
        for(int j = 1; j&lt;i; j++)
        {
            if(arr[i] &gt; arr[j])
            {
                dp[i] = max(dp[i], dp[j] + arr[i]);
            }
        }
    }
    sort(dp, dp+N+1);

    //for(int i=1; i&lt;=N; i++) printf(&quot;%d  &quot;,dp[i]);
    printf(&quot;%d&quot;,dp[N]);

}</code></pre>
]]></description>
        </item>
    </channel>
</rss>