<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ju_h2.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Thu, 28 Jan 2021 16:09:47 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. ju_h2.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ju_h2" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Python] 백준 3955 캔디 분배 (확장 유클리드 알고리즘)]]></title>
            <link>https://velog.io/@ju_h2/Python-%EB%B0%B1%EC%A4%80-3955-%EC%BA%94%EB%94%94-%EB%B6%84%EB%B0%B0-%ED%99%95%EC%9E%A5-%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
            <guid>https://velog.io/@ju_h2/Python-%EB%B0%B1%EC%A4%80-3955-%EC%BA%94%EB%94%94-%EB%B6%84%EB%B0%B0-%ED%99%95%EC%9E%A5-%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</guid>
            <pubDate>Thu, 28 Jan 2021 16:09:47 GMT</pubDate>
            <description><![CDATA[<h3 id="백준-3955-캔디-분배-파이썬-풀이"><a href="https://juhi.tistory.com/3">백준 3955 캔디 분배 파이썬 풀이</a></h3>
<p>블로그 이사했습니당~ 위 주소로 오세요!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 프로그래머스 level2 방금그곡]]></title>
            <link>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EB%B0%A9%EA%B8%88%EA%B7%B8%EA%B3%A1</link>
            <guid>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EB%B0%A9%EA%B8%88%EA%B7%B8%EA%B3%A1</guid>
            <pubDate>Mon, 14 Dec 2020 12:38:08 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그래머스-level2-방금그곡"><a href="https://programmers.co.kr/learn/courses/30/lessons/17683">프로그래머스 level2. 방금그곡</a></h2>
<h2 id="📛-문제에-있는-오류">📛 문제에 있는 오류!!</h2>
<ul>
<li>테스트 27번에 E#이 존재한다!</li>
<li>양 옆에 `가 붙지 않은 None을 반환 해야한다.<h2 id="🎅-문제-풀이-아이디어">🎅 문제 풀이 아이디어</h2>
<img src="https://images.velog.io/images/ju_h2/post/fcf76e37-c8b0-47db-86ec-c5ac3de38f8e/KakaoTalk_20201214_213645508.jpg" alt=""></li>
</ul>
<h2 id="🎄-전체-코드">🎄 전체 코드</h2>
<pre><code class="language-python">def control(m):
    return m.replace(&#39;C#&#39;,&#39;c&#39;).replace(&#39;D#&#39;,&#39;d&#39;).replace(&#39;F#&#39;,&#39;f&#39;).replace(&#39;G#&#39;,&#39;g&#39;).replace(&#39;A#&#39;,&#39;a&#39;)

def solution(m, musicinfos):
    answer = []
    m = control(m)
    for i in musicinfos:
        start, end, name, s = i.split(&quot;,&quot;)
        n = abs((int(start[:2])*60 + int(start[3:])) - (int(end[:2])*60 + int(end[3:])))
        s = control(s)
        music = &#39;&#39;
        for j in range(n):
            music += s[j%len(s)]
        if music.find(m) != -1:
            answer.append((name, n))
    if not answer:
        return &quot;(None)&quot;
    answer.sort(reverse=True, key = lambda x: x[1])
    return answer[0][0]</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 프로그래머스 level2 후보키]]></title>
            <link>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%ED%9B%84%EB%B3%B4%ED%82%A4</link>
            <guid>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%ED%9B%84%EB%B3%B4%ED%82%A4</guid>
            <pubDate>Sun, 13 Dec 2020 09:25:26 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그래머스-level2-후보키"><a href="https://programmers.co.kr/learn/courses/30/lessons/42890">프로그래머스 level2. 후보키</a></h2>
<h2 id="👀-문제-풀이-아이디어">👀 문제 풀이 아이디어</h2>
<p><img src="https://images.velog.io/images/ju_h2/post/7beb6c90-e71e-491a-8e91-44dcb8a2e724/KakaoTalk_20201213_182425655.jpg" alt=""></p>
<h2 id="👀-전체-코드">👀 전체 코드</h2>
<pre><code class="language-python">from collections import deque
from itertools import combinations

def solution(relation):
    n = len(relation)
    m = len(relation[0])
    answer = 0

    # 가능한 모든 조합 구하기
    com = []
    for i in range(1,m+1):
        com.extend(list(combinations(range(m), i)))

    # 유일성 만족하는 키 찾기
    keys = deque()
    for i in com:
        temp = [&#39;&#39; for _ in range(n)]
        for idx1, j in enumerate(i):
            for idx2,k in enumerate(relation):
                temp[idx2] += k[j]
        if len(set(temp)) == n:
            keys.append(i)

    # 최소성 만족하는 키 찾기 
    while keys:
        temp = keys.popleft()
        answer += 1
        new = deque()
        for i in keys:
            if len(set(i)-set(temp)) != len(i)-len(temp):
                new.append(i)
        keys = new
    return answer</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 프로그래머스 level2 [1차] 프렌즈4블록 ]]></title>
            <link>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-1%EC%B0%A8-%ED%94%84%EB%A0%8C%EC%A6%884%EB%B8%94%EB%A1%9D</link>
            <guid>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-1%EC%B0%A8-%ED%94%84%EB%A0%8C%EC%A6%884%EB%B8%94%EB%A1%9D</guid>
            <pubDate>Fri, 11 Dec 2020 04:00:11 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그래머스-level2-1차-프렌즈4블록"><a href="https://programmers.co.kr/learn/courses/30/lessons/17679">프로그래머스 level2. [1차] 프렌즈4블록</a></h2>
<h2 id="✨구현해야-하는-기능">✨구현해야 하는 기능</h2>
<blockquote>
<p>구현해야 하는 기능을 아래와 같이 3개로 나누고 하나씩 구현하니까 코드가 더 간단하고 구현하기도 더 수월했다. </p>
</blockquote>
<p><img src="https://images.velog.io/images/ju_h2/post/d36dd5f6-7a6e-4889-8a7d-d1972abd677c/KakaoTalk_20201211_125032407.jpg" alt=""></p>
<h2 id="1-4개씩-붙어-원소-찾기">(1) 4개씩 붙어 원소 찾기</h2>
<p><img src="https://images.velog.io/images/ju_h2/post/7eaefc15-9b54-47ac-a2b2-5e9b1e749805/KakaoTalk_20201211_125111486.jpg" alt=""></p>
<pre><code class="language-python">def check(m,n,board):
    isChange= False
    temp = [[0]*n for _ in range(m)]
    for i in range(1, m):
        for j in range(1, n):
            if board[i][j]== board[i-1][j] == board[i][j-1] ==board[i-1][j-1] != &#39;0&#39;:
                isChange = True
                temp[i][j] = temp[i-1][j] = temp[i][j-1] = temp[i-1][j-1] =1
    return temp, isChange</code></pre>
<p><code>isChange</code>는 (3)에서 변화가 없으면 반복을 중단하기 위한 boolean값이다. </p>
<h2 id="2-1에서-찾은-값을-바탕으로-board-변경">(2) (1)에서 찾은 값을 바탕으로 board 변경</h2>
<p><img src="https://images.velog.io/images/ju_h2/post/322dc7f0-9921-4950-9bd0-9e6e131693fd/KakaoTalk_20201211_125131962.jpg" alt=""></p>
<pre><code class="language-python">def reboard(m ,n, board, temp):
    newboard = [[&#39;0&#39;]*n for _ in range(m)]
    cnt = 0
    for j in range(n):
        i = k = m-1
        while i &gt;= 0:
            if temp[i][j] == 1:
                cnt += 1
                i -= 1
            else:
                newboard[k][j] = board[i][j]
                k -= 1
                i -= 1
    return newboard, cnt</code></pre>
<p><code>cnt</code>는 변경한 값이 몇 개인지 계산해서 <code>answer</code>에 더하기 위한 변수이다.</p>
<h2 id="3-12반복">(3) (1)~(2)반복</h2>
<blockquote>
<p>변화가 없을 때 까지 (4개씩 붙어있는 같은 값이 없을 때 까지) (1)~(2)를 반복한다. </p>
</blockquote>
<h2 id="🎄-전체-코드">🎄 전체 코드</h2>
<pre><code class="language-python">def check(m,n,board):
    isChange= False
    temp = [[0]*n for _ in range(m)]
    for i in range(1, m):
        for j in range(1, n):
            if board[i][j]== board[i-1][j] == board[i][j-1] ==board[i-1][j-1] != &#39;0&#39;:
                isChange = True
                temp[i][j] = temp[i-1][j] = temp[i][j-1] = temp[i-1][j-1] =1
    return temp, isChange

def reboard(m ,n, board, temp):
    newboard = [[&#39;0&#39;]*n for _ in range(m)]
    cnt = 0
    for j in range(n):
        i = k = m-1
        while i &gt;= 0:
            if temp[i][j] == 1:
                cnt += 1
                i -= 1
            else:
                newboard[k][j] = board[i][j]
                k -= 1
                i -= 1
    return newboard, cnt

def solution(m, n, board):
    board = list(map(list, board))
    answer = 0
    isChange = True
    while isChange:
        temp, isChange = check(m ,n, board)            
        board, cnt = reboard(m ,n, board, temp)
        answer += cnt
    return answer</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 프로그래머스 level2 점프와 순간 이동]]></title>
            <link>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EC%A0%90%ED%94%84%EC%99%80-%EC%88%9C%EA%B0%84-%EC%9D%B4%EB%8F%99</link>
            <guid>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EC%A0%90%ED%94%84%EC%99%80-%EC%88%9C%EA%B0%84-%EC%9D%B4%EB%8F%99</guid>
            <pubDate>Thu, 10 Dec 2020 03:31:59 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그래머스-level2-점프와-순간-이동"><a href="https://programmers.co.kr/learn/courses/30/lessons/12980">프로그래머스 level2. 점프와 순간 이동</a></h2>
<h2 id="👀-문제-풀이-아이디어">👀 문제 풀이 아이디어</h2>
<p><img src="https://images.velog.io/images/ju_h2/post/1bcbcb7c-28c9-44ec-96a5-f36cdd88b4a3/KakaoTalk_20201210_122904168.jpg" alt=""></p>
<h2 id="👀-전체-코드">👀 전체 코드</h2>
<pre><code class="language-python">def solution(N):
    answer = 0
    while N &gt; 0:
        answer += N % 2
        N //= 2
    return answer</code></pre>
<pre><code class="language-python">def solution(N):
    return bin(N).count(&#39;1&#39;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 프로그래머스 level2 땅따먹기
]]></title>
            <link>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EB%95%85%EB%94%B0%EB%A8%B9%EA%B8%B0</link>
            <guid>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EB%95%85%EB%94%B0%EB%A8%B9%EA%B8%B0</guid>
            <pubDate>Sat, 05 Dec 2020 12:50:07 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그래머스-level2-땅따먹기"><a href="https://programmers.co.kr/learn/courses/30/lessons/12913">프로그래머스 level2. 땅따먹기</a></h2>
<h2 id="👀-문제-풀이-아이디어">👀 문제 풀이 아이디어</h2>
<p><img src="https://images.velog.io/images/ju_h2/post/f2fe8b1f-0345-4517-833f-2afeee8c750f/KakaoTalk_20201205_214631385.jpg" alt=""></p>
<ul>
<li>비교 기준이 될 변수가 하나의 int값이 아니고 list로 확장해서 생각하자</li>
<li>dp구조를 잊지 말자 <h2 id="👀-전체-코드">👀 전체 코드</h2>
<pre><code class="language-python">def solution(land):
  last = land[0]
  for i in land[1:]:
      temp = [0,0,0,0]
      for idx, item in enumerate(i):
          temp[idx] = item + max(last[:idx] + last[idx+1:])
      last = temp
  return max(last)</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 프로그래머스 level2 쿼드압축 후 개수 세기]]></title>
            <link>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EC%BF%BC%EB%93%9C%EC%95%95%EC%B6%95-%ED%9B%84-%EA%B0%9C%EC%88%98-%EC%84%B8%EA%B8%B0</link>
            <guid>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EC%BF%BC%EB%93%9C%EC%95%95%EC%B6%95-%ED%9B%84-%EA%B0%9C%EC%88%98-%EC%84%B8%EA%B8%B0</guid>
            <pubDate>Tue, 01 Dec 2020 08:57:13 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그래머스-level2-쿼드압축-후-개수-세기"><a href="https://programmers.co.kr/learn/courses/30/lessons/68936">프로그래머스 level2. 쿼드압축 후 개수 세기</a></h2>
<h2 id="👀-문제-풀이-아이디어">👀 문제 풀이 아이디어</h2>
<p><img src="https://images.velog.io/images/ju_h2/post/22b43212-cc3b-4fe0-82d6-81d84687dc22/KakaoTalk_20201201_175211099.jpg" alt=""></p>
<h2 id="👀-전체-코드">👀 전체 코드</h2>
<blockquote>
<p>✅ indexing이 좀 헷갈리는 문제였다. 헷갈릴 땐 찍어보면서 하기! </p>
</blockquote>
<pre><code class="language-python"># [0의 개수, 1의 개수]를 원소로 갖는 이차원 배열을 만드는 재귀함수
def check(s):
    n = len(s)
    if n == 1:
        return s[0][0]
    temp= [[] for _ in range(n//2)]
    for i in range(1,n,2):
        for j in range(1,n,2):
            zero = s[i][j][0] + s[i][j-1][0] + s[i-1][j][0] + s[i-1][j-1][0]
            one = s[i][j][1] + s[i][j-1][1] + s[i-1][j][1] + s[i-1][j-1][1]
            # 압축
            if one == 0: zero = 1
            if zero == 0: one = 1
            temp[i//2].append([zero, one])
    return check(temp)


def solution(arr):
    n = len(arr)
    first = [[] for _ in range(n//2)]

    # 초기 이차원 배열 만들기 
    for i in range(1,n,2):
        for j in range(1,n,2):
            temp = [arr[i][j], arr[i][j-1], arr[i-1][j], arr[i-1][j-1]]
            one = temp.count(1)
            zero = temp.count(0)
            if one == 0: zero = 1
            if zero == 0: one = 1
            first[i//2].append([zero, one])

    return check(first)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 프로그래머스 level2 가장 큰 정사각형 찾기 (동적 프로그래밍, dp)]]></title>
            <link>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%A0%95%EC%82%AC%EA%B0%81%ED%98%95-%EC%B0%BE%EA%B8%B0-%EB%8F%99%EC%A0%81-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-dp</link>
            <guid>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%EA%B0%80%EC%9E%A5-%ED%81%B0-%EC%A0%95%EC%82%AC%EA%B0%81%ED%98%95-%EC%B0%BE%EA%B8%B0-%EB%8F%99%EC%A0%81-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-dp</guid>
            <pubDate>Sun, 29 Nov 2020 09:48:43 GMT</pubDate>
            <description><![CDATA[<p><a href="https://programmers.co.kr/learn/courses/30/lessons/12905?language=python3">가장 큰 정사각형 찾기</a> 문제는 동적 프로그래밍으로 풀지 않으면 효율성 테스트에서 통과되지 않는다! 처음에 동적 프로그래밍으로 풀어야 한다는 생각을 하기까지 시간이 좀 걸려서 그 과정까지 함께 설명해보려고 한다. </p>
<blockquote>
<p>💥 어떤 문제에 어떻게 동적 프로그래밍을 이용해야 할지 막막하다면  <a href="https://velog.io/@ju_h2/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9%EB%8F%99%EC%A0%81-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EA%B5%AC%ED%98%84-%EB%B0%B1%EC%A4%80-%EA%B4%80%EB%A0%A8-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4">관련 포스팅</a>을 꼭 참고하기! </p>
</blockquote>
<h2 id="👀-왜-동적-프로그래밍dp-문제인가">👀 왜 동적 프로그래밍(dp) 문제인가?</h2>
<p>그 이유는 아래와 같이 크게 두 가지 이다. </p>
<ol>
<li>점점 값을 쌓아가면서 풀어야함</li>
<li>dp를 이용하지 않는다면 3중 반복문을 써야함
<img src="https://images.velog.io/images/ju_h2/post/258320dd-046b-424b-95e3-70f389ba824a/KakaoTalk_20201129_184146972.jpg" alt=""></li>
</ol>
<h2 id="👀-dp를-이용한-풀이">👀 dp를 이용한 풀이</h2>
<ul>
<li>2중 포문을 이용해서 원소 하나하나에 방문한다.</li>
<li>** 현재의 위치에서 가능한 최대 크기의 정사각형의 한 변의 길이**를 dp에 저장한다.</li>
<li>아래와 같은 과정을 하나씩 해보면 알겠지만 ** &#39;현재의 위치에서 가능한 최대 크기의 정사각형의 한 변의 길이&#39;**는 현재 위치가 <code>[i][j]</code>라면 <code>dp[i-1][j-1]</code>, <code>dp[i-1][j]</code>, <code>dp[i][j-1]</code> 이렇게 세 값을 비교했을 때 가장 작은 값에 1을 더한 값이다! (단, 현재 위치의 board값이 1일 때!)</li>
</ul>
<p><img src="https://images.velog.io/images/ju_h2/post/7d87398d-caeb-41d3-a53e-ce7384dd4484/KakaoTalk_20201129_184207191.jpg" alt=""></p>
<h2 id="👀-코드">👀 코드</h2>
<pre><code class="language-python">def solution(board):
    n = len(board)
    m = len(board[0])

    # dp 준비
    dp = [[0]*m for _ in range(n)]
    dp[0] = board[0]
    for i in range(1,n):
        dp[i][0] = board[i][0]

    # 2중 포문으로 연산
    for i in range(1, n):
        for j in range(1, m):
            if board[i][j] == 1:
                dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1

    # 최대 넓이 구하기
    answer = 0
    for i in range(n):
        temp = max(dp[i])
        answer = max(answer, temp)

    return answer**2</code></pre>
<br>

<pre><code class="language-python"># 위 코드 처럼 dp 배열을 따로 만들지 않고 board의 값을 직접 변경해가면서 값을 구해도 된다!

def solution(board):
    n = len(board)
    m = len(board[0])

    # 2중 포문으로 연산
    for i in range(1, n):
        for j in range(1, m):
            if board[i][j] == 1:
                board[i][j] = min(board[i-1][j-1], board[i-1][j], dp[i][j-1]) + 1

    # 최대 넓이 구하기
    answer = 0
    for i in range(n):
        temp = max(board[i])
        answer = max(answer, temp)

    return answer**2</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] nonlocal, global로 변수의 scope 변경하기 (파이썬에서 전역변수 사용하기)]]></title>
            <link>https://velog.io/@ju_h2/Python-nonlocal-global%EB%A1%9C-%EB%B3%80%EC%88%98%EC%9D%98-scope-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%97%90%EC%84%9C-%EC%A0%84%EC%97%AD%EB%B3%80%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ju_h2/Python-nonlocal-global%EB%A1%9C-%EB%B3%80%EC%88%98%EC%9D%98-scope-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%97%90%EC%84%9C-%EC%A0%84%EC%97%AD%EB%B3%80%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 27 Nov 2020 08:58:42 GMT</pubDate>
            <description><![CDATA[<h2 id="python-nonlocal-global로-변수의-scope-변경하기-파이썬에서-전역변수-사용하기"><a href="https://juhi.tistory.com/6">[Python] nonlocal, global로 변수의 scope 변경하기 (파이썬에서 전역변수 사용하기)</a></h2>
<p>블로그 이사했습니다~ 위 링크로 들어오세요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] redux-saga 시작하기! 기본적인 effects 활용]]></title>
            <link>https://velog.io/@ju_h2/React-redux-saga-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-effects-%ED%99%9C%EC%9A%A9</link>
            <guid>https://velog.io/@ju_h2/React-redux-saga-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-effects-%ED%99%9C%EC%9A%A9</guid>
            <pubDate>Fri, 27 Nov 2020 08:34:11 GMT</pubDate>
            <description><![CDATA[<h2 id="react-redux-saga-시작하기-기본적인-effects-활용"><a href="https://juhi.tistory.com/25">[React] redux-saga 시작하기! 기본적인 effects 활용</a></h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] useSelector, useDispatch로 state에 접근하기]]></title>
            <link>https://velog.io/@ju_h2/React-useSelector-useDispatch%EB%A1%9C-state%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ju_h2/React-useSelector-useDispatch%EB%A1%9C-state%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 26 Nov 2020 11:08:35 GMT</pubDate>
            <description><![CDATA[<h2 id="react-useselector-usedispatch로-state에-접근하기"><a href="https://juhi.tistory.com/23">[React] useSelector, useDispatch로 state에 접근하기</a></h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] redux-actions로 가독성 높이기]]></title>
            <link>https://velog.io/@ju_h2/React-redux-actions%EB%A1%9C-%EA%B0%80%EB%8F%85%EC%84%B1-%EB%86%92%EC%9D%B4%EA%B8%B0</link>
            <guid>https://velog.io/@ju_h2/React-redux-actions%EB%A1%9C-%EA%B0%80%EB%8F%85%EC%84%B1-%EB%86%92%EC%9D%B4%EA%B8%B0</guid>
            <pubDate>Thu, 26 Nov 2020 10:44:15 GMT</pubDate>
            <description><![CDATA[<h2 id="react-redux-actions로-가독성-높이기"><a href="https://juhi.tistory.com/24">[React] redux-actions로 가독성 높이기</a></h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 프로그래머스 level2 타겟넘버 (BFS/DFS)]]></title>
            <link>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%ED%83%80%EA%B2%9F%EB%84%98%EB%B2%84-BFSDFS</link>
            <guid>https://velog.io/@ju_h2/Python-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-level2-%ED%83%80%EA%B2%9F%EB%84%98%EB%B2%84-BFSDFS</guid>
            <pubDate>Thu, 26 Nov 2020 05:11:34 GMT</pubDate>
            <description><![CDATA[<p>[타겟넘버] (<a href="https://programmers.co.kr/learn/courses/30/lessons/43165">https://programmers.co.kr/learn/courses/30/lessons/43165</a>) 문제를 bfs와 dfs를 이용해서 풀어봤다. 아래 나오는 코드들은 다 모든 테스트케이스를 통과한 코드이다! </p>
<h2 id="👀-타겟넘버가-왜-bfsdfs-문제인가">👀 타겟넘버가 왜 BFS/DFS 문제인가?</h2>
<p><img src="https://images.velog.io/images/ju_h2/post/2408f09f-df77-492d-8dfd-2944eaff8d22/KakaoTalk_20201126_140618687.jpg" alt=""></p>
<h2 id="👀-deque를-이용한-bfs-풀이">👀 deque를 이용한 BFS 풀이</h2>
<p><img src="https://images.velog.io/images/ju_h2/post/e0b16e66-f144-4f44-b8f3-e8f5371c8f7a/2.jpg" alt=""></p>
<pre><code class="language-python">from collections import deque
def solution(numbers, target):
    answer = 0
    queue = deque()
    n = len(numbers)
    queue.append([numbers[0],0])
    queue.append([-1*numbers[0],0])
    while queue:
        temp, idx = queue.popleft()
        idx += 1
        if idx &lt; n:
            queue.append([temp+numbers[idx], idx])
            queue.append([temp-numbers[idx], idx])
        else:
            if temp == target:
                answer += 1
    return answer</code></pre>
<pre><code class="language-python"># stack을 이용한 dfs여도 마찬가지! 
def solution(numbers, target):
    answer = 0
    queue = [[numbers[0],0], [-1*numbers[0],0]]
    n = len(numbers)
    while queue:
        temp, idx = queue.pop()
        idx += 1
        if idx &lt; n:
            queue.append([temp+numbers[idx], idx])
            queue.append([temp-numbers[idx], idx])
        else:
            if temp == target:
                answer += 1
    return answer</code></pre>
<h2 id="👀-재귀함수를-이용한-dfs-풀이">👀 재귀함수를 이용한 DFS 풀이</h2>
<p><img src="https://images.velog.io/images/ju_h2/post/a97c0e9a-7068-4442-902f-99c65964e7b4/3.jpg" alt=""></p>
<pre><code class="language-python">def solution(numbers, target):
    n = len(numbers)
    answer = 0
    def dfs(idx, result):
        if idx == n:
            if result == target:
                nonlocal answer
                answer += 1
            return
        else:
            dfs(idx+1, result+numbers[idx])
            dfs(idx+1, result-numbers[idx])
    dfs(0,0)
    return answer</code></pre>
<blockquote>
<p>💡 위 코드에서 <code>nonlocal</code>을 처음 보신다면 <a href="https://velog.io/@ju_h2/Python-nonlocal-global%EB%A1%9C-%EB%B3%80%EC%88%98%EC%9D%98-scope-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%97%90%EC%84%9C-%EC%A0%84%EC%97%AD%EB%B3%80%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0">관련포스팅</a>을 참고!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] useMemo, useCallback 성능 최적화를 위한 hooks]]></title>
            <link>https://velog.io/@ju_h2/React-useMemo-useCallback-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-hooks</link>
            <guid>https://velog.io/@ju_h2/React-useMemo-useCallback-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-hooks</guid>
            <pubDate>Wed, 25 Nov 2020 06:09:09 GMT</pubDate>
            <description><![CDATA[<p>useMemo와 useCallback 모두 리랜더링될 때 다시 실행하지 않아도 되는 함수를 기억하고 재사용하기 위해 사용된다. 때문에 리랜더링 중 연산을 줄여주어 성능을 최적화할 수 있다. </p>
<pre><code class="language-javascript">useMemo(함수, [deps 배열]);
useCallback(함수, [deps 배열]);</code></pre>
<h2 id="👀-usememo">👀 useMemo</h2>
<ul>
<li><p>useMemo는 함수의 return값을 재사용하기 위한 hooks이다. </p>
</li>
<li><p><code>useMemo(함수, [여기있는 값이 바뀌면 다시실행])</code>  : 첫번째 인자로 담은 함수를 실행하고 리턴 값을 기억해둔다. deps배열에 담긴 값이 바뀌기 전까지만 기억한다.</p>
<pre><code class="language-javascript">// 랜더링 될 때마다 아래를 실행하지만, lottoNumbers 값을 매번 바꾸고 싶지는 않다.
const lottoNumbers = useMemo(() =&gt; getWinNumbers(), []);
const [winNumbers, setWinNumbers] = useState(lottoNumbers);</code></pre>
<h2 id="👀-usecallback">👀 useCallback</h2>
</li>
<li><p>useCallback은 특정 함수를 새로 만들지 않고 재사용할 때 사용한다.</p>
</li>
<li><p><code>useCallback(함수, [여기있는 값이 바뀌면 다시실행])</code></p>
</li>
<li><p>함수를 자체를 기억하고 있어서 리랜더링될 때, 함수가 다시 선언되지 않는다.</p>
</li>
<li><p>자식 컴포넌트에 props값으로 함수를 넘길 때 그 함수는 useCallback 을 씌워주는 것이 좋다. → 쓸데없이 자식 컴포넌트가 리랜더링 되는 것을 방지한다.</p>
</li>
<li><p>useCallBack은 반드시 첫번째 인자인 함수 내에서 변화하는 state값을 두 번째 인자(deps 배열)의 원소로 추가해 줘야한다. </p>
<pre><code class="language-javascript">const onClickRedo = useCallback(() =&gt; {
  setWinNumbers(getWinNumbers());
  timeouts.current = [];
}, [winNumbers]);</code></pre>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 리덕스 시작하기 (redux, react-redux)]]></title>
            <link>https://velog.io/@ju_h2/React-%EB%A6%AC%EB%8D%95%EC%8A%A4-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@ju_h2/React-%EB%A6%AC%EB%8D%95%EC%8A%A4-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 18 Nov 2020 06:26:14 GMT</pubDate>
            <description><![CDATA[<h2 id="react-리덕스-시작하기-redux-react-redux"><a href="https://juhi.tistory.com/22">[React] 리덕스 시작하기 (redux, react-redux)</a></h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[SOPT 27기 웹파트 / 25기 서버파트 / 28기 서버파트 지원후기, 면접후기 ]]></title>
            <link>https://velog.io/@ju_h2/SOPT-27%EA%B8%B0-%EC%9B%B9%ED%8C%8C%ED%8A%B8-25%EA%B8%B0-%EC%84%9C%EB%B2%84%ED%8C%8C%ED%8A%B8-%EC%A7%80%EC%9B%90%ED%9B%84%EA%B8%B0-%EB%A9%B4%EC%A0%91%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@ju_h2/SOPT-27%EA%B8%B0-%EC%9B%B9%ED%8C%8C%ED%8A%B8-25%EA%B8%B0-%EC%84%9C%EB%B2%84%ED%8C%8C%ED%8A%B8-%EC%A7%80%EC%9B%90%ED%9B%84%EA%B8%B0-%EB%A9%B4%EC%A0%91%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Tue, 17 Nov 2020 08:00:44 GMT</pubDate>
            <description><![CDATA[<h2 id="sopt-27기-웹파트--25기-서버파트--28기-서버파트-지원후기-면접후기"><a href="https://juhi.tistory.com/2?category=976167">SOPT 27기 웹파트 / 25기 서버파트 / 28기 서버파트 지원후기, 면접후기</a></h2>
<p>블로그 이사했습니다~ 위 링크로 들어오세요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA] int, String 배열의 오름차순, 내림차순 정렬 ]]></title>
            <link>https://velog.io/@ju_h2/JAVA-int-String-%EB%B0%B0%EC%97%B4%EC%9D%98-%EC%98%A4%EB%A6%84%EC%B0%A8%EC%88%9C-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C-%EC%A0%95%EB%A0%AC</link>
            <guid>https://velog.io/@ju_h2/JAVA-int-String-%EB%B0%B0%EC%97%B4%EC%9D%98-%EC%98%A4%EB%A6%84%EC%B0%A8%EC%88%9C-%EB%82%B4%EB%A6%BC%EC%B0%A8%EC%88%9C-%EC%A0%95%EB%A0%AC</guid>
            <pubDate>Sun, 15 Nov 2020 10:24:46 GMT</pubDate>
            <description><![CDATA[<p>java에서 정렬할 때는 Arrays라는 java.util에 포함된 클래스를 이용해야 한다. <code>import java.util.Arrays</code></p>
<h3 id="↗-오름차순-정렬">↗ 오름차순 정렬</h3>
<pre><code class="language-java">int[] arr = {6,3,2,1,5};
String[] arr2 = {&quot;h&quot;, &quot;e&quot;, &quot;a&quot;, &quot;c&quot;};
Arrays.sort(arr);
Arrays.sort(arr2);</code></pre>
<h3 id="↘-내림차순-정렬">↘ 내림차순 정렬</h3>
<p><strong>String</strong> 
String 타입일 때는 비교적 쉽게 내림차순 정렬이 가능하다.</p>
<pre><code class="language-java">Arrays.sort(arr2, Collections.reverseOrder());</code></pre>
<p><strong>int</strong>
int 타입일 때는 위와 같은 방법으로 정렬할 수 없고, Integer타입 배열로 변경해 주어야 한다.</p>
<pre><code class="language-java">Integer[] arr3 = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Arrays.sort(arr3, Collections.reverseOrder());</code></pre>
<h3 id="정렬을-시작하는-위치와-끝-위치를-지정하고-싶을-때">정렬을 시작하는 위치와, 끝 위치를 지정하고 싶을 때</h3>
<pre><code class="language-java">Arrays.sort(arr, 1, 3);
Arrays.sort(arr, 1, 3, Collections.reverseOrder());</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] ref통한 input 태그 커서/포커스 조정 (class component와 hooks에서 비교)]]></title>
            <link>https://velog.io/@ju_h2/React-ref%ED%86%B5%ED%95%9C-input-%ED%83%9C%EA%B7%B8-%EC%BB%A4%EC%84%9C%ED%8F%AC%EC%BB%A4%EC%8A%A4-%EC%A1%B0%EC%A0%95-class-component%EC%99%80-hooks%EC%97%90%EC%84%9C-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@ju_h2/React-ref%ED%86%B5%ED%95%9C-input-%ED%83%9C%EA%B7%B8-%EC%BB%A4%EC%84%9C%ED%8F%AC%EC%BB%A4%EC%8A%A4-%EC%A1%B0%EC%A0%95-class-component%EC%99%80-hooks%EC%97%90%EC%84%9C-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Mon, 19 Oct 2020 05:11:20 GMT</pubDate>
            <description><![CDATA[<h3 id="🙋🏻♂️ref란">🙋🏻‍♂️ref란?</h3>
<p>ref는 DOM에 직접 접근해야할 때 사용된다. 이런 직접 접근이 필요한 경우는 아래와 같다.</p>
<ul>
<li>input / textare 등에 커서 조정</li>
<li>DOM 의 크기를 가져와야 할 때</li>
<li>DOM 에서 스크롤 위치를 가져오거나 설정을 해야 할 때</li>
<li>외부 라이브러리 (플레이어, 차트, 캐로절 등)을 사용 할 때</li>
</ul>
<h3 id="🧍🏻♂️-html-input-태그에서-커서-조정">🧍🏻‍♂️ html input 태그에서 커서 조정</h3>
<ul>
<li>html에서 커서 조정하는 방법은 아래와 같다. script단에서 원하는 곳에 <code>.focus()</code>메소드를 사용해주면 포커스가 해당 input 입력창으로 이동된다.</li>
</ul>
<pre><code class="language-html">&lt;script&gt;
  var goFocus = function() { $(&#39;#input&#39;).focus(); }
&lt;/script&gt;
...
&lt;input type=&quot;text&quot; id=&quot;input&quot;/&gt;</code></pre>
<h3 id="🚶🏻♂️-class-component에서-커서-조정">🚶🏻‍♂️ class Component에서 커서 조정</h3>
<pre><code class="language-jsx">class LetsReact extends React.Component {
  // ref를 위한 변수 선언 
  inputRef; 
  ...
  // 커서 이동을 원할 때,
  this.inputRef.focus();

render() {
  return (
    ...
    &lt;input ref = {(c) =&gt; {this.inputRef = c;}}/&gt;
    ...
  );
}
}</code></pre>
<h3 id="🏃🏻♂️-hooks에서-커서-조정">🏃🏻‍♂️ Hooks에서 커서 조정</h3>
<pre><code class="language-jsx">const LetsReact = () =&gt; {
  // ref를 위한 변수 선언 
  const inputRef = React.useRef(null);

  //  커서 이동을 원할 때,
  inputRef.current.focus();

  return (
    ... 
    &lt;input ref = {inputRef}/&gt;
    ...
  );

}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 백준 1781. 컵라면 풀이 - 파이썬 탐욕 알고리즘(그리디) 구현 (6)]]></title>
            <link>https://velog.io/@ju_h2/Python-%EB%B0%B1%EC%A4%80-1781.-%EC%BB%B5%EB%9D%BC%EB%A9%B4-%ED%92%80%EC%9D%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%83%90%EC%9A%95-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EA%B7%B8%EB%A6%AC%EB%94%94-%EA%B5%AC%ED%98%84-6</link>
            <guid>https://velog.io/@ju_h2/Python-%EB%B0%B1%EC%A4%80-1781.-%EC%BB%B5%EB%9D%BC%EB%A9%B4-%ED%92%80%EC%9D%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%83%90%EC%9A%95-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EA%B7%B8%EB%A6%AC%EB%94%94-%EA%B5%AC%ED%98%84-6</guid>
            <pubDate>Mon, 05 Oct 2020 02:32:36 GMT</pubDate>
            <description><![CDATA[<h3 id="백준-1781-컵라면"><a href="https://www.acmicpc.net/problem/1781">백준 1781. 컵라면</a></h3>
<h3 id="🎾-문제-아이디어-정리">🎾 문제 아이디어 정리</h3>
<p><img src="https://images.velog.io/images/ju_h2/post/da970947-dfd7-4386-bf40-2a72ee3efcc2/1C413825-7EBB-4299-9675-B8BA0706C3B3.jpeg" alt=""><img src="https://images.velog.io/images/ju_h2/post/21909e92-afbe-4c10-af1d-8e5a45437b05/AC0728BE-DA19-429C-A492-39B0DC3F3725.jpeg" alt=""></p>
<br>

<h3 id="🏈-풀이-코드">🏈 풀이 코드</h3>
<pre><code class="language-python">import heapq
n = int(input())
array = []
for _ in range(n):
    deadline, cupNoodle = map(int, input().split())
    array.append((deadline, cupNoodle))

array.sort()

queue = []

for i in array:
    heapq.heappush(queue, i[1])
    if i[0] &lt; len(queue):
        heapq.heappop(queue)

print(sum(queue))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 백준 1092. 배 풀이 - 파이썬 탐욕 알고리즘(그리디) 구현 (5)]]></title>
            <link>https://velog.io/@ju_h2/Python-%EB%B0%B1%EC%A4%80-1092.-%EB%B0%B0-%ED%92%80%EC%9D%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%83%90%EC%9A%95-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EA%B7%B8%EB%A6%AC%EB%94%94-%EA%B5%AC%ED%98%84-5</link>
            <guid>https://velog.io/@ju_h2/Python-%EB%B0%B1%EC%A4%80-1092.-%EB%B0%B0-%ED%92%80%EC%9D%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%83%90%EC%9A%95-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EA%B7%B8%EB%A6%AC%EB%94%94-%EA%B5%AC%ED%98%84-5</guid>
            <pubDate>Mon, 05 Oct 2020 02:10:57 GMT</pubDate>
            <description><![CDATA[<h3 id="백준-1092-배"><a href="https://www.acmicpc.net/problem/1092">백준 1092. 배</a></h3>
<h3 id="🏀-문제-아이디어-정리">🏀 문제 아이디어 정리</h3>
<p><img src="https://images.velog.io/images/ju_h2/post/8dc2dba0-ccbd-4226-834d-7e10dc372e17/0DDC67B5-A5D2-403F-AED7-FA56D13233E3.jpeg" alt="">
<img src="https://images.velog.io/images/ju_h2/post/acbe67ac-2a06-4852-8518-d73bd2c5dc36/9CEE571E-B1DC-484D-8129-AC038885B43F.jpeg" alt=""></p>
<blockquote>
<p>⚡ 시간초과를 위해 position배열을 활용하면, 무거워서 박스를 못옮겼을 때, position을 +1해줘서 다음에는 그 박스 다음 박스부터 시행하게 한다. 때문에 <strong>박스와 크레인을 내림차순으로 정렬</strong>해줘야 한다. </p>
</blockquote>
<br>

<h3 id="🎾-풀이-코드">🎾 풀이 코드</h3>
<pre><code class="language-python">n = int(input())
crane = list(map(int, input().split()))
m = int(input())
box = list(map(int, input().split()))

# ⚡ 내림차순 정렬
crane.sort(reverse = True)
box.sort(reverse = True)

time = 0 # 시간
checked = [0 for _ in range(m)] # 박스를 옮겼는지 여부
count = 0 # 옮긴 박스의 개수 

positions = [0] * n

if max(box) &gt; max(crane):
    print(-1)
else:
    while count &lt; len(box):
        for i in range(n): # 크레인에 대하여
            while positions[i] &lt; len(box):
            # 아직 안 옮긴 박스 중에서, 옮길 수 있는 박스를 만날 때까지 반복
                if not checked[positions[i]] and crane[i] &gt;= box[positions[i]]:
                    checked[positions[i]] = True
                    positions[i] += 1
                    count += 1
                    break
                positions[i] += 1
        time += 1
    print(time)    
</code></pre>
]]></description>
        </item>
    </channel>
</rss>