<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>johnberman-j.log</title>
        <link>https://velog.io/</link>
        <description>조금 늦어도 꾸준하게</description>
        <lastBuildDate>Wed, 16 Mar 2022 16:42:07 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. johnberman-j.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/johnberman-j" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[백준 - 9461번: 파도반 수열 - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-9461%EB%B2%88-%ED%8C%8C%EB%8F%84%EB%B0%98-%EC%88%98%EC%97%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-zcv5dwun</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-9461%EB%B2%88-%ED%8C%8C%EB%8F%84%EB%B0%98-%EC%88%98%EC%97%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-zcv5dwun</guid>
            <pubDate>Wed, 16 Mar 2022 16:42:07 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---9461번-파도반-수열">백준 - 9461번: 파도반 수열</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/34671230-f00a-4fa8-992b-893be270e0bb/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/5b1e85ef-1c11-4393-a6b3-b5a78ddf776c/image.png" alt=""></p>
<pre><code>length = int(input())
dp = [0] * 100

dp[0] = 1
dp[1] = 1
dp[2] = 1

for i in range(3, len(dp)):
    dp[i] = dp[i-3] + dp[i-2]

for i in range(length):
    ipt = int(input())
    print(dp[ipt-1])</code></pre><p>동적프로그래밍(Dynamic Programming) 문제</p>
<ul>
<li>조건에 맞는 삼각형의 변의 길이의 규칙을 찾아내어 이를 구현하는 문제</li>
<li><strong>dp에 해당하는 변의 길이를 메모하고, 이 값을 계속적으로 이용하며 변의 길이를 구한다</strong></li>
<li>해당 index의 변의 길이를 출력</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 2579번: 계단 오르기 - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-2579%EB%B2%88-%EA%B3%84%EB%8B%A8-%EC%98%A4%EB%A5%B4%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-2579%EB%B2%88-%EA%B3%84%EB%8B%A8-%EC%98%A4%EB%A5%B4%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Tue, 15 Mar 2022 15:25:58 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---2579번-계단-오르기">백준 - 2579번: 계단 오르기</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/72c783ce-54af-415c-84f5-552b816d086b/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/8e1f1873-102a-4b73-8f0d-b720527b56bf/image.png" alt=""></p>
<pre><code>length = int(input())
score = [0]*300

for i in range(length):
    score[i] = int(input())

dp = [0]*300
dp[0] = score[0]
dp[1] = max(score[0]+score[1], score[1])
dp[2] = max(score[0]+score[2], score[1]+score[2])

for i in range(3, length):
    dp[i] = max(score[i]+dp[i-2], score[i]+score[i-1]+dp[i-3])

print(dp[length-1])</code></pre><p>동적프로그래밍(Dynamic Programming) 문제</p>
<ul>
<li>밟는 계단의 점수가 주어질 때 이의 최대값을 구현하는 문제</li>
<li>계단을 연달아 3개를 밟을 수 없다는 조건이 주어진다</li>
<li><strong>내가 밟은 계단의 위치에서 -1칸과 -2칸의 값을 더한 후 비교하여 최대값을 dp리스트에 저장해준다!</strong></li>
<li>최종적으로 구해진 dp리스트의 마지막 값을 출력</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트 - enum]]></title>
            <link>https://velog.io/@johnberman-j/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-enum</link>
            <guid>https://velog.io/@johnberman-j/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-enum</guid>
            <pubDate>Tue, 15 Mar 2022 15:14:14 GMT</pubDate>
            <description><![CDATA[<h3 id="1-enum의-정의">1. enum의 정의</h3>
<blockquote>
<p><em><strong>집합의 데이터 타입</strong></em>. 이넘은 특정 값들의 집합을 의미하는 자료형이다. enum은 열거형(enumerated type)이라고 부른다. 열거형은 서로 연관된 상수들의 집합이라고 할 수 있다.  </p>
</blockquote>
<ul>
<li><p>숫자형 enum
<img src="https://images.velog.io/images/johnberman-j/post/6688df89-1da5-4b65-8835-0ae72cac1ac8/image.png" alt=""></p>
</li>
<li><p>문자형 enum
<img src="https://images.velog.io/images/johnberman-j/post/39cdf6a1-20a4-425e-b637-c974528cf288/image.png" alt=""></p>
</li>
<li><p>enum의 활용 사례
<img src="https://images.velog.io/images/johnberman-j/post/0a9a3bae-e15f-406a-bedc-00c0e34f4787/image.png" alt=""></p>
</li>
<li><p>enum의 특징</p>
<blockquote>
<p>열거형(enum)의 특성을 정리해보자. 열거형은 연관된 값들을 저장한다. 또 그 값들이 변경되지 않도록 보장한다.</p>
</blockquote>
</li>
<li><p>참조: <a href="https://opentutorials.org/course/2517/14151" target="_blank">생활코딩</a></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 2609번: 최대공약수와 최소공배수 - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-2609%EB%B2%88-%EC%B5%9C%EB%8C%80%EA%B3%B5%EC%95%BD%EC%88%98%EC%99%80-%EC%B5%9C%EC%86%8C%EA%B3%B5%EB%B0%B0%EC%88%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-2609%EB%B2%88-%EC%B5%9C%EB%8C%80%EA%B3%B5%EC%95%BD%EC%88%98%EC%99%80-%EC%B5%9C%EC%86%8C%EA%B3%B5%EB%B0%B0%EC%88%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Mon, 14 Mar 2022 14:02:06 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---2609번-최대공약수와-최소공배수">백준 - 2609번: 최대공약수와 최소공배수</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/aed2d835-694d-40ca-af86-9c082b576329/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/7dcde622-47d5-446b-9c9d-8977909b702d/image.png" alt=""></p>
<pre><code>import math


m,n = map(int, input().split())

max_common = math.gcd(m,n)
min_common = abs(m*n)//max_common

print(max_common)
print(min_common)</code></pre><p>수학 구현 문제</p>
<ul>
<li>자연수 두 개가 주어질 때, 두 수의 최대 공약수와 최소 공배수를 구하는 문제</li>
<li>입력으로 두 개의 자연수가 주어짐</li>
<li>파이썬의 math 라이브러리를 이용하여 구현!
=&gt; Tip!<blockquote>
<p>&quot;/&quot;는 연산 결과가 float 형태로 나타 내어 진다
&quot;//&quot;는 연산 결과가 int 형태로 나타 내어 진다</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 깊이 우선 탐색(DFS)]]></title>
            <link>https://velog.io/@johnberman-j/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89DFS</link>
            <guid>https://velog.io/@johnberman-j/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B9%8A%EC%9D%B4-%EC%9A%B0%EC%84%A0-%ED%83%90%EC%83%89DFS</guid>
            <pubDate>Mon, 14 Mar 2022 11:47:22 GMT</pubDate>
            <description><![CDATA[<h3 id="1-깊이-우선-탐색dfs">1. 깊이 우선 탐색(DFS)</h3>
<blockquote>
<p>자료의 검색, 트리나 그래프를 탐색하는 방법. 한 노드를 시작으로 인접한 다른 노드를 재귀적으로 탐색해가고 끝까지 탐색하면 다시 위로 와서 다음을 탐색하여 검색한다. </p>
</blockquote>
<ul>
<li>출처: [컴퓨터인터넷IT용어대사전]</li>
</ul>
<p>자료 1) 깊이 우선 탐색의 예시
<img src="https://images.velog.io/images/johnberman-j/post/95f9c472-2a8b-4638-9ab6-6dc9ef5f587b/Depth-First-Search.gif" alt="">
출처: <a href="https://ko.wikipedia.org/wiki/%EA%B9%8A%EC%9D%B4_%EC%9A%B0%EC%84%A0_%ED%83%90%EC%83%89" target="_blank">위키백과</a></p>
<h3 id="2-깊이-우선-탐색의-장점과-단점">2. 깊이 우선 탐색의 장점과 단점</h3>
<h4 id="장점">장점</h4>
<ul>
<li>단지 현 경로상의 노드들만을 기억하면 되므로 <strong>저장공간의 수요가 비교적 적다</strong>.</li>
<li>목표노드가 깊은 단계에 있을 경우 해를 빨리 구할 수 있다.<h4 id="단점">단점</h4>
</li>
<li><strong>해가 없는 경로에 깊이 빠질 가능성</strong>이 있다. 따라서 실제의 경우 미리 지정한 임의의 깊이까지만 탐색하고 목표노드를 발견하지 못하면 다음의 경로를 따라 탐색하는 방법이 유용할 수 있다. <em><strong>즉, 탈출 조건을 정해줘야 한다.</strong></em></li>
<li><strong>얻어진 해가 최단 경로가 된다는 보장이 없다.</strong> 이는 목표에 이르는 경로가 다수인 문제에 대해 깊이우선 탐색은 해에 다다르면 탐색을 끝내버리므로, 이때 얻어진 해는 최적이 아닐 수 있다는 의미이다.</li>
</ul>
<h3 id="3-dfs의-구현">3. DFS의 구현</h3>
<blockquote>
<p>깊이우선탐색은 재귀함수, 혹은 자료구조의 하나인 스택(stack)으로 구현이 가능하다.
그러나 여기서 탈출 조건 없이 재귀함수를 이용할 때 <strong>무한정 깊어지는 노드가 있는 경우 에러가 발생 할 수 있다!</strong> 
따라서 스택을 이용하여 구현하는 것이 좀 더 안정적이다.</p>
</blockquote>
<p>스택을 이용하여 DFS를 구현 할 경우 다음의 과정을 고려한다.</p>
<ol>
<li>루트 노드를 스택에 넣는다.</li>
<li>현재 스택의 노드를 빼서 방문 확인 리스트에 추가한다.</li>
<li>현재 방문한 노드와 인접한 노드 중 방문하지 않은 노드를 스택에 추가한다.</li>
<li>2번의 과정부터 다시 반복한다.</li>
<li>스택이 비면 탐색을 종료한다.</li>
</ol>
<pre><code>def dfs_stack(adjacent_graph, start_node):
    stack = [start_node]
    visited_arr = []
    while stack:
        current_node = stack.pop()
        visited_arr.append(current_node)
        for adjacent_node in adjacent_graph[current_node]:
            if adjacent_node not in visited_arr:
                stack.append(adjacent_node)
    return visited_arr</code></pre><p>자료 2) DFS의 구현
<img src="https://images.velog.io/images/johnberman-j/post/982f141a-a7c2-4f2e-bbc7-36aa262833ca/image.png" alt=""></p>
<p>해당 코드를 실행하면 깊이우선탐색을 통해 모든 노드를 순회함을 알 수 있다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조 - 그래프(Graph)]]></title>
            <link>https://velog.io/@johnberman-j/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%9E%98%ED%94%84Graph</link>
            <guid>https://velog.io/@johnberman-j/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%9E%98%ED%94%84Graph</guid>
            <pubDate>Fri, 11 Mar 2022 15:07:00 GMT</pubDate>
            <description><![CDATA[<h3 id="1-그래프의-정의">1. 그래프의 정의</h3>
<blockquote>
<p>연결되어 있는 정점와 정점간의 관계를 표현할 수 있는 자료구조. 
출처: [천재학습백과]</p>
</blockquote>
<h3 id="2-자료구조에-따른-용법">2. 자료구조에 따른 용법</h3>
<blockquote>
<p>비선형 구조 =&gt; 표현에 초점
선형구조 =&gt; 자료를 저장하고 꺼내는 것에 초점
그래프 =&gt; 연결 관계에 초점</p>
</blockquote>
<h3 id="3-그래프의-용어-정리">3. 그래프의 용어 정리</h3>
<blockquote>
<p>노드(Node): 연결 관계를 가진 각 데이터를 의미. 정점(Vertex)이라고도 한다.
간선(Edge): 노드 간의 관계를 표시한 선.
인접 노드(Adjacent Node): 간선으로 직접 연결된 노드(또는 정점)</p>
</blockquote>
<h3 id="4-그래프의-종류">4. 그래프의 종류</h3>
<blockquote>
<p>유방향 그래프(Directed Graph): 방향이 있는 간선을 갖는다. 간선은 단방향 관계를 나타내며, 각 간선은 한 방향으로만 진행할 수 있다.
무방향 그래프(Undirected Graph): 방향이 없는 간선을 갖는다.</p>
</blockquote>
<p>자료 1) 그래프의 종류
<img src="https://images.velog.io/images/johnberman-j/post/85d2de6c-6234-453a-af7c-0b7a23fe6a54/image.png" alt=""></p>
<h3 id="5-그래프의-표현-방법">5. 그래프의 표현 방법</h3>
<p>: 그래프라는 개념을 코드로 표현하는 방법은 두 가지 방법이 있다</p>
<blockquote>
<p>1) 인접 행렬(Adjacency Matrix): 2차원 배열로 그래프의 연결 관계를 표현
2) 인접 리스트(Adjacnecy List): 링크드 리스트로 그래프의 연결 관계를 표현</p>
</blockquote>
<p>이를 예시를 통해 알아보자</p>
<p>자료 2) 표현 방법의 예시
<img src="https://images.velog.io/images/johnberman-j/post/f86767c6-5454-4895-8dba-e04aee9dd2ac/image.png" alt=""></p>
<p>다음과 같은 그래프가 주어질 때 이를 인접행렬, 인접리스트로 나타내면 다음과 같다</p>
<ul>
<li><strong>1. 인접 행렬(2차원 배열)</strong><pre><code> 0  1  2  3                                graph = [
0  x  o  x  x                                   [False, True, False, False],
1  o  x  o  x             =&gt;                    [True, False, True, False],
2  x  o  x  o                                   [False, True, False, True],
3  x  x  o  x                                   [False, False, True, False],
                                            ]</code></pre></li>
<li><strong>2. 인접리스트</strong><pre><code>graph = {
  0: [1],
  1: [0, 2],
  2: [1, 3],
  3: [2],
}</code></pre></li>
<li><strong>두방식의 차이</strong><blockquote>
<p>인접 행렬으로 표현하면 즉각적으로 0과 1이 연결되었는지 여부를 바로 알 수 있다. 그러나, 모든 조합의 연결 여부를 저장해야 되기 때문에 O(노드^2) 만큼의 공간을 사용해야 한다.</p>
</blockquote>
반면에 인접 리스트로 표현하면 즉각적으로 연결되었는지 알 수 없고, 각 리스트를 돌아봐야 한다. 따라서 연결되었는지 여부를 알기 위해서 최대 O(간선) 만큼의 시간을 사용해야 한다. 대신 모든 조합의 연결 여부를 저장할 필요가 없으니 O(노드 + 간선)만큼의 공간이 사용된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1037번: 약수 - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-1010%EB%B2%88-%EC%95%BD%EC%88%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-1010%EB%B2%88-%EC%95%BD%EC%88%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Fri, 11 Mar 2022 11:34:35 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---1037번-약수">백준 - 1037번: 약수</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/ed8b4c8f-72a1-4c82-bbd7-86f0805ac81e/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/7ff09983-be56-4486-b83a-4d0c017e212a/image.png" alt=""></p>
<pre><code>length = int(input())
division_arr = list(map(int, input().split()))

print(min(division_arr)*max(division_arr))</code></pre><p>수학 구현 문제</p>
<ul>
<li>약수를 보고 해당 숫자를 약수로 갖는 수를 구하는 문제</li>
<li>입력으로 약수를 1과 자기 자신을 제외한 약수를 받는다</li>
<li>약수의 정의를 통해 약수 중 최소의 수와 최대의 수를 곱셈해준다
=&gt; 오랜만에 수학을 접하는중이다😇</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트 - 연산자를 이용한 타입 정의]]></title>
            <link>https://velog.io/@johnberman-j/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%83%80%EC%9E%85-%EC%A0%95%EC%9D%98</link>
            <guid>https://velog.io/@johnberman-j/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%ED%83%80%EC%9E%85-%EC%A0%95%EC%9D%98</guid>
            <pubDate>Thu, 10 Mar 2022 13:42:17 GMT</pubDate>
            <description><![CDATA[<h3 id="1-연산자를-이용한-타입정의---union-type-">1. 연산자를 이용한 타입정의 - Union Type &quot;|&quot;</h3>
<p>유니온 타입(Union Type)이란?</p>
<blockquote>
<p>자바스크립트의 OR 연산자(||)와 같이 A이거나 B이다 라는 의미의 타입</p>
</blockquote>
<p>예시를 통해 의미를 파악해보자!</p>
<p>자료 1) 
<img src="https://images.velog.io/images/johnberman-j/post/0a0a250a-6489-4ad1-9e86-f98f7a9ebe63/image.png" alt="">&gt; <strong>Value의 타입이 string인데 number가 들어가서 오류가 남</strong></p>
<p>자료 2)
<img src="https://images.velog.io/images/johnberman-j/post/7c25d7bb-cee0-4436-9ada-fbe20715c1a0/image.png" alt="">&gt; 이를 해결하기 위해 any로 지정하면 <strong>type을 지정하지 않은 것과 같음</strong></p>
<p>자료 3)
<img src="https://images.velog.io/images/johnberman-j/post/c42bde51-65b4-487f-abf8-3e0916a0847f/image.png" alt="">&gt; <strong>이때 Union type “|” (or 연산자)를 사용 하여 이를 해결 할 수 있음</strong></p>
<h3 id="2-유니온-타입의-장점">2. 유니온 타입의 장점</h3>
<blockquote>
<p>1)    타입을 지정하여 오류로부터 비교적 자유로워 질 수 있다
2)    타입 추론을 통해 자동완성기능을 제공하며 이로 인한 개발 생산성 향상</p>
</blockquote>
<p>자료 4) 자동 완성 실패의 예시
<img src="https://images.velog.io/images/johnberman-j/post/0108c0eb-83d4-4477-b265-d99a882f0860/image.png" alt="">
자료 5) 추론을 통한 자동완성의 예시
<img src="https://images.velog.io/images/johnberman-j/post/a485c055-b976-436f-8b56-01b118f36f8c/image.png" alt=""></p>
<h3 id="3-유니온-타입의-특징">3. 유니온 타입의 특징</h3>
<p><img src="https://images.velog.io/images/johnberman-j/post/e7ec62a7-132b-48b6-9133-68d55110a199/image.png" alt=""></p>
<blockquote>
<p>getSomeone() 함수는 developer와 person 타입을 모두 가질 수 있다. 따라서 둘의 공통인 name이라는 속성을 사용 가능하다. 그러나 skill과 age는 인자로 들어올 someone의 타입에 따라 정의 되어 질 수 도 있고 정의가 불가능 할 수도 있다. 이를 typescript에서 추론하여 오류를 나타내고 있음.</p>
</blockquote>
<h3 id="4-인터섹션-타입-소개">4. 인터섹션 타입 소개</h3>
<p>인터섹션 타입(Intersection Type)이란?</p>
<blockquote>
<p>인터섹션 타입(Intersection Type)은 여러 타입을 모두 만족하는 하나의 타입을 의미</p>
</blockquote>
<p>자료 6) 
<img src="https://images.velog.io/images/johnberman-j/post/d003a619-c5a1-4300-a7c2-3de7b0e30bdd/image.png" alt="">&gt; 유니온타입과 다르게 인터셉션 타입에서는 skill과 age가 오류 처리 되어 있지 않음. 그 이유는 getSomeone함수에서 사용될 someone이라는 인자는 developer와 person의 속성을 모두 만족하는 하나의 타입을 의미.</p>
<p>이처럼 &amp; 연산자를 이용해 여러 개의 타입 정의를 하나로 합치는 방식을 인터섹션 타입 정의 방식이라고 한다.</p>
<p>자료 7) 인터섹션 타입
<img src="https://images.velog.io/images/johnberman-j/post/b1151a90-0fc0-4454-b8fa-5d096c20041e/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1010번: 다리 놓기 - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-1010%EB%B2%88-%EB%8B%A4%EB%A6%AC-%EB%86%93%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-1010%EB%B2%88-%EB%8B%A4%EB%A6%AC-%EB%86%93%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Thu, 10 Mar 2022 13:31:29 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---1010번-다리-놓기">백준 - 1010번: 다리 놓기</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/d569ab7e-06e4-4e1c-b76a-06b72597bfc5/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/2971296d-ae52-4a11-836d-d1d836be56e7/image.png" alt=""></p>
<pre><code>import math


length = int(input())

for i in range(length):
    temp_list = list(map(int, input().split()))
    print(math.comb(temp_list[1], temp_list[0]))</code></pre><p>수학 문제..😇</p>
<ul>
<li>다리 짓기 문제</li>
<li>강의 서쪽과 동쪽의 다리를 지을 수 있는 &#39;사이트&#39;의 갯수를 확인</li>
<li>이때 한 &#39;사이트&#39;에는 최대 한개의 다리만 연결 될 수 있다</li>
<li>다리끼리는 서로 겹쳐질 수 없으며 최대한 많은 다리를 지어야 한다
=&gt; 수학에서 &quot;조합&quot;의 개념을 알면 쉽게 해결 할 수 있다!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 동적 계획법(Dynamic Programming)]]></title>
            <link>https://velog.io/@johnberman-j/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%8F%99%EC%A0%81-%EA%B3%84%ED%9A%8D%EB%B2%95Dynamic-Programming</link>
            <guid>https://velog.io/@johnberman-j/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%8F%99%EC%A0%81-%EA%B3%84%ED%9A%8D%EB%B2%95Dynamic-Programming</guid>
            <pubDate>Wed, 09 Mar 2022 12:13:31 GMT</pubDate>
            <description><![CDATA[<h3 id="동적-계획법dynamic-programming">동적 계획법(Dynamic Programming)</h3>
<blockquote>
<p>동적 계획법(Dynamic Programming)이란 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법을 말한다. 이것은 부분 문제 반복과 최적 부분 구조를 가지고 있는 알고리즘을 일반적인 방법에 비해 더욱 적은 시간 내에 풀 때 사용한다. 
– 위키백과</p>
</blockquote>
<h3 id="동적-계획법-vs-재귀-알고리즘">동적 계획법 vs 재귀 알고리즘</h3>
<blockquote>
<p>문제를 반복해서 해결해 나가는 모습이 재귀 알고리즘과 닮아있다.</p>
<p><strong>그러나</strong></p>
</blockquote>
<ul>
<li>동적 계획법은 그 <strong>결과를 기록(Memoization)</strong>하고 이용한다는 점</li>
<li><strong>여러 개의 하위 문제(Overlapping Subproblem)</strong>를 기록한 결과를 이용하여 해결한다는 점</li>
</ul>
<p><em><strong>이를 통해 동적 계획법은 성능적 향상뿐만 아니라 부분 문제를 해결함으로써 전체 문제를 해결할 수 있게 된다!</strong></em></p>
<p>자료1) 동적 계획법 예시 (피보나치 수열)
<img src="https://images.velog.io/images/johnberman-j/post/7626874b-0bfb-457d-92b8-5b8371ab8ae3/image.png" alt=""></p>
<ol>
<li>재귀함수<pre><code>input = 20
</code></pre></li>
</ol>
<p>def fibo_recursion(n):
    if n == 1 or n == 2:
        return 1
    return fibo_recursion(n - 1) + fibo_recursion(n - 2)</p>
<p>print(fibo_recursion(input))</p>
<pre><code>
2. 동적 계획법</code></pre><p>input = 50</p>
<h1 id="memo-라는-변수에-fibo1과-fibo2-값을-저장한다">memo 라는 변수에 Fibo(1)과 Fibo(2) 값을 저장한다</h1>
<p>memo = {
    1: 1,
    2: 1
}</p>
<p>def fibo_dynamic_programming(n, fibo_memo):
    if n in fibo_memo:
        return fibo_memo[n]</p>
<pre><code>nth_fibo = fibo_dynamic_programming(n - 1, fibo_memo) + fibo_dynamic_programming(n - 2, fibo_memo)
fibo_memo[n] = nth_fibo
return nth_fibo</code></pre><p>print(fibo_dynamic_programming(input, memo))</p>
<p>```</p>
<p>이를 비교하여 코드를 실행하면, 동적 계획법을 이용 하였을때 연산이 훨씬 빠름을 확인 할 수 있다.</p>
<p>그 이유는</p>
<ol>
<li><p>재귀 알고리즘의 경우 실행했던 작업을 계속 다시 한다. 즉, 이미 시켰던 똑같은 작업을 다른 곳에서 다시 새롭게 하고 있는 것.</p>
</li>
<li><p>동적 계획법의 경우 메모를 통해 만약 메모에 그 값이 있다면 바로 반환하고, 없다면 피보나치 값을 메모에 기록하여 원할때 찾아서 사용하면 되기 때문.</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 2231번: 분해합 - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-2231%EB%B2%88-%EB%B6%84%ED%95%B4%ED%95%A9-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-2231%EB%B2%88-%EB%B6%84%ED%95%B4%ED%95%A9-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Wed, 09 Mar 2022 11:26:02 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---2231번-분해합">백준 - 2231번: 분해합</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/e3f01682-4d5c-48db-a8df-ca643a3ff928/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/06baf402-21bb-458f-8413-3ba32fe1e823/image.png" alt=""></p>
<pre><code>ipt_number = int(input())

for i in range(1, ipt_number+1):
    construct_num = sum((map(int, str(i)))) + i

    if construct_num == ipt_number:
        print(i)
        break
    if i == ipt_number:
        print(0)</code></pre><p>브루트포스 알고리즘 문제</p>
<ul>
<li>입력으로 주어진 수를 만족하는 생성자중 최소값을 찾는 문제</li>
<li>먼저 입력값을 받는다</li>
<li>반복문을 이용하여 생성자의 정의를 통해 생성자를 찾는다</li>
<li>조건문을 이용하여 생성자가 존재할 경우, 그 최소값을 반환한다</li>
<li>만약 생성자가 없을경우, 0을 출력한다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 2798번: 블랙잭 - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-2798%EB%B2%88-%EB%B8%94%EB%9E%99%EC%9E%AD-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-2798%EB%B2%88-%EB%B8%94%EB%9E%99%EC%9E%AD-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Tue, 08 Mar 2022 11:36:46 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---2798번-블랙잭">백준 - 2798번: 블랙잭</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/2db7ef20-5a36-4185-bacb-14d6575bdb5b/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/8462d9e4-0830-4e4a-9a85-806c35ce23c8/image.png" alt=""></p>
<pre><code>m,n = map(int, input().split())
number_arr = list(map(int, input().split()))
sum_arr = []
number_arr.sort(reverse=True)

for i in range(len(number_arr)-2):
    for j in range(i+1,len(number_arr)-1):
        if number_arr[i]+number_arr[j] &gt; n:
            continue
        for k in range(j+1, len(number_arr)):
            if number_arr[i]+number_arr[j]+number_arr[k] &gt; n:
                continue
            sum_number = number_arr[i]+number_arr[j]+number_arr[k]
            sum_arr.append(sum_number)

print(max(sum_arr))</code></pre><p>브루트포스 알고리즘 문제</p>
<ul>
<li>입력으로 주어진 수를 조건으로 이를 초과하지 않는 최대의 값을 만들어야한다</li>
<li>먼저 내림차순으로 리스트를 정리한다</li>
<li>조건문을 통해 기준을 초과한다면 다음 배열값으로 이동</li>
<li>더한 값을 합의 배열에 담아두고, 마지막에 최대값을 찾아낸다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트 - 타입별칭]]></title>
            <link>https://velog.io/@johnberman-j/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%83%80%EC%9E%85%EB%B3%84%EC%B9%AD</link>
            <guid>https://velog.io/@johnberman-j/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%83%80%EC%9E%85%EB%B3%84%EC%B9%AD</guid>
            <pubDate>Mon, 07 Mar 2022 15:04:04 GMT</pubDate>
            <description><![CDATA[<h3 id="1-타입-별칭이란">1. 타입 별칭이란?</h3>
<blockquote>
<p>타입 별칭은 특정 타입이나 인터페이스를 참조할 수 있는 타입 변수를 의미
string, number와 같은 간단한 타입 뿐만 아니라 <strong>interface 레벨의 복잡한 타입에도 별칭을 부여할 수 있다</strong></p>
</blockquote>
<p>자료 1) 타입 별칭을 사용한 타입 정의
<img src="https://images.velog.io/images/johnberman-j/post/b313f6c3-95e9-4e23-81a4-5c940c73e172/image.png" alt=""></p>
<p>자료 2) interface(인터페이스)에서의 타입 별칭을 사용한 타입 정의
<img src="https://images.velog.io/images/johnberman-j/post/4a6f26a6-7648-47b5-829f-df657d27437d/image.png" alt=""></p>
<h3 id="2-인터페이스와-타입별칭의-비교">2. 인터페이스와 타입별칭의 비교</h3>
<p>자료 3) 인터페이스를 이용한 타입 정의
<img src="https://images.velog.io/images/johnberman-j/post/9a1c2030-c849-48a6-8cb9-e165f4f029d1/image.png" alt=""></p>
<p>자료 4) 타입 별칭을 이용한 타입 정의
<img src="https://images.velog.io/images/johnberman-j/post/4bc52c71-3947-43b8-815f-366306362e96/image.png" alt=""></p>
<blockquote>
<ul>
<li>두가지를 비교해보면 <strong>타입별칭을 사용할때 좀 더 상세하게</strong> 사용 되어야 할 속성들이 주어진다.</li>
</ul>
</blockquote>
<ul>
<li>타입 별칭과 인터페이스의 가장 큰 차이점은 <strong>타입의 확장 가능 / 불가능 여부</strong>다. <strong><em>인터페이스는 확장이 가능한데 반해 타입 별칭은 확장이 불가능</em></strong>하다. 따라서, 가능한 type 보다는 interface로 선언해서 사용하는 것을 추천
: 좋은 소프트웨어는 언제나 확장이 용이해야 한다는 원칙에 따라 가급적 확장 가능한 인터페이스로 선언하면 좋다👏</li>
</ul>
<h3 id="3-타입-별칭을-사용-할-때의-장점">3. 타입 별칭을 사용 할 때의 장점</h3>
<blockquote>
<p>일일이 지정하면 복잡해 보일 수 있는 부분을 타입 별칭을 사용하여 간단히 작성 가능
이로 인해 코드가 간결해지고 따라서 코드의 가독성이 올라감
또한 타입별칭을 한 파일에 묶어두고, 함수를 import하여 사용하는 것처럼 사용 할 수 도 있다</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1436번: 영화감독 숌 - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-1436%EB%B2%88-%EC%98%81%ED%99%94%EA%B0%90%EB%8F%85-%EC%88%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-1436%EB%B2%88-%EC%98%81%ED%99%94%EA%B0%90%EB%8F%85-%EC%88%8C-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Mon, 07 Mar 2022 13:41:38 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---1436번-영화감독-숌">백준 - 1436번: 영화감독 숌</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/e441c2b8-5643-4f24-a62b-81d3eb41d2c9/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/a436bb09-2003-420f-a8e1-337aad81a8b8/image.png" alt=""></p>
<pre><code>series_number = int(input())
title_number = 665
count = 0

while count &lt;= series_number:
    if &quot;666&quot; in str(title_number):
        count += 1

    if count == series_number:
        print(title_number)
        break
    title_number += 1</code></pre><p>브루트포스 알고리즘 문제</p>
<ul>
<li>영화의 넘버링은 666을 통해서만 한다</li>
<li>해당 시리즈가 몇번째인지 입력받은 후 title_number를 지속적으로 1씩 증가시켜준다</li>
<li>이때 몇번째롷 나타난 666인지 count를 통해 확인 후, 일치한다면 탈출</li>
<li>누락 된 케이스(예외)가 없도록 하는것이 중요</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트 - 인터페이스]]></title>
            <link>https://velog.io/@johnberman-j/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4</link>
            <guid>https://velog.io/@johnberman-j/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4</guid>
            <pubDate>Sat, 05 Mar 2022 13:59:08 GMT</pubDate>
            <description><![CDATA[<h3 id="1-인터페이스의-정의">1. 인터페이스의 정의</h3>
<blockquote>
<p>인터페이스는 상호 간에 정의한 약속 혹은 규칙을 의미한다. 타입스크립트에서의 인터페이스는 보통 다음과 같은 범주에 대해 약속을 정의할 수 있다.</p>
</blockquote>
<p>•    객체의 스펙(속성과 속성의 타입)
•    함수의 파라미터
•    함수의 스펙(파라미터, 반환 타입 등)
•    배열과 객체를 접근하는 방식
•    클래스</p>
<h3 id="2-변수를-정의하는-인터페이스">2. 변수를 정의하는 인터페이스</h3>
<p>자료 1) 변수에 활용한 인터페이스 예시
<img src="https://images.velog.io/images/johnberman-j/post/6be4a800-276e-4bdd-a62b-40c5b0901504/image.png" alt=""></p>
<p>User라는 인터페이스를 정의하고, 그 속성의 타입을 정의함</p>
<h3 id="3-함수의-인자를-정의하는-인터페이스">3. 함수의 인자를 정의하는 인터페이스</h3>
<p>자료 2) 함수에 활용한 인터페이스 예시
<img src="https://images.velog.io/images/johnberman-j/post/5e0c5d98-34bc-4258-9d82-5e42ae2152c3/image.png" alt=""></p>
<p>friend2에 address가 정의 되어 있지 않기때문에 오류가 뜨고있다</p>
<h3 id="4-함수-구조를-정의하는-인터페이스">4. 함수 구조를 정의하는 인터페이스</h3>
<p>자료 3) 함수구조에 활용한 인터페이스 예시
<img src="https://images.velog.io/images/johnberman-j/post/01d6b05b-d554-49e2-a343-07ea993c7752/image.png" alt=""></p>
<h3 id="5-인덱싱-방식을-정의하는-인터페이스">5. 인덱싱 방식을 정의하는 인터페이스</h3>
<p>자료 4) 인덱싱 =&gt; index의 타입은 number, 배열(array)의 타입은 string으로 지정
<img src="https://images.velog.io/images/johnberman-j/post/6a44c17d-4f20-49e4-ba46-1e83bad4e6c8/image.png" alt=""></p>
<p>배열의 타입은 string으로 정의 되어있는데 숫자 10을 변수에 담으려 했기에 문제가 발생함</p>
<h3 id="6-인터페이스-딕셔너리-패턴">6. 인터페이스 딕셔너리 패턴</h3>
<p>자료 5) 딕셔너리 패턴 예시
<img src="https://images.velog.io/images/johnberman-j/post/426e952e-3daf-4243-afde-77d5696f81c2/image.png" alt=""></p>
<p>StringRegexDictionary는 key로 &#39;string&#39;, 값으로 &#39;정규표현식&#39;이 지정되어있다.
그러나 obj[&#39;cssFile&#39;]에 string을 담으려 했기에 문제가 발생함</p>
<h3 id="7-인터페이스-확장상속">7. 인터페이스 확장(상속)</h3>
<p>자료 6) 인터페이스의 상속 예시
<img src="https://images.velog.io/images/johnberman-j/post/f334aa15-7bc8-428c-a5a0-1e12941a33e1/image.png" alt=""></p>
<p>Developer는 Person을 상속받았다 =&gt; 즉 name과 age도 Developer에 명시 해줘야한다</p>
<h3 id="8-appendix">8. appendix</h3>
<p>자료 6) 인터페이스 사용 조건
<img src="https://images.velog.io/images/johnberman-j/post/2800dcf1-5123-4556-8f45-05a8ea2794cf/image.png" alt=""></p>
<blockquote>
<p>인터페이스를 인자로 받아 사용할 때 항상 인터페이스의 속성 갯수와 인자로 받는 객체의 속성 갯수를 일치시키지 않아도 된다. 다시 말해, 인터페이스에 정의된 속성, 타입의 조건만 만족한다면 객체의 속성 갯수가 더 많아도 상관 없다는 의미. 또한, 인터페이스에 선언된 속성 순서를 지키지 않아도 된다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 11399번: ATM - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-11399%EB%B2%88-ATM-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-11399%EB%B2%88-ATM-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Sat, 05 Mar 2022 13:35:11 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---11399번-atm">백준 - 11399번: ATM</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/088e2e90-5082-4015-87ab-cfef62090b61/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/eca916cb-146e-4f44-8b60-46063ffbf5d4/image.png" alt=""></p>
<pre><code>length = int(input())
ipt_data = list(map(int, input().split()))
ipt_data.sort()
total_time = 0
waiting_time = 0

for need_time in ipt_data:
    waiting_time += need_time
    total_time += waiting_time

print(total_time)</code></pre><p>그리디 알고리즘 문제</p>
<ul>
<li>최적의 선택이 어떠한것인지 생각해본다 =&gt; 인출시간이 짧은 이용자부터 먼저 이용한다</li>
<li>sort메소드를 이용하여 오름차순으로 정렬 후 인출시간과 대기시간을 얻는다</li>
<li>구해진 대기시간을 더해준다</li>
<li>개별적 선택이 최적의 선택이 되는지 확인한다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자료구조 - 트리(Tree)]]></title>
            <link>https://velog.io/@johnberman-j/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8A%B8%EB%A6%ACTree</link>
            <guid>https://velog.io/@johnberman-j/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8A%B8%EB%A6%ACTree</guid>
            <pubDate>Fri, 04 Mar 2022 15:35:02 GMT</pubDate>
            <description><![CDATA[<h3 id="트리의-정의">트리의 정의</h3>
<p>: 뿌리와 가지로 구성되어 거꾸로 세워놓은 나무처럼 보이는 계층형 비선형 자료 구조. 
[네이버 지식백과] 트리 [tree] (천재학습백과 초등 소프트웨어 용어사전)</p>
<blockquote>
<p>앞서 보인 큐(Queue), 스택(Stack) 은 자료구조에서 선형 구조라고 한다. 선형 구조란 자료를 구성하고 있는 데이터들이 순차적으로 나열시킨 형태를 의미한다. 선형구조는 자료를 저장하고 꺼내는 것에 초점이 맞춰져 있고, 비선형구조는 표현에 초점이 맞춰져 있다.</p>
</blockquote>
<p>자료 1) 트리의 구조 <a href="https://planbs.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Tree%EC%99%80-Tree%EC%9D%98-%ED%91%9C%ED%98%84-%EB%B0%A9%EC%8B%9D" target="_blank">(출처)</a>
<img src="https://images.velog.io/images/johnberman-j/post/2de6f6d6-7c5e-4fd7-ac1b-2b64205f3798/image.png" alt=""></p>
<h3 id="트리-용어-설명">트리 용어 설명</h3>
<ul>
<li>Node: 트리에서 데이터를 저장하는 기본 요소 </li>
<li>Root Node: 트리 맨 위에 있는 노드 </li>
<li>Level: 최상위 노드를 Level 0으로 하였을 때, 하위 Branch로 연결된 노드의 깊이를 나타냄</li>
<li>Parent Node: 어떤 노드의 상위 레벨에 연결된 노드 </li>
<li>Child Node: 어떤 노드의 하위 레벨에 연결된 노드 </li>
<li>Leaf Node(Terminal Node): Child Node가 하나도 없는 노드 </li>
<li>Sibling: 동일한 Parent Node를 가진 노드 </li>
<li>Depth: 트리에서 Node가 가질 수 있는 최대 Level</li>
</ul>
<h3 id="트리의-종류">트리의 종류</h3>
<p>: 트리는 이진 트리, 이진 탐색 트리, 균형 트리(AVL 트리, red-black 트리), 이진 힙(최대힙, 최소힙) 등 되게 다양한 종류가 있다.</p>
<h3 id="이진트리bionary-tree">이진트리(Bionary Tree)</h3>
<p>: <em><strong>각 노드가 최대 두개의 자식을 갖는 것을 특징으로 하는 트리</strong></em></p>
<p>자료 2) 이진트리 예시
<img src="https://images.velog.io/images/johnberman-j/post/70f63783-1129-4017-90ce-6dbde0a67c4b/image.png" alt=""></p>
<blockquote>
<p>자료에서 위의트리는 level 0의 자식 노드가 3개. 따라서 이진트리가 아니다.</p>
</blockquote>
<ul>
<li>완전 이진 트리(Complete Binary Tree)
: <em><strong>노드가 최하단 왼쪽 노드부터 차례대로 삽입된 형태의 트리</strong></em>
자료 3) 완전 이진트리 예시
<img src="https://images.velog.io/images/johnberman-j/post/a36fd99a-aa33-4933-ba24-40d8136626f9/image.png" alt=""></li>
</ul>
<h3 id="트리를-배열로-표현하는법">트리를 배열로 표현하는법</h3>
<p>: 트리를 구현할 때는 편의성을 위해 0번째 인덱스는 사용되지 않는다 =&gt; null값을 배열에 넣고 시작</p>
<p>자료 4) 트리의 표현 방법 - 배열을 이용
<img src="https://images.velog.io/images/johnberman-j/post/8abbf148-c684-469b-91b6-6e93a7db9679/image.png" alt=""></p>
<p>이때,</p>
<ol>
<li><strong>현재 인덱스 * 2</strong> =&gt; <strong><em>왼쪽 자식의 인덱스</em></strong></li>
<li><strong>현재 인덱스 * 2 + 1</strong> =&gt; <em><strong>오른쪽 자식의 인덱스</strong></em></li>
<li><strong>현재 인덱스 / 2</strong> =&gt; <em><strong>부모의 인덱스</strong></em></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1541번: 잃어버린 괄호 - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-1541%EB%B2%88-%EC%9E%83%EC%96%B4%EB%B2%84%EB%A6%B0-%EA%B4%84%ED%98%B8-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-1541%EB%B2%88-%EC%9E%83%EC%96%B4%EB%B2%84%EB%A6%B0-%EA%B4%84%ED%98%B8-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Fri, 04 Mar 2022 09:49:49 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---1541번-잃어버린-괄호">백준 - 1541번: 잃어버린 괄호</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/eb101e72-de7f-4980-b9e2-40d00741046e/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/f39c1cc0-2b48-4e2a-a80e-cb8dc68980cb/image.png" alt=""></p>
<pre><code>input_arr = input().split(&quot;-&quot;)
sum = 0

for i in range(len(input_arr)):
    temp_sum = 0
    temp_arr = input_arr[i].split(&quot;+&quot;)

    for j in range(len(temp_arr)):
        temp_sum += int(temp_arr[j])

    if i==0:
        sum += temp_sum
    else:
        sum -= temp_sum

print(sum)</code></pre><p>그리디 알고리즘 문제</p>
<ul>
<li>최적의 선택이 어떠한것인지 생각해본다 =&gt; &quot;-&quot;부호를 고려하여 괄호를 치면 된다</li>
<li>조건문을 이용하여 분기를 통해 &quot;+&quot;와 &quot;-&quot;연산을 해준다</li>
<li>문제 이해가 중요</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 탐욕 알고리즘(Greedy Algorithm)]]></title>
            <link>https://velog.io/@johnberman-j/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%83%90%EC%9A%95-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Greedy-Algorithm</link>
            <guid>https://velog.io/@johnberman-j/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%83%90%EC%9A%95-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Greedy-Algorithm</guid>
            <pubDate>Thu, 03 Mar 2022 14:59:46 GMT</pubDate>
            <description><![CDATA[<h3 id="탐욕-알고리즘greedy-algorithm">탐욕 알고리즘(Greedy Algorithm)</h3>
<blockquote>
<p>탐욕 알고리즘은 최적해를 구하는 데에 사용되는 근사적인 방법으로, 여러 경우 중 하나를 결정해야 할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는 방식으로 진행하여 최종적인 해답에 도달한다. 순간마다 하는 선택은 그 순간에 대해 지역적으로는 최적이지만, 그 선택들을 계속 수집하여 최종적(전역적)인 해답을 만들었다고 해서, 그것이 최적이라는 보장은 없다. 
     - 위키피디아</p>
</blockquote>
<p>자료 1) 탐욕 알고리즘 예시 <a href="https://velog.io/@cyranocoding/%EB%8F%99%EC%A0%81-%EA%B3%84%ED%9A%8D%EB%B2%95Dynamic-Programming%EA%B3%BC-%ED%83%90%EC%9A%95%EB%B2%95Greedy-Algorithm-3yjyoohia5" target="_blank">(그림자료출처)</a>
<img src="https://images.velog.io/images/johnberman-j/post/e67fa18c-38c8-4f66-915a-fa60b2a18a44/image.png" alt=""></p>
<ul>
<li>위의 자료를 보면, 이진트리에서 매 순간 최대값을 구하여 도출 한 최대값 결과는 12지만 실제 최대값은 99임을 알 수 있다.</li>
</ul>
<h3 id="탐욕-알고리즘의-조건">탐욕 알고리즘의 조건</h3>
<ul>
<li>탐욕스런 선택 조건(greedy choice property)<blockquote>
<p>앞의 선택이 이후의 선택에 영향을 주지 않는다는 것</p>
</blockquote>
</li>
<li>최적 부분 구조 조건(optimal substructure)<blockquote>
<p>문제에 대한 최적해가 부분문제에 대해서도 역시 최적해라는 것</p>
</blockquote>
</li>
</ul>
<p>위의 두가지 조건이 만족되지 않는다면 탐욕 알고리즘은 최적해를 구하지 못한다. </p>
<h4 id="그러나"><strong>그러나</strong></h4>
<p><strong>1. 근사 알고리즘으로 사용이 가능하다</strong>
<strong>2. 대부분의 경우 계산 속도가 빠르기 때문에 실용적으로 사용 가능하다</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 11047번: 동전 0 - 파이썬]]></title>
            <link>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-11047%EB%B2%88-%EB%8F%99%EC%A0%84-0-%ED%8C%8C%EC%9D%B4%EC%8D%AC</link>
            <guid>https://velog.io/@johnberman-j/%EB%B0%B1%EC%A4%80-11047%EB%B2%88-%EB%8F%99%EC%A0%84-0-%ED%8C%8C%EC%9D%B4%EC%8D%AC</guid>
            <pubDate>Thu, 03 Mar 2022 10:13:10 GMT</pubDate>
            <description><![CDATA[<h3 id="백준---11047번-동전-0---파이썬">백준 - 11047번: 동전 0 - 파이썬</h3>
<p>문제
<img src="https://images.velog.io/images/johnberman-j/post/f03ea95e-68b7-4cba-b430-a7d12ef04d1e/image.png" alt=""></p>
<p>입출력 형식 및 출처
<img src="https://images.velog.io/images/johnberman-j/post/47bc9bb3-7094-4531-bc2d-3a1f61229987/image.png" alt=""></p>
<pre><code>m,n = list(map(int, input().split()))
change_arr = []

for i in range(m):
    change = int(input())
    change_arr.append(change)

change_arr.reverse()

change_sum = 0
for change in change_arr:
    if n == 0:
        break
    if change &gt; n:
        continue

    change_sum += n//change
    n %= change

print(change_sum)</code></pre><p>그리디 알고리즘 문제</p>
<ul>
<li>가장 큰 숫자의 거스름돈부터 나누어 차례로 몫을 더해준다</li>
<li>남은 돈을 좀 더 작은 숫자의 거스름돈으로 나누어 몫을 더해준다</li>
<li>2번의 과정을 반복한다</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>