<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>seohyun-j.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 21 Apr 2022 15:02:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>seohyun-j.log</title>
            <url>https://images.velog.io/images/seohyun-j/profile/8d6120d2-a3c0-4545-92c8-a05b31957a82/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. seohyun-j.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/seohyun-j" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Python] 문자 아스키코드 변환]]></title>
            <link>https://velog.io/@seohyun-j/Python-%EB%AC%B8%EC%9E%90-%EC%95%84%EC%8A%A4%ED%82%A4%EC%BD%94%EB%93%9C-%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@seohyun-j/Python-%EB%AC%B8%EC%9E%90-%EC%95%84%EC%8A%A4%ED%82%A4%EC%BD%94%EB%93%9C-%EB%B3%80%ED%99%98</guid>
            <pubDate>Thu, 21 Apr 2022 15:02:52 GMT</pubDate>
            <description><![CDATA[<h3 id="문자-➡-아스키코드--chr--이용-">문자 ➡ 아스키코드 ( chr( ) 이용 )</h3>
<pre><code class="language-python">&gt;&gt;&gt; ord(&#39;A&#39;)
    65
&gt;&gt;&gt; ord(&#39;B&#39;)
    66</code></pre>
<hr>
<h3 id="아스키코드-➡-문자--ord--이용-">아스키코드 ➡ 문자 ( ord( ) 이용 )</h3>
<pre><code class="language-python">&gt;&gt;&gt; chr(65)
    A
&gt;&gt;&gt; chr(66)
    B</code></pre>
<hr>
<h3 id="아스키코드-표">아스키코드 표</h3>
<p><img src="https://velog.velcdn.com/images/seohyun-j/post/8110cecf-9d5f-4eb7-b756-3fc06ff79372/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] n진수 변환]]></title>
            <link>https://velog.io/@seohyun-j/Python-n%EC%A7%84%EC%88%98-%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@seohyun-j/Python-n%EC%A7%84%EC%88%98-%EB%B3%80%ED%99%98</guid>
            <pubDate>Thu, 21 Apr 2022 06:22:37 GMT</pubDate>
            <description><![CDATA[<h3 id="파이썬에서-지원하는-진수-변환-라이브러리">파이썬에서 지원하는 진수 변환 라이브러리</h3>
<table>
<thead>
<tr>
<th>2진수</th>
<th>8진수</th>
<th>16진수</th>
</tr>
</thead>
<tbody><tr>
<td>bin()</td>
<td>oct()</td>
<td>hex()</td>
</tr>
</tbody></table>
<pre><code class="language-python">&gt;&gt;&gt; print(bin(11))
     0b1011
&gt;&gt;&gt; print(oct(11))
     0o13
&gt;&gt;&gt; print(hex(11))
     0xb</code></pre>
<ul>
<li>위의 라이브러리를 사용했을 때, 앞에 붙는 &#39;0b&#39;, &#39;0o&#39;, &#39;0x&#39;는 2진수, 8진수, 16진수를 나타내므로 우리가 알고있는 2진수, 8진수, 16진수와 같이 표현하기 위해서는 3번째 자리부터 슬라이싱해서 나타내주면 된다.
➡ <code>bin(11)[2:]</code> , <code>oct(11)[2:]</code> , <code>hex(11)[2:]</code> 와 같이 작성하면 <code>1011</code>, <code>13</code> , <code>b</code> 와 같이 출력된다.</li>
</ul>
<hr>
<h3 id="파이썬에서-지원하지-않는-진수-변환은-어떻게-처리할까-">파이썬에서 지원하지 않는 진수 변환은 어떻게 처리할까 ?</h3>
<p>➡ 직접 코드 작성하여 10진수에서 n진수 변환 해야한다.</p>
<pre><code class="language-python"># x는 나누고자 하는 수
# n는 진수 변환 하고자 하는 수
def solution(x, n):
    answer = &#39;&#39;

    while x &gt; 0:
        x, mod = divmod(x, n)
        answer += str(mod)

    return answer[::-1]

 print(solution(11,3))</code></pre>
<hr>
<h3 id="n진수-→-10진수">n진수 → 10진수</h3>
<ul>
<li><code>int(value, n)</code> 라이브러리 이용</li>
<li>이때 <code>value</code>는 문자열 형태로 진수 변환해야 되는 수를 넣어주고, <code>n</code>은 n진수에서 10진수로 변환할 수를 넣어준다.</li>
</ul>
<pre><code class="language-python">&gt;&gt;&gt; int(&#39;101&#39;, 2)
     5
&gt;&gt;&gt; int(&#39;202&#39;, 3)
     20
&gt;&gt;&gt; int(&#39;303&#39;, 4)
     51
&gt;&gt;&gt; int(&#39;404&#39;, 5)
     104</code></pre>
<hr>
<h3 id="n진수-→-n진수">n진수 → n진수</h3>
<ul>
<li>n진수 → 10진수 → n진수로 진행해야 한다.</li>
</ul>
<pre><code class="language-python">&gt;&gt;&gt; solution(int(&#39;202&#39;, 3), 4)
     110</code></pre>
<hr>
<h3 id="n진수-자릿수-맞추기-rjust이용">n진수 자릿수 맞추기 (<code>rjust()</code>이용)</h3>
<ul>
<li>코딩테스트를 공부하다보면, 앞에 0을 채워 자릿수를 채워야하는 경우가 있다.</li>
<li>이때 <code>rjust(길이, 채울문자)</code>를 이용하여 구현할 수 있다.<pre><code class="language-python">&gt;&gt;&gt; bin(1)[2:]
  1
&gt;&gt;&gt; bin(1)[2:].rjust(5, &#39;0&#39;)
  00001</code></pre>
</li>
</ul>
<hr>
<h2 id="➰-references">➰ References</h2>
<blockquote>
<p><a href="https://url.kr/lk4haj">https://url.kr/lk4haj</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] Shortest Path - 최단경로 알고리즘]]></title>
            <link>https://velog.io/@seohyun-j/Algorithm-Shortest-Path</link>
            <guid>https://velog.io/@seohyun-j/Algorithm-Shortest-Path</guid>
            <pubDate>Wed, 20 Apr 2022 15:12:34 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><strong>최단 경로 알고리즘이란,</strong>
최단 경로 알고리즘으로 주어진 노드와 간선들 중 가장 짧은 경로를 찾는 알고리즘</p>
</li>
<li><p><strong>최단 경로 문제의 종류</strong></p>
<ul>
<li>하나의 정점에서 다른 하나의 정점까지 최단 경로를 구하는 문제</li>
<li>하나의 정점에서 다른 모든 정점까지의 최단 경로를 구하는 문제</li>
<li>각 모든 정점에서 다른 모든 정점까지의 최단 경로를 구하는 문제</li>
</ul>
</li>
<li><p><strong>최단 경로 알고리즘의 종류</strong></p>
<ul>
<li>하나의 정점에서 다른 모든 정점까지의 최단 경로를 구하는 문제<ul>
<li>간선의 가중치가 모두 같은 그래프일 경우 : BFS 이용</li>
<li>간선의 가중치가 각각 다른 그래프일 경우 : Dijkstra, Bellman-Ford(음수의 가중치 간선 존재하는 경우) 이용</li>
</ul>
</li>
<li>각 모든 정점에서 다른 모든 정점까지 최단 경로를 구하는 문제 : Floyd-Warshall 이용</li>
</ul>
</li>
<li><p><strong>Dijkstra Algorithm</strong></p>
<ul>
<li>A→C로 갈 때 A→B→C로 가는 경로의 가중치 합이 A→C의 가중치 합보다 작다면 B를 거쳐가는 경로를 선택하는 알고리즘</li>
</ul>
</li>
<li><p><strong>Bellman-Ford Algorithm</strong></p>
<ul>
<li>음의 가중치가 있을 때에 사용할 수 있는 알고리즘</li>
</ul>
</li>
<li><p><strong>Floyd-Warshall Algorithm</strong></p>
<ul>
<li>A, B, C의 정점이 있다면 A와 B, C 정점 간의 최단경로, 또 B와 A, C 정점 간의 최단경로 C와 A, B 간의 최단 경로를 구함</li>
<li>즉, 모든 정점에서 다른 모든 정점 간의 최단 경로를 구하는 알고리즘</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] Greedy - 탐욕알고리즘]]></title>
            <link>https://velog.io/@seohyun-j/Algorithm-Greedy</link>
            <guid>https://velog.io/@seohyun-j/Algorithm-Greedy</guid>
            <pubDate>Wed, 20 Apr 2022 15:11:46 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><strong>그리디 알고리즘이란,</strong></p>
<ul>
<li>단순하면서 강력한 문제 해결법</li>
<li>매 순간 가장 좋아 보이는 것을 선택하며, 현재의 선택이 나중에 미칠 영향을 고려하지 않음</li>
<li>그리디 알고리즘은 기준에 따라 좋은 것을 선택하므로, ‘가장 큰 순서대로’ 혹은 ‘가장 작은 순서대로’와 같은 기준을 제시해야함</li>
<li>그리디 알고리즘은 정렬 알고리즘과 짝을 이뤄 자주 출제됨</li>
</ul>
</li>
<li><p><strong>Dijkstra Algorithm</strong> <strong>( in Greedy )</strong></p>
<ul>
<li>특정 노드에서 시작해 모든 노드까지 도착할 수 있는 가장 짧은 경로들을 탐색하며 모든 노드의 최소 경로를 구함</li>
<li>단방향, 양방향(사이클) 모두 사용할 수 있음</li>
<li>다익스트라 알고리즘은 BFS 방식과 유사하며 시작 노드에서 모든 노드 간의 거리 값을 저장하는 배열을 생성한 다음, 인접한 노드들의 거리를 구해 가장 짧은 경로를 해당 배열에 업데이트 해나가는 방식</li>
<li>간단히 예를 들어보면 A→C로 갈 때 A→B→C 로 가는 경로의 가중치 합이 A→C의 가중치 합보다 작다면 B를 거쳐가는 경로를 선택하는 알고리즘</li>
</ul>
</li>
</ol>
<h3 id="➰-references">➰ References</h3>
<blockquote>
<p><a href="https://brownbears.tistory.com/554">https://brownbears.tistory.com/554</a>
<a href="http://www.yes24.com/Product/Goods/91433923">이것이 취업을 위한 코딩 테스트다 with 파이썬</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[programmers] 신고 결과 받기 (python)]]></title>
            <link>https://velog.io/@seohyun-j/programmers-%EC%8B%A0%EA%B3%A0-%EA%B2%B0%EA%B3%BC-%EB%B0%9B%EA%B8%B0-python</link>
            <guid>https://velog.io/@seohyun-j/programmers-%EC%8B%A0%EA%B3%A0-%EA%B2%B0%EA%B3%BC-%EB%B0%9B%EA%B8%B0-python</guid>
            <pubDate>Wed, 20 Apr 2022 07:30:05 GMT</pubDate>
            <description><![CDATA[<p><a href="https://programmers.co.kr/learn/courses/30/lessons/92334">문제보러가기</a></p>
<ol>
<li><p>문제 접근법</p>
<ul>
<li>신고받은 list인 report변수를 &#39; &#39;로 나눠준다.</li>
<li>신고받은 횟수를 저장해주는 dictionary 선언</li>
<li>신고받은 횟수가 k를 넘는 경우 신고한 대상이 정지되는 횟수를 저장해주는 list 선언</li>
</ul>
</li>
<li><p>코드</p>
<pre><code class="language-python">def solution(id_list, report, k):
   report = [i.split(&#39; &#39;) for i in set(report)]
   id_dict = {string:0 for string in id_list}
   answer = [0]*len(id_list)
   for i in report:
       if i[1] in id_dict.keys():
           id_dict[i[1]] += 1
   for i in report:
       if id_dict[i[1]]&gt;=k:
           answer[id_list.index(i[0])] += 1
   return answer</code></pre>
</li>
<li><p>문제 난이도</p>
<table>
<thead>
<tr>
<th align="center">프로그래머스 레벨</th>
<th align="center">주관적 난이도</th>
<th align="center">코드 참조 여부</th>
</tr>
</thead>
<tbody><tr>
<td align="center">Level 1</td>
<td align="center">⭐⭐</td>
<td align="center">❌</td>
</tr>
</tbody></table>
</li>
<li><p>고찰</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] List]]></title>
            <link>https://velog.io/@seohyun-j/Python-List</link>
            <guid>https://velog.io/@seohyun-j/Python-List</guid>
            <pubDate>Tue, 19 Apr 2022 14:34:25 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><strong>리스트 생성</strong></p>
<ul>
<li><code>arr = []</code></li>
<li><code>arr = list()</code></li>
</ul>
</li>
<li><p><strong>리스트 입력</strong></p>
<ul>
<li><p><code>list.append()</code> 이용</p>
<pre><code class="language-python">  &gt;&gt;&gt; arr = [1, 2, 3, 4, 5]
  &gt;&gt;&gt; arr.append(6)
  &gt;&gt;&gt; arr

  [1, 2, 3, 4, 5, 6]</code></pre>
</li>
</ul>
</li>
</ol>
<ol start="3">
<li><p><strong>리스트 출력</strong></p>
<ul>
<li><p>for문 이용</p>
<pre><code class="language-python">  &gt;&gt;&gt; for i in arr:
  &gt;&gt;&gt;     print(i)

  1
  2
  3
  4
  5
  6</code></pre>
</li>
<li><p>인덱스 출력</p>
<pre><code class="language-python">  &gt;&gt;&gt; for idx, val in enumerate(arr):
  &gt;&gt;&gt;      print(idx, val)

  0 1
  1 2
  2 3
  3 4
  4 5
  5 6</code></pre>
</li>
<li><p>while문 이용</p>
<pre><code class="language-python">  &gt;&gt;&gt; cnt = 0
  &gt;&gt;&gt; while cnt &lt; len(arr):
  &gt;&gt;&gt;     print(arr[cnt])
  &gt;&gt;&gt;     cnt += 1

  1
  2
  3
  4
  5
  6</code></pre>
</li>
<li><p>pprint() 이용</p>
<pre><code class="language-python">  &gt;&gt;&gt; from pprint import pprint
  &gt;&gt;&gt; pprint(arr)

  [1, 2, 3, 4, 5]</code></pre>
</li>
<li><p>print() 이용</p>
<pre><code class="language-python">  &gt;&gt;&gt; print(arr)
  [1, 2, 3, 4, 5]

  &gt;&gt;&gt; print(*arr)
  1 2 3 4 5

  &gt;&gt;&gt; print(*arr, sep=&#39;\n&#39;)
  1
  2
  3
  4
  5</code></pre>
</li>
</ul>
</li>
</ol>
<ol start="4">
<li><strong>리스트 함수</strong></li>
</ol>
<pre><code>| 함수 | 설명 |
| --- | --- |
| insert(원하는 위치, 값) | 리스트의 원하는 위치에 값 추가 |
| sort() | 리스트 오름차순으로 정렬 → 가로 안에 reverse=True라고 써주면 내림차순으로 정렬 |
| reverse() | 리스트 뒤집기 |
| index(값) | 리스트에서 값의 위치 반환 |
| remove(값) | 리스트에서 해당 값 삭제 |
| pop() | 리스트 맨 마지막 요소 꺼내기 |
| count(값) | 리스트에서 해당 값 개수 세기 |
| extend(다른 리스트) | 두 개의 리스트 합치기  |</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 문자열 자료형]]></title>
            <link>https://velog.io/@seohyun-j/python-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%9E%90%EB%A3%8C%ED%98%95</link>
            <guid>https://velog.io/@seohyun-j/python-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%9E%90%EB%A3%8C%ED%98%95</guid>
            <pubDate>Tue, 19 Apr 2022 14:02:09 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><strong>문자열이란</strong></p>
<p> 문자열이란, 문자·단어 등으로 구성된 문자들의 집합</p>
<pre><code class="language-python"> &quot;Hello Seohyun&#39;s World&quot;
 &quot;J&quot;
 &quot;1234567890&quot;</code></pre>
</li>
<li><p><strong>문자열 이스케이프 코드</strong></p>
</li>
</ol>
<pre><code>| 코드 | 설명 |
| --- | --- |
| \’ | 화면에 작은 따옴표 표시 |
| \” | 화면에 큰 따옴표 표시 |
| \n | 문자열 안에서 줄 바꿈 |
| \\ | 화면에 역슬래시 표시 |
| \t | 문자열 안에서 탭만큼 띄우기 |</code></pre><ol start="3">
<li><p><strong>문자열 연산</strong></p>
<ul>
<li><p>문자열 곱하기 : 문자열을 곱하는 숫자만큼 반복</p>
<pre><code class="language-python">  &gt;&gt;&gt; str1 = &quot;String&quot;
  &gt;&gt;&gt; str1 * 3

  &quot;StringStringString&quot;</code></pre>
</li>
<li><p>문자열 더하기 : 해당 문자열들을 연결</p>
<pre><code class="language-python">  &gt;&gt;&gt; str1 = &quot;Python &quot;
  &gt;&gt;&gt; str2 = &quot;String&quot;
  &gt;&gt;&gt; str1 + str2

  &quot;Python String&quot;</code></pre>
</li>
</ul>
</li>
</ol>
<ol start="4">
<li><strong>문자열 인덱싱과 슬라이싱</strong></li>
</ol>
<ol start="5">
<li><p><strong>문자열 메소드</strong></p>
<table>
<thead>
<tr>
<th align="center"><strong>메서드</strong></th>
<th><strong>설명</strong></th>
</tr>
</thead>
<tbody><tr>
<td align="center">lower()</td>
<td>문자열을 소문자로 치환해 반환</td>
</tr>
<tr>
<td align="center">upper()</td>
<td>문자열을 대문자로 치환해 반환</td>
</tr>
<tr>
<td align="center">capitalize()</td>
<td>문자열에서 첫 문자는 대문자로, 나머지 문자열을 소문자로 치환해 반환</td>
</tr>
<tr>
<td align="center">title()</td>
<td>capitalize()의 확장 버전으로 문자열의 모든 단어에 capitalize() 적용</td>
</tr>
<tr>
<td align="center">islower()</td>
<td>문자열이 모두 소문자로 이루어져 있는지 판단</td>
</tr>
<tr>
<td align="center">isupper()</td>
<td>문자열이 모두 대문자로 이루어져 있는지 판단</td>
</tr>
<tr>
<td align="center">isalpha()</td>
<td>문자열이 모두 문자로 이루어져 있는지 판단</td>
</tr>
<tr>
<td align="center">isalnum()</td>
<td>문자열이 문자+숫자로 이루어져 있는지 판단</td>
</tr>
<tr>
<td align="center">isdigit()</td>
<td>문자열이 모두 숫자로 이루어져 있는지 판단</td>
</tr>
<tr>
<td align="center">isdemical()</td>
<td>문자열이 모두 숫자로 이루어져 있는지 판단</td>
</tr>
<tr>
<td align="center">isnumeric()</td>
<td>문자열이 모두 숫자로 이루어져 있는지 판단</td>
</tr>
<tr>
<td align="center">isspace()</td>
<td>문자열이 모두 공백으로 이루어져 있는지 판단</td>
</tr>
<tr>
<td align="center">istitle()</td>
<td>문자열의 모든 단어들이 첫 문자가 대문자로 이루어져 있는지 판단</td>
</tr>
<tr>
<td align="center">split(문자)</td>
<td>문자열의 입력 받은 문자를 기준으로 쪼개어 반환</td>
</tr>
<tr>
<td align="center">join(문자)</td>
<td>문자열을 입력 받은 문자를 구분자로 한 새로운 문자열 반환</td>
</tr>
<tr>
<td align="center">replace(old, new, num)</td>
<td>old 문자를 new 문자로 num 숫자만큼 치환해 반환 → num은 생략 가능</td>
</tr>
<tr>
<td align="center">len(문자)</td>
<td>문자열 길이 반환</td>
</tr>
<tr>
<td align="center">find(찾을 문자열, 시작 위치, 끝나는 위치)</td>
<td>찾을 문자열 위치 반환 → 없으면 -1 반환</td>
</tr>
<tr>
<td align="center">index(찾을 문자열, 시작 위치, 끝나는 위치)</td>
<td>find 메서드와 같지만, 없으면 오류 반환</td>
</tr>
<tr>
<td align="center">rfind(찾을 문자열, 시작 위치, 끝나는 위치)</td>
<td>find 메서드와 같지만, 문자열의 끝에서부터 거꾸로 찾음</td>
</tr>
<tr>
<td align="center">rindex(찾을 문자열, 시작 위치, 끝나는 위치)</td>
<td>index 메서드와 같지만, 문자열의 끝에서부터 거꾸로 찾음</td>
</tr>
<tr>
<td align="center">startswitch(문자, 시작 위치, 끝나는 위치)</td>
<td>문자열이 입력한 문자로 시작하면 참, 그렇지 않으면 거짓 반환</td>
</tr>
<tr>
<td align="center">endswitch(문자, 시작 위치, 끝나는 위치)</td>
<td>문자열이 입력한 문자로 끝나면 참, 그렇지 않으면 거짓 반환</td>
</tr>
</tbody></table>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] BFS - 깊이 우선 탐색]]></title>
            <link>https://velog.io/@seohyun-j/Algorithm-BFS-%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89</link>
            <guid>https://velog.io/@seohyun-j/Algorithm-BFS-%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89</guid>
            <pubDate>Wed, 30 Mar 2022 08:12:48 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><strong>너비 우선 탐색이란,</strong></p>
<ul>
<li><p>루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법</p>
</li>
<li><p>시작 정점으로부터 가까운 정점을 먼저 방문하고 멀리 떨어져 있는 정점을 나중에 방문하는 순회 방법이다.</p>
</li>
<li><p>깊게 탐색하기 전에 넓게 탐색하는 것</p>
</li>
<li><p>사용하는 경우 : 두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고 싶을 때</p>
<blockquote>
</blockquote>
<p>  ➡️ 지구 상에 존재하는 모든 친구 관계를 그래프로 표현한 후 Ash와 Vanessa 사이에 존재하는 경로를 찾는 경우
  → 깊이 우선 탐색의 경우 : 모든 친구 관계를 다 살펴봐야 할지도 모름
  → 너비 우선 탐색의 경우 : Ash와 가까운 관계부터 탐색</p>
</li>
</ul>
</li>
</ol>
<ol start="2">
<li><p><strong>너비 우선 탐색의 특징</strong></p>
<ul>
<li>직관적이지 않은 면이 있다.<ul>
<li>BFS는 시작 노드에서 시작해서 거리에 따라 단계별로 탐색한다고 볼 수 있다.</li>
</ul>
</li>
<li>BFS는 재귀적으로 동작하지 않는다.</li>
<li>그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사해야 한다.<ul>
<li>이를 검사하지 않을 경우 <strong>무한루프에 빠질 위험</strong>이 있다.</li>
</ul>
</li>
<li>BFS는 방문한 노드들을 차례로 저장한 후 꺼낼 수 있는 자료 구조인 큐(Queue)를 사용한다.<ul>
<li>선입선출(FIFO) 원칙으로 탐색</li>
<li>일반적으로 큐를 이용해서 반복적 형태로 구현하는 것이 가장 잘 동작한다.</li>
</ul>
</li>
<li><strong>‘Prim’, ‘Dijkstra’</strong> 알고리즘과 유사하다.</li>
</ul>
</li>
<li><p><strong>너비 우선 탐색의 과정</strong></p>
<p> <img src="https://images.velog.io/images/seohyun-j/post/1440ca85-8b5d-4d27-a262-cab23bb82ac5/Untitled%20(8).png" alt=""></p>
</li>
<li><p><strong>너비 우선 탐색의 구현</strong></p>
<ul>
<li>자료 구조 큐(Queue)를 사용</li>
</ul>
</li>
<li><p><strong>너비 우선 탐색의 시간복잡도</strong></p>
<ul>
<li>BFS는 그래프(정점의 수 : N, 간선의 수 : E)의 모든 간선을 조회한다.<ul>
<li><strong>인접 리스트</strong>로 표현된 그래프의 시간복잡도 = $O(N+E)$</li>
<li><strong>인접 행렬</strong>로 표현된 그래프의 시간복잡도 = $O(N^2)$</li>
</ul>
</li>
<li>깊이 우선 탐색과 마찬가지로 그래프 내에서 적은 숫자의 간선만을 가지는 희소 그래프(Sparse Graph)의 경우 인접 행렬보다 인접 리스트를 사용하는 것이 유리하다.</li>
</ul>
</li>
</ol>
<h3 id="➰-references">➰ References</h3>
<blockquote>
<p><a href="https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html">https://gmlwjd9405.github.io/2018/08/15/algorithm-bfs.html</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm] DFS - 깊이 우선 탐색]]></title>
            <link>https://velog.io/@seohyun-j/Algorithm-DFS-%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89</link>
            <guid>https://velog.io/@seohyun-j/Algorithm-DFS-%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89</guid>
            <pubDate>Wed, 30 Mar 2022 08:09:26 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><strong>그래프 탐색이란,</strong></p>
<ul>
<li><p>하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하는 것</p>
<p>  → 특정 도시에서 다른 도시로 갈 수 있는지 없는지</p>
<p>  → 전자 회로에서 특정 단자와 단자가 서로 연결되어 있는지</p>
</li>
</ul>
</li>
<li><p><strong>깊이 우선 탐색이란,</strong></p>
<ul>
<li><p>루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기(branch)로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법</p>
</li>
<li><p>미로를 탐색할 때 한 방향으로 갈 수 있을 때까지 계속 가다가 더 이상 갈 수 없게 되면 다시 가장 가까운 갈림길로 돌아와서 이곳으로부터 다른 방향으로 다시 탐색을 진행하는 방법과 유사하다.</p>
</li>
<li><p>넓게 탐색하기 전에 깊게 탐색하는 것</p>
</li>
<li><p>사용하는 경우 : 모든 노드를 방문하고자 할 때 선택</p>
</li>
<li><p>깊이 우선 탐색 VS 너비 우선 탐색</p>
<table>
<thead>
<tr>
<th></th>
<th>깊이 우선 탐색</th>
<th>너비 우선 탐색</th>
</tr>
</thead>
<tbody><tr>
<td>복잡도</td>
<td>小</td>
<td>大</td>
</tr>
<tr>
<td>단순 검색 속도</td>
<td>大</td>
<td>小</td>
</tr>
</tbody></table>
</li>
</ul>
</li>
<li><p><strong>깊이 우선 탐색의 특징</strong></p>
<ul>
<li><p>자기 자신을 호출하는 순환 알고리즘의 형태를 가지고 있다.</p>
</li>
<li><p>전위 순회를 포함한 다른 형태의 트리 순회는 모두 DFS의 한 종류이다.</p>
</li>
<li><p>그래프 탐색의 경우 어떤 노드를 방문했었는지 여부를 반드시 검사해야 한다.</p>
<p>  → 이를 검사하지 않을 경우 무한 루프에 빠질 위험이 있다.</p>
</li>
</ul>
</li>
<li><p><strong>깊이 우선 탐색의 과정</strong></p>
<p> <img src="https://images.velog.io/images/seohyun-j/post/84a20ec8-47a8-48d2-b60a-c9996b977f0b/Untitled%20(7).png" alt=""></p>
</li>
<li><p><strong>깊이 우선 탐색의 구현방법</strong></p>
<ul>
<li><strong>순환 호출 이용</strong></li>
<li><strong>명시적 스택 사용</strong> : 명시적인 스택을 사용하여 방문한 정점들을 저장하였다가 다시 꺼내어 작업한다.</li>
</ul>
</li>
<li><p><strong>깊이 우선 탐색의 시간복잡도</strong></p>
<ul>
<li>DFS는 그래프(정점의 수 : N, 간선의 수 : E)의 모든 간선을 조회한다.<ul>
<li><strong>인접 리스트</strong>로 표현된 그래프의 시간복잡도 = $O(N+E)$</li>
<li><strong>인접 행렬</strong>로 표현된 그래프의 시간복잡도 = $O(N^2)$</li>
</ul>
</li>
<li>그래프 내의 적은 숫자의 간선만을 가지는 희소 그래프(Sparse Graph)의 경우 인접 행렬보다 인접 리스트를 사용하는 것이 유리하다.</li>
</ul>
</li>
</ol>
<h3 id="➰-references">➰ References</h3>
<blockquote>
<p><a href="https://gmlwjd9405.github.io/2018/08/14/algorithm-dfs.html">https://gmlwjd9405.github.io/2018/08/14/algorithm-dfs.html</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data Structure] Graph]]></title>
            <link>https://velog.io/@seohyun-j/Python-Graph</link>
            <guid>https://velog.io/@seohyun-j/Python-Graph</guid>
            <pubDate>Wed, 30 Mar 2022 07:31:25 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><strong>Graph의 개념</strong></p>
<p> 단순히 노드(N, node)와 그 노드를 연결하는 간선(E, Edge)을 하나로 모아 놓은 자료구조</p>
<ul>
<li><p>연결되어 있는 객체 간의 관계를 표현할 수 있는 자료구조임</p>
</li>
<li><p>그래프는 여러 개의 고립된 부분 그래프로 구성될 수 있음</p>
<blockquote>
</blockquote>
<p>💫 <strong>오일러 경로(Eulerian tour)</strong>
✅  그래프에 존재하는 모든 간선을 한 번만 통과하면서 처음 정점으로 되돌아오는 경로
✅  그래프의 모든 정점에 연결된 간선의 개수가 짝수일 때만 오일러 경로가 존재</p>
</li>
</ul>
</li>
</ol>
<ol start="2">
<li><strong>Graph와 관련된 용어</strong></li>
</ol>
<pre><code>| 정점 | 위치라는 개념 ( ≒ node ) |
| :---: | --- |
| 간선 | 위치 간의 관계 ( ≒ link, branch ) |
| 인접 정점 | 간선에 의해 직접 연결된 정점 |
| 정점의 차수  | 무방향 그래프에서 하나의 정점에 인접한 정점의 수&lt;/br&gt; → 무방향 그래프에 존재하는 정점의 모든 차수의 합&lt;/br&gt; = 그래프 간선 수의 2배 |
| 진입 차수 | 방향 그래프에서 외부에서 오는 간선의 수 ( ≒ 내차수 ) |
| 진출 차수 | 방향 그래프에서 외부로 향하는 간선의 수 ( ≒ 외차수 )&lt;/br&gt; → 방향 그래프에 있는 정점의 진입 차수 또는 진출 차수의 합&lt;/br&gt; = 방향 그래프의 간선의 수 ( 내차수 + 외차수 ) |
| 경로 길이 | 경로를 구성하는 데 사용된 간선의 수 |
| 단순 경로 | 경로 중에서 반복되는 정점이 없는 경우 |
| 사이클 | 단순 경로의 시작 정점과 종료 정점이 동일한 경우 |</code></pre><ol start="3">
<li><p><strong>Graph의 특징</strong></p>
<ul>
<li>그래프는 네트워크 모델임</li>
<li>2개 이상의 경로가 가능함 → 노드들 사이에 무방향/방향에서 양방향 경로를 가질 수 있음</li>
<li>self-loop 뿐 아니라 loop/circuit 모두 가능함</li>
<li>루트 노드라는 개념이 없음</li>
<li>부모-자식 관계가 없음</li>
<li>순회는 DFS나 BFS로 이루어짐</li>
<li>그래프는 순환(Cyclic) 혹은 비순환(Acyclic)임</li>
<li>그래프는 크게 방향 그래프와 무방향 그래프가 있음</li>
<li>간선의 유무는 그래프에 따라 다름</li>
</ul>
</li>
<li><p><strong>Graph의 종류</strong></p>
<ul>
<li><p>무방향 그래프 (Undirected Graph)</p>
<ul>
<li>무방향 그래프의 간선은 간선을 통해서 양방향으로 갈 수 있음</li>
<li>정점 A와 정점 B를 연결하는 간선은 $(A, B)$ 또는 $(B, A)$와 같이 정점의 쌍으로 표현함</li>
</ul>
</li>
<li><p>방향 그래프 (Directed Graph)</p>
<ul>
<li>간선에 방향성이 존재하는 그래프</li>
<li>A → B로만 갈 수 있는 간선은 $&lt;A, B&gt;$로 표시함</li>
</ul>
</li>
<li><p>가중치 그래프 (Weighted Graph)</p>
<ul>
<li>간선에 비용이나 가중치가 할당된 그래프</li>
<li>‘네트워크’ 라고도 함</li>
</ul>
</li>
<li><p>연결 그래프 (Connected Graph)</p>
<ul>
<li>무방향 그래프에 있는 모든 정점 쌍에 대해서 항상 경로가 존재하는 경우</li>
</ul>
</li>
<li><p>비연결 그래프 (Disconnected Graph)</p>
<ul>
<li>무방향 그래프에서 특정 정점 쌍 사이에 경로가 존재하지 않는 경우</li>
</ul>
</li>
<li><p>순환 그래프 (Cyclic Graph)</p>
<ul>
<li><p>단순 경로의 시작 정점과 종료 정점이 동일한 경우</p>
<p>  ( 단순 경로 : 경로 중에서 반복되는 정점이 없는 경우 )</p>
</li>
</ul>
</li>
<li><p>비순환 그래프 (Acyclic Graph)</p>
<ul>
<li>사이클이 없는 그래프</li>
</ul>
</li>
<li><p>완전 그래프 (Complete Graph)</p>
<ul>
<li>그래프에 속해 있는 모든 정점이 서로 연결되어 있는 그래프</li>
<li>무방향 완전 그래프에서 정점 수가 $n$이면 간선의 수는 $n*(n-1)/2$임</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>Graph의 구현</strong></p>
<ul>
<li><p>인접 리스트 (Adjacency List)</p>
<ul>
<li><p>각 정점에 인접한 정점들을 연결 리스트로 표현함</p>
</li>
<li><p>파이썬은 포인터가 따로 존재하지 않으므로, 연결리스트를 구현하기 까다로움</p>
<p>  ∴ 인접 리스트를 출발 노드를 키로, 도착 노드를 값으로 표현하는 딕셔너리 형태로 표현함, 도착 노드의 경우에는 여러 개의 노드가 가능하므로 값은 리스트 형태로 표현함</p>
<pre><code class="language-python">  graph = { 0 : [1],
            1 : [0, 2],
            2 : [] }</code></pre>
</li>
</ul>
</li>
<li><p>인접 행렬 (Adjacency Matrix)</p>
<ul>
<li><p>정점의 개수를 k라고 했을 때, k*k matrix를 정의함</p>
</li>
<li><p>각 row는 해당 정점의 연결 상태를 의함</p>
</li>
<li><p>공간 복잡도는 $O(N^2)$로 희소 그래프인 경우 매우 비효율적임</p>
<p>  ∵ 인접 리스트는 어떤 노드에 인접한 노드들을 쉽게 찾을 수 있지만, 인접 행렬에서는 인접한 노드를 찾기 위해서는 모든 노드를 전부 순회해야 함</p>
</li>
<li><p>무방향 그래프를 인접 행렬로 표현하면 이 행렬은 대칭 행렬이 됨</p>
<ul>
<li>물론 방향 그래프는 대칭 행렬이 안될 수도 있음</li>
</ul>
</li>
</ul>
</li>
<li><p>인접 리스트 VS 인접 행렬</p>
<ul>
<li>인접 리스트<ul>
<li>그래프 내에서 적은 숫자의 간선만 가지는 희소 그래프의 경우</li>
<li>장점<ol>
<li>어떤 노드에 인접한 노드들을 쉽게 찾을 수 있음</li>
<li>그래프에 존재하는 모든 간선의 수는 $O(N+E)$ 안에 알 수 있음 → 인접 리스트 전체를 조사함</li>
</ol>
</li>
<li>단점<ol>
<li>간선의 존재 여부와 정점의 차수 : 정점 i의 리스트에 있는 노드의 수 → 정점 차수만큼의 시간이 필요</li>
</ol>
</li>
</ul>
</li>
<li>인접 행렬<ul>
<li>그래프에 간선이 많이 존재하는 밀집 그래프의 경우</li>
<li>장점<ol>
<li>두 정점을 연결하는 간선의 존재 여부를 $O(1)$ 안에 즉시 알 수 있음</li>
<li>정점의 차수는 $O(N)$ 안에 알 수 있음 → 인접 배열의 i번 째 행 또는 열을 모두 더함</li>
</ol>
</li>
<li>단점<ol>
<li>어떤 노드에 인접한 노드들을 찾기 위해서는 모든 노드를 전부 순회해야 함</li>
<li>그래프에 존재하는 모든 간선의 수는 $O(N^2)$ 안에 알 수 있음 → 인접 행렬 전체를 조사함</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>Graph의 탐색</strong></p>
<ul>
<li>DFS<ul>
<li>루트 노드에서 시작해서 다음 분기로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법</li>
<li>모든 노드를 방문하고자 할 때 이 방법을 선택함</li>
</ul>
</li>
<li>BFS<ul>
<li>루트 노드에서 시작해서 인접한 노드를 먼저 탐색하는 방법</li>
<li>두 노드 사이의 최단 경로 혹은 임의의 경로를 찾고 싶을 때 이 방법을 선택</li>
</ul>
</li>
</ul>
</li>
</ol>
<h3 id="➰-references">➰ References</h3>
<blockquote>
<p><a href="https://gmlwjd9405.github.io/2018/08/13/data-structure-graph.html">https://gmlwjd9405.github.io/2018/08/13/data-structure-graph.html</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data Structure] Queue]]></title>
            <link>https://velog.io/@seohyun-j/Python-Queue</link>
            <guid>https://velog.io/@seohyun-j/Python-Queue</guid>
            <pubDate>Wed, 30 Mar 2022 06:44:12 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><strong>Queue의 개념</strong></p>
<p> 컴퓨터의 기본적인 자료 구조의 한 가지로, 먼저 집어 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조로 저장하는 형식</p>
</li>
<li><p><strong>Queue의 사용 사례</strong></p>
<p> 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용</p>
<ul>
<li>BFS 구현<ul>
<li>처리해야 할 노드의 리스트를 저장하는 용도로 Queue를 사용</li>
<li>노드를 하나 처리할 때마다 해당 노드와 인접한 노드들을 큐에 다시 저장</li>
<li>노드를 접근한 순서대로 처리할 수 있음</li>
</ul>
</li>
<li>캐시 구현</li>
<li>우선순위가 같은 작업 예약 (인쇄 대기열)</li>
<li>선입선출이 필요한 대기열 (티켓 카운터)</li>
<li>콜센터 고객 대기시간</li>
<li>프린터의 출력 처리</li>
<li>윈도우 시스템의 메시지 처리기</li>
<li>프로세스 관리</li>
</ul>
</li>
<li><p><strong>Python Queue</strong></p>
<ul>
<li><p>List 이용</p>
<ul>
<li><p><code>append()</code>메소드와 <code>pop()</code>메소드를 이용하여 구현 가능</p>
</li>
<li><p>pop 연산의 시간 복잡도는 $O(N)$ 이어서 N이 커질 수록 연산이 매우 느려짐</p>
<p>  ∴ 큐 자료구조 사용할 때 List는 추천하지 않음</p>
</li>
</ul>
</li>
<li><p>Deque 이용</p>
<ul>
<li><code>from collections import deque</code>를 이용하여 deque 라이브러리 import</li>
<li><code>append()</code>메소드와 <code>popleft()</code>메소드를 이용하여 구현 가능</li>
<li>$O(1)$의 시간 복잡도를 갖기 때문에 List 자료 구조보다 성능이 훨씬 뛰어남</li>
<li>단점 : 무작위 접근의 시간 복잡도가 $O(N)$이고, 내부적으로 linked list를 사용하고 있기 때문에 N번째 데이터에 접근하려면 N번의 순회가 필요함</li>
</ul>
</li>
<li><p>Queue 이용</p>
<ul>
<li>from queue import Queue를 이용하여 queue 라이브러리 import</li>
<li><code>put()</code> 메소드와 <code>get()</code> 메소드를 이용하여 구현 가능</li>
<li>Queue의 성능은 Deque의 성능과 동일<ul>
<li>데이터 추가/삭제 시간 복잡도 = $O(1)$</li>
<li>데이터 접근 시간 복잡도 = $O(N)$임</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
<pre><code>### ➰ References

&gt; [https://gmlwjd9405.github.io/2018/08/02/data-structure-queue.html](https://gmlwjd9405.github.io/2018/08/02/data-structure-queue.html)
[https://velog.io/@sossont/Python-Queue-자료구조-사용하기](https://velog.io/@sossont/Python-Queue-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0)
&gt;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Data Structure] Heap]]></title>
            <link>https://velog.io/@seohyun-j/Python-Heap</link>
            <guid>https://velog.io/@seohyun-j/Python-Heap</guid>
            <pubDate>Wed, 30 Mar 2022 06:42:40 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><strong>Heap의 개념</strong></p>
<ul>
<li>완전 이진 트리의 일종으로 우선순위 큐를 위하여 만들어진 자료구조</li>
<li>여러 개의 값들 중에서 최댓값이나 최솟값을 빠르게 찾아내도록 만들어진 자료구조</li>
<li>힙은 일종의 반정렬 상태(느슨한 정렬 상태) 를 유지함<ul>
<li>큰 값이 상위 레벨이 있고, 작은 값이 하위 레벨에 있다는 정도</li>
<li>간단히 말하면 부모 노드의 키 값이 자식 노드의 키 값보다 항상 큰(작은) 이진 트리를 말함</li>
</ul>
</li>
<li>힙 트리에서는 중복된 값을 허용함 ↔ 이진 탐색 트리에서는 중복된 값을 허용하지 않음</li>
</ul>
</li>
<li><p><strong>Heap의 종류</strong></p>
<p> <img src="https://images.velog.io/images/seohyun-j/post/399f988b-b8d9-4e9f-b7c8-3f9e7db6fc9d/Untitled%20(6).png" alt=""></p>
<ul>
<li>최대 힙 (Max Heap)<ul>
<li>부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리</li>
<li>key(부모 노드) ≥ key(자식 노드)</li>
</ul>
</li>
<li>최소 힙(Min Heap)<ul>
<li>부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리</li>
<li>key(부모 노드) ≤ key(자식 노드)</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>Python Heap</strong></p>
<ul>
<li><code>import heapq</code>를 이용하여 heap 라이브러리 import</li>
<li><code>heapq.heappush(‘리스트’, item)</code> : 리스트에 item 추가</li>
<li><code>heapq.heappop(‘리스트’)</code> : heap에서 가장 작은 원소 pop → 비어있으면 <code>IndexError</code></li>
<li><code>heapq.heapify(‘리스트’)</code> : 리스트를 즉각적으로 heap으로 변환</li>
<li><code>heapq.nlargest(n, ‘리스트’)</code> : 큰 값부터 n개를 리스트 형태로 출력</li>
<li><code>heapq.nsmallest(n, ‘리스트’)</code> : 작은 값부터 n개를 리스트 형태로 출력</li>
</ul>
</li>
</ol>
<h3 id="➰-references">➰ References</h3>
<blockquote>
<p><a href="https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html">https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data Structure] Stack]]></title>
            <link>https://velog.io/@seohyun-j/Python-Stack</link>
            <guid>https://velog.io/@seohyun-j/Python-Stack</guid>
            <pubDate>Wed, 30 Mar 2022 06:41:48 GMT</pubDate>
            <description><![CDATA[<ol>
<li><p><strong>Stack의 개념</strong></p>
<p> 한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO 형식의 자료구조</p>
</li>
<li><p><strong>Stack의 사용 사례</strong></p>
<p> 재귀 알고리즘을 사용하는 경우 스택이 유용함</p>
<ul>
<li>재귀 알고리즘<ul>
<li>재귀 적으로 함수를 호출해야 하는 경우에 임시 데이터를 스택에 넣어줌</li>
<li>재귀 함수를 빠져 나와 퇴각 검색(backtrack)을 할 때는 스택에 넣어 두었던 임시 데이터를 빼줘야 함</li>
<li>스택은 이런 일련의 행위를 직관적으로 가능하게 해줌</li>
<li>스택은 재귀 알고리즘을 반복적 형태를 통해 구현할 수 있게 해줌</li>
</ul>
</li>
<li>웹 브라우저 방문 기록 (뒤로가기)</li>
<li>실행 취소 (Undo)</li>
<li>역순 문자열 만들기</li>
<li>수식의 괄호 검사 (연산자 우선순위 표현을 위한 괄호 검사)</li>
<li>후위 표기법 계산</li>
</ul>
</li>
<li><p><strong>Python Stack</strong></p>
<ul>
<li><code>push()</code> : 스택에 원소 추가</li>
<li><code>pop()</code> : 스택 가장 위에 있는 원소를 삭제하고, 그 원소를 반환</li>
<li><code>peek()</code> : 스택 가장 위에 있는 원소를 반환 (삭제X)</li>
<li><code>empty()</code> : 스택이 비어 있다면 1, 아니면 0을 반환</li>
</ul>
</li>
</ol>
<h3 id="➰-references">➰ References</h3>
<blockquote>
<p><a href="https://gmlwjd9405.github.io/2018/08/03/data-structure-stack.html">https://gmlwjd9405.github.io/2018/08/03/data-structure-stack.html</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Data Structure] Tree]]></title>
            <link>https://velog.io/@seohyun-j/Python-Tree</link>
            <guid>https://velog.io/@seohyun-j/Python-Tree</guid>
            <pubDate>Wed, 30 Mar 2022 06:40:01 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>💫 트리는 노드로 이루어진 자료 구조
  ✅ 트리는 하나의 루트 노드를 갖는다.
  ✅ 루트 노드는 0개 이상의 자식 노드를 갖고 있다.
  ✅ 그 자식 노드 또한 0개 이상의 자식 노드를 갖고 있고, 이는 반복적으로 정의된다.</p>
<ul>
<li>노드(node)들과 노드들을 연결하는 간선(edge)들로 구성되어 있다.<ul>
<li>트리에는 사이클(cycle)이 존재할 수 없다.</li>
<li>노드들은 특정 순서로 나열될 수도 있고, 그럴 수 없을 수도 있다.</li>
<li>각 노드는 부모 노드로의 연결이 있을 수도 있고, 없을 수도 있다.</li>
<li>각 노드는 어떤 자료형으로도 표현 가능하다.</li>
</ul>
</li>
<li>비선형 자료구조로 계층적 관계를 표현한다.</li>
<li>그래프의 한 종류이다.<ul>
<li>Cycle이 없는 하나의 연결 그래프(Connected Graph)</li>
<li>DAG(Directed Acyclic Graph, 방향성이 있는 비순환 그래프)</li>
</ul>
</li>
</ul>
<ol start="2">
<li><p><strong>트리 관련 용어</strong></p>
<p> <img src="https://images.velog.io/images/seohyun-j/post/19e19c95-3235-4b51-829a-b1436ced9969/Untitled.png" alt=""></p>
<table>
<thead>
<tr>
<th>루트 노드</th>
<th>부모가 없는 노드, 트리는 하나의 루트 노드만을 가진다.</th>
</tr>
</thead>
<tbody><tr>
<td>단말 노드</td>
<td>자식이 없는 노드</td>
</tr>
<tr>
<td>내부 노드</td>
<td>단말 노드가 아닌 노드</td>
</tr>
<tr>
<td>간선</td>
<td>노드를 연결하는 선 ( ≒ link, branck )</td>
</tr>
<tr>
<td>형제</td>
<td>같은 부모를 가지는 노드</td>
</tr>
<tr>
<td>노드의 크기</td>
<td>자신을 포함한 모든 자손 노드의 개수</td>
</tr>
<tr>
<td>노드의 깊이</td>
<td>루트에서 어떤 노드에 도달하기 위해 거쳐야 하는 간선의 수</td>
</tr>
<tr>
<td>노드의 레벨</td>
<td>트리의 특정 깊이를 가지는 노드의 집합</td>
</tr>
<tr>
<td>노드의 차수</td>
<td>하위 트리 개수 / 간선 수 ⇒ 각 노드가 가진 가지의 수</td>
</tr>
<tr>
<td>트리의 차수</td>
<td>트리의 최대 차수</td>
</tr>
<tr>
<td>트리의 높이</td>
<td>루트 노드에서 가장 깊숙히 있는 노드의 깊이</td>
</tr>
</tbody></table>
</li>
<li><p><strong>트리 특징</strong></p>
<ul>
<li>그래프의 한 종류이다. <strong>‘최소 연결 트리’</strong>라고도 불린다.</li>
<li>트리는 <strong>계층 모델</strong>이다.</li>
<li>트리는 DAG(방향성이 있는 비순환 그래프)의 한 종류이다.<ul>
<li>loop나 circuit이 없다. 당연히 self-loop도 없다 → 사이클이 없다.</li>
</ul>
</li>
<li>노드가 N개인 트리는 항상 N-1개의 간선(edge)을 가진다.</li>
<li>루트에서 어떤 노드로 가는 경로는 유일하다.<ul>
<li>임의의 두 노드 간의 경로도 유일하다 → 두 개의 정점 사이에 반드시 1개의 경로만을 가짐</li>
</ul>
</li>
<li>한 개의 루트 노드만이 존재하며 모든 자식 노드는 한 개의 부모 노드만을 가진다.<ul>
<li>부모-자식 관계이므로 흐름은 top-bottom 아니면 bottom-top으로 이루어진다.</li>
</ul>
</li>
<li>순회는 Pre-Order, In-Order, Post-Order로 이루어진다. 이 3가지 모두 DFS/BFS 안에 있다.</li>
<li>트리는 이진 트리, 이진 탐색 트리, 균형 트리(AVL 트리, red-black 트리), 이진 힙(최대 힙, 최소 힙) 등이 있다.</li>
</ul>
</li>
<li><p><strong>트리 종류</strong></p>
<ul>
<li><strong>이진 트리 (Binary Tree)</strong><ul>
<li>각 노드가 최대 두개의 자식을 갖는 트리</li>
<li>모든 트리가 이진 트리는 아님</li>
<li>이진 트리 순회 방법</li>
</ul>
</li>
</ul>
</li>
</ol>
<pre><code>        | 중위 순회(in-order traversal) | Left → Root → Right |
        | --- | --- |
        | 전위 순회(pre-order traversal) | Root → Left → Right |
        | 후위 순회(post-order traversal) | Left → Right → Root |

- **이진 탐색 트리 (Binary Search Tree)**
    - 모든 노드가 아래와 같은 특정 순서를 따르는 속성이 있는 이진 트리
    - 모든 왼쪽 자식들 ≤ n &lt; 모든 오른쪽 자식들 (모든 노드 n에 대해서 반드시 참)

        ![](https://images.velog.io/images/seohyun-j/post/5abe733b-6d3d-434b-9a55-385b74d75877/Untitled%20(1).png)


- **균형 트리**
    - $O(logN)$ 시간에 insert와 find를 할 수 있을 정도로 균형이 잘 잡혀 있는 경우

- **완전 이진 트리 (Complete Binary Tree)**

    ![](https://images.velog.io/images/seohyun-j/post/0615b98e-dd67-4366-aba9-c996f24edb5f/Untitled%20(2).png)

    - 트리의 모든 높이에서 노드가 꽉 차 있는 이진 트리 → 마지막 레벨을 제외하고 모든 레벨이 완전히 채워져 있음
    - 마지막 레벨은 꽉 차 있지 않아도 되지만 노드가 왼쪽에서 오른쪽으로 채워져야 함
    - 마지막 레벨 $h$에서 $(h$~$2h-1)$개의 노드를 가질 수 있음
    - 가장 오른쪽의 단말 노드가 (아마도 모두) 제거된 포화 이진 트리
    - 완전 이진 트리는 배열을 사용해 효율적으로 표현이 가능함

- **전 이진 트리 (Full Binary Tree 또는 Strictly Binary Tree)**

    ![](https://images.velog.io/images/seohyun-j/post/5b9f9c20-2bd5-4290-bdef-5a61edf63823/Untitled%20(4).png)

    - 모든 노드가 0개 또는 2개의 자식 노드를 갖는 트리

- **포화 이진 트리 (Perfect Binary Tree)**

    ![](https://images.velog.io/images/seohyun-j/post/fbe1acbc-d9e4-4ef5-a9d7-4b3d113eb11d/Untitled%20(5).png)

    - 전 이진 트리이면서 완전 이진 트리인 경우
    - 모든 말단 노드는 같은 높이에 있어야 하며, 마지막 단계에서 노드의 개수가 최대가 되어야 함
    - 모든 내부 노드가 두 개의 자식 노드를 가짐
    - 모든 말단 노드가 동일한 깊이 또는 레벨을 갖음
    - 노드의 개수가 정확히 $2^k-1$개여야 함 ( $k$ : 트리의 높이 ) → 흔하게 나타나는 경우가 아님. 이진 트리가 모두 포화 이진 트리일 것이라고 생각말 것

- **이진 힙 (최소힙과 최대힙)**
    - 최소힙(Min Heap)
        - 트리의 마지막 단계에서 오른쪽 부분을 뺀 나머지 부분이 가득 채워져 있는 완전 이진 트리이며, 각 노드의 원소가 자식들의 원소보다 작음
        - key(부모 노드) ≥ key(자식 노드)인 완전 이진 트리
        - 가장 큰 값은 루트 노드임
        - N개가 힙에 들어가 있으면 높이는 $log(N)$임
    - 최대힙(Max Heap)
        - 원소가 내림차순으로 정렬되어 있다는 점에서만 최소힙과 다름
        - 각 노드의 원소가 자식들의 원소보다 큼

- **트라이 (Trie)** **→ 접두사 트리(Prefix Tree)라고도 부름**
    - n-차 트리의 변종
    - 각 노드에 문자를 저장하는 자료구조 → ∴ 트리를 아래쪽으로 순회하면 단어 하나가 나옴
    - 접두사를 빠르게 찾아보기 위한 흔한 방식으로, 모든 언어를 트라이에 저장해 놓는 방식이 있음
    - 유효한 단어 집합을 이용하는 많은 문제들은 트라이를 통해 최적화할 수 있음</code></pre><ol start="5">
<li><p><strong>트리 구현 방법</strong></p>
<ul>
<li><p>인접 배열 이용</p>
<ul>
<li><p>1차원 배열에 자신의 부모 노드만 저장하는 방법</p>
<p>  ∵ 트리는 부모 노드를 0개 또는 1개를 가지기 때문</p>
</li>
<li><p>이진 트리의 경우, 2차원 배열에 자식 노드를 저장하는 방법</p>
<p>  ∵ 이진 트리는 각 노드가 최대 두개의 자식을 갖는 트리이기 때문</p>
</li>
</ul>
</li>
<li><p>인접 리스트 이용</p>
<ul>
<li>가중치가 없는 트리의 경우</li>
<li>가중치가 있는 트리의 경우</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>그래프와 트리의 차이</strong></p>
</li>
</ol>
<pre><code>|  | 그래프 | 트리 |
| :---: | --- | --- |
| 정의 | 노드와 그 노드를 연결하는 간선을 하나로 모아 놓은 자료구조 | 그래프의 한 종류로 DAG(방향성이 있는 비순환 그래프)의 한 종류 |
| 방향성 | 방향 그래프, 무방향 그래프 모두 존재 | 방향 그래프 |
| 사이클 | 사이클 가능&lt;/br&gt; 자체 간선(self-loop)도 가능&lt;/br&gt; 순환 그래프&lt;/br&gt; 비순환 그래프 모두 존재 | 사이클 불가능&lt;/br&gt; 자체 간선(self-loop)도 불가능&lt;/br&gt; 비순환 그래프 |
| 루트 노드 | 루트 노드의 개념 없음 | 한 개의 루트 노드만 존재하고, 모든 자식 노드는 한 개의 부모 노드만을 가짐 |
| 부모-자식 | 부모-자식 개념 X | 부모-자식 개념 O&lt;/br&gt; ∴ top-bottom 또는 bottom-top으로 이루어짐 |
| 모델 | 네트워크 모델 | 계층 모델 |
| 순회 | DFS, BFS | DFS, BFS안의 Pre-, In-, Post-order |
| 간선의 수 | 그래프에 따라 간선의 수가 다름, 간선이 없을 수도 있음 | 노드가 N인 트리는 항상 N-1의 간선을 가짐 |
| 경로 |  | 임의의 두 노드간의 경로는 유일 |
| 예시 및 종류 | 지도, 지하철 노선의 최단 경로, 전기 회로의 소자들, 도로(교차점과 일방 통행길), 선수 과목 | 이진 트리, 이진 탐색 트리, 균형 트리, 이진 힙 등 |</code></pre><h3 id="➰-preferences">➰ Preferences</h3>
<blockquote>
<p><a href="https://gmlwjd9405.github.io/2018/08/12/data-structure-tree.html">https://gmlwjd9405.github.io/2018/08/12/data-structure-tree.html</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[수식 계산기 만들기 | Toy Project]]></title>
            <link>https://velog.io/@seohyun-j/%EC%88%98%EC%8B%9D-%EA%B3%84%EC%82%B0%EA%B8%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0-Toy-Project</link>
            <guid>https://velog.io/@seohyun-j/%EC%88%98%EC%8B%9D-%EA%B3%84%EC%82%B0%EA%B8%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0-Toy-Project</guid>
            <pubDate>Thu, 03 Mar 2022 08:24:17 GMT</pubDate>
            <description><![CDATA[<h2 id="django로-처음하는-나의-프로젝트">Django로 처음하는 나의 프로젝트</h2>
<blockquote>
<h4 id="1-프로젝트-계기">1. 프로젝트 계기</h4>
<p>공대생이라면 공감을 하겠지만, 내가 공부하고 있는 이 수식의 계산이 정확한지 알 수가 없을 때가 많다.
친절한 책이라면 답지가 존재하겠지만 학교에서 사용하는 책의 경우 해설지가 존재하지 않아 이 답이 정확한 것일까 생각이 들며 자신감이 떨어지기 마련이다. 여담이지만.. 학교에서 사용하는 책의 제목을 구글링하면 제일 먼저 나오는 연관 검색어는 solution 아닐까 싶다 ㅋㅋ
그래서 답이라도 정확히 알며 공부하면 좋겠다는 생각으로 시작하는 나의 첫번째 토이프로젝트 좋은 결과가 있기를 바라며 !</p>
</blockquote>
<h4 id="2-왜-django로-">2. 왜 Django로 ?</h4>
<p>흔히 하는 토이프로젝트인 계산기 만들기는 javascript와 html로 이루어져 있는데, 수식계산기 웹인 만큼 파이썬만큼의 수식이 필요하다 생각하여 Django로 시작해보고자한다. 처음으로 쓰는 Django로 완벽하게 만들어 볼 수 있을까 걱정이 들지만,,</p>
]]></description>
        </item>
    </channel>
</rss>