<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>beeee</title>
    <link>https://beehand.tistory.com/</link>
    <description>개발..해볼까?</description>
    <language>ko</language>
    <pubDate>Mon, 27 Jul 2026 01:29:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bee22</managingEditor>
    <item>
      <title>[Python][프로그래머스] lv2. 의상</title>
      <link>https://beehand.tistory.com/161</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42578?language=python3&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42578?language=python3&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1697860133521&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42578?language=python3&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgk7Md/hyUgPwezB3/7EKvpqmVjAeDNyx6HJItB0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cke4nq/hyUgROlMF8/9aKaODQIaEJLzFrftt7Ty0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42578?language=python3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42578?language=python3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgk7Md/hyUgPwezB3/7EKvpqmVjAeDNyx6HJItB0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cke4nq/hyUgROlMF8/9aKaODQIaEJLzFrftt7Ty0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내 코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 리뷰&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해시&lt;/h3&gt;
&lt;pre id=&quot;code_1697860162072&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import defaultdict
def solution(clothes):
    answer = 1
    type = dict()
    for item, category in clothes:
        if category in type:
            type[category].append(item)
        else:
            type[category] = item
    print(type)
            
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;틀린 코드, 처음에는 이 코드로 기본 세팅을 했는데 틀렸다. 자꾸만&amp;nbsp;&lt;span style=&quot;color: #343541; text-align: start;&quot;&gt;'str' object has no attribute 'append' 이 오류가 발생했다. &lt;/span&gt;이유가 대체 뭘까 하고 보니 실제로 문자열은 append를 사용할 수 없다. 하지만 type[category]에 대해 초기에 문자열로 초기화가 되어 있던 것이다. 그래서 오류가 발생했다.&lt;/p&gt;
&lt;pre id=&quot;code_1697860247656&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;type = defaultdict(list)
    
    for item, category in clothes:
        type[category].append(item)
    print(type)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이를 고려하여 다음과 같이 수정했다. default값을 list로 함으로써, str를 넣더라도 리스트로 인식하여 append를 사용할 수 있도록 했더니 오류가 나지 않았다!&lt;/p&gt;</description>
      <category>코딩테스트 대비/프로그래머스</category>
      <author>bee22</author>
      <guid isPermaLink="true">https://beehand.tistory.com/161</guid>
      <comments>https://beehand.tistory.com/161#entry161comment</comments>
      <pubDate>Sat, 21 Oct 2023 12:51:41 +0900</pubDate>
    </item>
    <item>
      <title>코테 직전에 보는 SQL</title>
      <link>https://beehand.tistory.com/160</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;- HAVING : 집계 함수와 함께 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SET 함수 : 값을 어떤 값으로 초기화할 때 사용한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간이 등장할 때 사용할 수 있는 함수이다.&lt;/li&gt;
&lt;li&gt;이때, HOUR이 0 ~ 23으로 되는 것이 조건이라면 이렇게 해결할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1697718386573&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SET @HOUR = -1;
SELECT (@HOUR := @HOUR +1) AS HOUR&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기서 := 는 대입한다는 의미이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;LIKE vs '='&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날짜가 나올 때 많이 등장한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LIKE : 와일드카드(%)를 사용하고 싶을 때 사용하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1697721108935&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WHERE DATE(B.SALES_DATE) LIKE '2022-01%'&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;' = ' : 정확한 날짜를 입력할 때 사용하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1697721099307&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WHERE SALES_DATE &amp;gt;= '2022-03-01' AND SALES_DATE &amp;lt; '2022-04-01'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JOIN vs UNION&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JOIN&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개 이상의 테이블 간의 관계를 설정, 특정 열의 값을 조합하거나 연결하는 데 사용한다.&lt;/li&gt;
&lt;li&gt;연결된 값이 일치하는 행을 찾아낸다.&lt;/li&gt;
&lt;li&gt;관련 테이블의 행을 결합한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN 등이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;UNION&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나 이상의 SQL SELECT문과 결과 집합을 결합하여 집합을 만든다.&lt;/li&gt;
&lt;li&gt;여러 테이블, 쿼리에서 데이터를 추출하고 하나의 결과로 합칠 때 사용한다.&lt;/li&gt;
&lt;li&gt;중복 행 제거 : UNION DISTINCT&lt;/li&gt;
&lt;li&gt;중복 행 유지 : UNION ALL&lt;/li&gt;
&lt;li&gt;DB간이 아니라, 쿼리의 결과 집합을 결합할 때 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; JOIN은 테이블 레벨에서 작동하고 관계를 활용하며, UNION은 쿼리 결과 레벨에서 작동하고 데이터를 합치거나 결합한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 각각의 테이블의 &lt;b&gt;결과&lt;/b&gt;를 합칠 거면 JOIN (X) , UNION (O)을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;COUNT vs SUM&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COUNT함수는 특정 열에서 &lt;b&gt;NULL 이 아닌 값의 수&lt;/b&gt;를 계산하는 데 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NULL 이면 ~~라고 표시하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ifnull(칼럼, '출력할 문구') 사용하기&lt;/p&gt;
&lt;pre id=&quot;code_1697721626885&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ifnull(TLNO,'NONE') as TLNO&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;= TLNO이면 NONE으로 표시할거다!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT문에 넣어주기!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;NULL인 것을 찾기만 해라&lt;/h3&gt;
&lt;pre id=&quot;code_1697722190830&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WHERE AGE IS NULL&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건문에만 넣어주기!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가격이 제일 높은~&lt;/h3&gt;
&lt;pre id=&quot;code_1697722030759&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WHERE PRICE = (SELECT MAX(PRICE) FROM FOOD_PRODUCT)

#아니면

ORDER BY PRICE DESC
LIMIT 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;중복을 제거하는~&lt;/h3&gt;
&lt;pre id=&quot;code_1697722069356&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT count(DISTINCT(NAME)) AS count&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구분해줘야 할 케이스가 여러개일 때&lt;/h3&gt;
&lt;pre id=&quot;code_1697722454727&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CASE WHEN ~~ THEN 'A'
	ELSE 'B'
    END 
    
  	AS RENT TYPE&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;며칠 차이나는지 구하는 방법&lt;/h3&gt;
&lt;pre id=&quot;code_1697722532687&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DATEDIFF(마지막 날, 첫 날) #첫날 미포함

DATEDIFF(마지막 날, 첫 날) +1 #첫날 포함&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;!! 주의할 점 : 첫 번째 날짜를 포함하지 않음. 시작일을 포함하지 않으므로 +1 을 더해줘야 한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;글자의 왼쪽 2글자만&lt;/h3&gt;
&lt;pre id=&quot;code_1697723953294&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LEFT(PRODUCT, 2) AS CATEGORY&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해당되는 것을 모두 골라라&lt;/h3&gt;
&lt;pre id=&quot;code_1697725123922&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;서브쿼리 사용할 때?&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 하위 집합 필터링 : 주요 쿼리의 결과 집합과 서브쿼리의 결과 집합을 비교한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;주요 쿼리 결과에서 서브 쿼리 결과와 일치하는 값&lt;/b&gt;만을 선택한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 다중 값 비교 : 주요 쿼리 결과에서 여러 값을 동시에 비교할 수 있다. 특정 목록이나 값 집합과 일치하는 행을 검색할 때 사용할 수 있다.&lt;/p&gt;</description>
      <category>코딩테스트 대비/SQL</category>
      <author>bee22</author>
      <guid isPermaLink="true">https://beehand.tistory.com/160</guid>
      <comments>https://beehand.tistory.com/160#entry160comment</comments>
      <pubDate>Thu, 19 Oct 2023 22:43:26 +0900</pubDate>
    </item>
    <item>
      <title>[Python][프로그래머스] lv3. 섬 연결하기</title>
      <link>https://beehand.tistory.com/159</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42861?language=python3&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42861?language=python3&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1696558642624&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42861?language=python3&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qf2XE/hyT5R9enVS/0p9obiNImLcRVDKHPDVob1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bDM26q/hyT9ASjY6Q/q4umEtPWSZ1HK3qEmEgbI1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42861?language=python3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42861?language=python3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qf2XE/hyT5R9enVS/0p9obiNImLcRVDKHPDVob1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bDM26q/hyT9ASjY6Q/q4umEtPWSZ1HK3qEmEgbI1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1696558648749&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n, costs):
    answer =0
    parent =[i for i in range(n)]
    costs.sort(key = lambda x:x[2])
    
    def sameParent(parent, a,b):
        return getParent(parent, a) == getParent(parent, b)

    def getParent(parent, x):
        if parent[x] == x:
            return x
        return getParent(parent, parent[x])

    def unionParent(parent, a,b):
        a=getParent(parent, a)
        b = getParent(parent, b)
        if a&amp;lt;b:
            parent[b] =a
        else:
            parent[a]=b
            
    for a,b,cost in costs:
        if sameParent(parent, a,b) == False:
            unionParent(parent, a,b)
            answer += cost
    
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 리뷰&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;크루스칼(kruskal) 알고리즘&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크루스칼 알고리즘을 실행할 때 유니온파인드 알고리즘이 정말 흔하게 사용되는데, 그 알고리즘에 대한 개념을 다지는 문제였다고 생각한다. 그래서 lv3이길래 조금 겁먹었는데, 막상 풀어보니 그저 알고리즘 사용 때문에 레벨이 높게 책정된 것이 아닐까 싶다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 간단하게 다음의 표와 같이 전개된다. 비용 순으로 정렬했던 점을 이용해서 풀이하면 된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 98.8372%; height: 110px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20%;height: 20px;&quot;&gt;처리한 간선&lt;/td&gt;
&lt;td style=&quot;width: 20%;height: 20px;&quot;&gt;parent&lt;/td&gt;
&lt;td style=&quot;width: 20%;height: 20px;&quot;&gt;parent 설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 20%;height: 40px;&quot;&gt;[0,1,1]&lt;/td&gt;
&lt;td style=&quot;width: 20%;height: 40px;&quot;&gt;[0,0,2,3]&lt;/td&gt;
&lt;td style=&quot;width: 20%;height: 40px;&quot;&gt;0번 노드, 1번 노드가 같은 집합,&lt;br /&gt;1번 노드의 부모가 0이 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 20%;height: 40px;&quot;&gt;[1,3,1]&lt;/td&gt;
&lt;td style=&quot;width: 20%;height: 40px;&quot;&gt;[0,0,2,0]&lt;/td&gt;
&lt;td style=&quot;width: 20%;height: 40px;&quot;&gt;1번 노드와 3번 노드가 같은 집합,&lt;br /&gt;3번 노드의 부모가 0이 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 20%;height: 10px;&quot;&gt;[1,2,5]&lt;/td&gt;
&lt;td style=&quot;width: 20%;height: 10px;&quot;&gt;[0,0,0,0]&lt;/td&gt;
&lt;td style=&quot;width: 20%;height: 10px;&quot;&gt;1번 노드와 2번 노드가 같음,&lt;br /&gt;2번 노드의 부모가 0이 됨&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696558767529&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    answer =0
    parent =[i for i in range(n+1)]
    costs.sort(key = lambda x:x[2])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 기본 세팅을 해준다. 먼저 parent 리스트는 각각의 노드들의 부모를 설명하는 리스트이다. 처음에는 자기 스스로를 부모로 지정한다. 그리고 입력받은 costs를 비용 순으로 정렬해준다. 가장 낮은 비용을 우선으로 생각하기 위해서 정렬을 먼저 해주는 것이 좋다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696558869128&quot; class=&quot;gml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;    def getParent(parent, x):
        if parent[x] == x:
            return x
        return getParent(parent, parent[x])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니온파인드 알고리즘 함수들을 그대로 사용해준다. 여기서 parent[x]는 x의 부모를 의미한다. 그래서 x의 부모가 x라면 그대로 x를 반환한다. 이후 union 함수에서 여러 노드들이 들어갈 건데, 해당 노드의 부모 노드를 찾을 때까지 재귀로 계속 타고 들어가서 부모 노드를 찾아낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696559105943&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    def unionParent(parent, a,b):
        a=getParent(parent, a)
        b = getParent(parent, b)
        if a&amp;lt;b:
            parent[b] =a
        else:
            parent[a]=b&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;union함수에서는 비교할 두 노드를 집어넣는다. 그래서 a의 부모 노드를 찾고, b의 부모 노드를 찾는다. union-find 알고리즘에서는 &lt;b&gt;더 작은 부모 노드가 그 집합의 대표자&lt;/b&gt;가 되기로 정의했다. 그래서 a와 b를 비교하고, a가 더 작으면 b의 부모를 a로 결정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696558838928&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    def sameParent(parent, a,b):
        return getParent(parent, a) == getParent(parent, b)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 same 함수를 통해 a와 b의 부모 노드를 비교한다. 이건 사이클을 만들지 않기 위해 사용되는 중요한 함수이다.&amp;nbsp; 만약 a와 b가 같은 집합 안에 있다면, 이를 연결했을 때 사이클이 발생할 수 있다. 이를 체크하기 위해 이처럼 간단하게 표현할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696559289304&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    for a,b,cost in costs:
        if sameParent(parent, a,b) == False:
            unionParent(parent, a,b)
            answer += cost&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 입력받은 costs 안에서 각각의 노드와 비용을 꺼내서, same함수를 통해 먼저 사이클이 발생할 수 있는지를 확인한다. 사이클이 발생하지 않는다는 점이 확인되면, union에 넣어서 노드의 부모를 찾는다. 그리고 모든 노드가 이어져야 하는 것이 요구사항이므로, 사이클이 발생하지 않는 선에서 cost를 누적해서 더한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩테스트 대비/프로그래머스</category>
      <author>bee22</author>
      <guid isPermaLink="true">https://beehand.tistory.com/159</guid>
      <comments>https://beehand.tistory.com/159#entry159comment</comments>
      <pubDate>Fri, 6 Oct 2023 11:56:50 +0900</pubDate>
    </item>
    <item>
      <title>Kruskal 알고리즘(MST) / Union-Find</title>
      <link>https://beehand.tistory.com/158</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;크루스칼 알고리즘(Kruskal)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐욕적인 방법(Greedy Method)를 사용한다. 네트워크의 모든 정점을 최소 비용으로 연결하는 것이 목표이다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최소 비용의 간선으로 구성한다.&lt;/li&gt;
&lt;li&gt;사이클을 포함하지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히 말해 &quot;최소 신장 트리(MST)를 찾는 알고리즘&quot;이라고 한다.&amp;nbsp; 여기서 신장 트리란 무엇일까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;신장트리(Spanning Tree)&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sbn2Q/btsxdZaGuEX/8UUhRVaKN9XdVOvWLKyPp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sbn2Q/btsxdZaGuEX/8UUhRVaKN9XdVOvWLKyPp0/img.png&quot; data-alt=&quot;신장트리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sbn2Q/btsxdZaGuEX/8UUhRVaKN9XdVOvWLKyPp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSbn2Q%2FbtsxdZaGuEX%2F8UUhRVaKN9XdVOvWLKyPp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;181&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;신장트리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 G1이라는 연결 그래프가 있다고 할 때, 4개의 정점으로 이루어져 있다. 네 개의 정점을 잇는 것이 목표이지만, &lt;b&gt;사이클을 형성하면 안 된다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 크루스칼 알고리즘으로 넘어가서, 그러면 크루스칼 알고리즘은 최소 신장 트리를 찾는다고 했는데 대체 뭘까. 바로 &lt;b&gt;신장 트리의 조건&lt;/b&gt;을 지키면서도, &lt;b&gt;최소한의 비용&lt;/b&gt;으로 신장 트리를 만드는 것을 목적으로 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;알고리즘의 동작 과정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;간선 데이터를 오름차순으로 정렬한다.&lt;/li&gt;
&lt;li&gt;간선을 하나씩 확인한다. 이때, 현재의 간선이 사이클을 만드는지 확인한다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;만약 사이클이 발생한다면, 최소 신장 트리에 포함하지 않는다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;만약 사이클이 발생하지 않는다면, 최소 신장 트리에 포함한다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모든 간선에 대해서 계속 반복한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크루스칼 알고리즘은 계속 강조되고 있는 부분이지만, 사이클이 발생하지 않는지에 대해 정말 민감하게 반응한다. 그러므로 반드시 지켜줘야 한다! 그러면 사이클이 발생하는지는 어떻게 판별할까? 이건 Union-Find 알고리즘을 통해 찾아낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Union Find 알고리즘&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이클이 발생하는지를 확인하기 위해 kruskal에서 많이 사용하는 알고리즘이다. 두 노드가 같은 그래프에 속해있을 때, 이를 연결하면 사이클이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프 안에서 연결된 수들끼리 집합을 구성한다. 그리고 그 집합 안에서 가장 작은 값을 가진 노드를 대표자로 정한다. 그래서 대표자를 통해 집합을 구분할 수 있도록 한다. 예를 들어 대표자가 2명이라면 그래프도 2개, 대표자가 3명이라면 그래프도 3개인 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Union&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 집합이 만들어지지 않은 노드들만 있을 경우에는 더 작은 쪽으로 노드들을 합쳐준다. 그 집합 안으로 들어가면, 각각의 노드들은 대표자를 가리킨다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Find&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 개의 부모 노드를 비교한 후에, 현재 같은 집합에 속하는지 확인하는 알고리즘이다. 대표자를 보고, 내 집합의 대표자를 찾아가는 과정이라고 생각하면 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;함수 구성&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;getParent #부모 노드를 찾는 함수&lt;/li&gt;
&lt;li&gt;unionParent #두 부모 노드를 합치는 함수&lt;/li&gt;
&lt;li&gt;findParent #같은 부모를 가지는지 확인하는 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1696554885128&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#부모를 자기 자신으로 초기화
parent =[i for i in range(n+1)]

#parent[x] = x의 부모
#x의 부모가 자기 자신이 아니라면, findP를 호출하여 x의 부모를 찾는다.
#재귀적으로 부모를 탐색
def getParent(x):
    if parent[x] != x:
        return findParent(parent, parent[x])

#두 원소가 속한 집합의 대표 원소를 찾아서 합치는 함수
def unionParent(a,b):
    a=getParent(a)
    b =getParent(b)
    if a&amp;lt;b:
        parent[b] =a
    else:
        parent[a]=b

#원소가 같은 집합에 속하는지 찾는 함수, True or False 반환
def sameParent(a,b):
    return getParent(a) == getParent(b)
    
#사이클이 발생하는지 판별하는 함수
def hasCycle(edges):
	for edge in edges:
    #간선에서 두 노드를 a,b에 할당한다
    	a,b = edge
        #a,b가 같은 집합에 속한다면 사이클이 형성된다.
        if sameParent(a,b)
        	return True #종료!
        #사이클이 발견되지 않았으니, union 호출 후 a,b가 속한 집합을 합친다.
        unionParent(a,b)
    #사이클이 발견 안 되면 False반환
    return False&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코딩테스트 대비/알고리즘</category>
      <author>bee22</author>
      <guid isPermaLink="true">https://beehand.tistory.com/158</guid>
      <comments>https://beehand.tistory.com/158#entry158comment</comments>
      <pubDate>Thu, 5 Oct 2023 21:44:28 +0900</pubDate>
    </item>
    <item>
      <title>[Python][프로그래머스] lv3. 디스크 컨트롤러</title>
      <link>https://beehand.tistory.com/157</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42627?language=python3#&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42627?language=python3#&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1696504082038&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42627?language=python3#&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rc4MP/hyT5UrfCLk/WOwrqsLc0do865ksT7YnN0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bhHTxg/hyT5Yf6OCR/QfvjAd6e73Fa0mMTKzw09K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42627?language=python3#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42627?language=python3#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rc4MP/hyT5UrfCLk/WOwrqsLc0do865ksT7YnN0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bhHTxg/hyT5Yf6OCR/QfvjAd6e73Fa0mMTKzw09K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1696504113493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import heapq

def solution(jobs):
    answer, now, i, now = 0,0,0,-1
    l = len(jobs)
    pq = []
    jobs.sort(key=lambda x:x[0], reverse=True) 
#도착 시간을 기준으로 내림차순 정렬한다.

    while True:
        while len(jobs) and jobs[-1][0] &amp;lt;= now: 
#마지막에 도착한 작업이 현재 시간보다 적다면
            ms, time = jobs.pop() #pop!
            heapq.heappush(pq, [time, ms]) #heap에 넣기

        if len(jobs) and not len(pq) and now &amp;lt; jobs[-1][0]:
#jobs는 아직 남아있고, pq는 비었을 때 now보다 늦은 작업이 jobs에 있으면
            now = jobs[-1][0]
#가장 늦은 작업의 도착 시간을 now로 설정
        else:
            time, ms = heapq.heappop(pq)
            answer += (now - ms) + time
            now += time #누적하기
            
        if not len(jobs) and not len(pq):
#jobs도 pq도 비어있으면 break
            break

    return answer // l&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다른 사람의 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1696505728402&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import heapq

def solution(jobs):
    answer, now, i, last = 0, 0, 0, -1
    l = len(jobs)
    pq = []

    while i &amp;lt; l:
        # 현재 시간보다 이전에 요청된 작업을 모두 큐에 추가
        for job in jobs:
            if last &amp;lt; job[0] &amp;lt;= now:
                answer += (now - job[0])
                heapq.heappush(pq, job[1])

        if pq:
            answer += (len(pq) * pq[0])
            last = now
            now += heapq.heappop(pq)
            i += 1  
        else:
            now += 1

    return int(answer // l)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 리뷰&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;heapq 우선순위 큐&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;heap이 매우 약하다는 것을 알아버렸다. heap을 언제 사용하는지 어려워하는 내 모습을 보면서 1차 충격을 받았다. heap 좀 열심히 연습해야겠다. 그래서 이번 문제를 풀면서도 주석을 굉장히 열심히 달았다. 이 문제는 뜯어봐야 제맛인 것 같으니 어서 뜯어보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696504226419&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import heapq&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 heapq를 import 해주면 heappush, heappop 등의 함수들을 사용할 수 있다. 그리고 만약 PriorityQueue를 사용하고 싶으면, from queue import PriorityQueue를 해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696504394023&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(jobs):
    answer, now, i, now = 0,0,0,-1
    l = len(jobs)
    pq = []
    jobs.sort(key=lambda x:x[0], reverse=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이건 기본 세팅이다. &lt;span style=&quot;background-color: #202b3d; color: #b2c0cc; text-align: left;&quot;&gt;[[0, 3], [1, 9], [2, 6]]&lt;/span&gt; 이런 모습의 jobs라는 list가 기본으로 주어진다. 나는 이 list에서 x[0]값을 기준으로 내림차순 정렬하려고 sort를 했다. 여기서 x[0]은 작업 요청이 들어온 시간인데, 각각의 리스트 중에서 앞에 있는 숫자를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696504572301&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while True:
        while len(jobs) and jobs[-1][0] &amp;lt;= now: 
            ms, time = jobs.pop() #pop!
            heapq.heappush(pq, [time, ms]) 

        if len(jobs) and not len(pq) and now &amp;lt; jobs[-1][0]:
            now = jobs[-1][0]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 돌리면서, 현재 시간이랑 jobs의 마지막 도착 시간이랑 비교한다. 그리고 마지막에 도착한 작업을 heap에 넣는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 반복문은 jobs에 한 개 이상의 수가 들어있으면서, pq가 비어있는지를 검사한다. 그리고 현재 시간이 jobs의 마지막 도착 시간보다 작은지를 동시에 검사한다. 현재 시간인 now보다 늦은 작업이 jobs에 있다면 now에 가장 늦은 작업을 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 조심할 부분은 만약 not len(pq)를 사용한다면 index error가 발생한다. pq가 비어있을 때 pq를 직접 사용한다면 index error가 발생하기 때문이다. 그러니 반드시 not len(pq) 이렇게 사용하자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696505501180&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        else:
            time, ms = heapq.heappop(pq)
            answer += (now - ms) + time
            now += time&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 만약에 pq가 비어있지 않는다면, pop으로 heap에 들어있는 수를 꺼내주고 answer에 걸리는 시간을 계산하여 저장한다. 현재 시간 - 작업 요청 도착 시간 + 소요 시간을 해주면 된다. 누적해서 더해주어야 문제 조건에 일치하니 계속해서 합해주도록 한다. 그리고 현재 시간에는 걸리는 시간을 계속해서 누적해주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696505594461&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; if not len(jobs) and not len(pq):
            break

    return answer // l&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 jobs가 비었고, pq도 텅텅 비었다면 할 연산은 더이상 없는 것이다... 끝내자! 마지막으로 문제 조건에 맞게 누적 소요 시간을 작업의 총 개수로 나누어주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;heapq....공부하자~ heap은 자동으로 정렬을 하기 때문에 가장 큰 수를 빼내거나, 가장 작은 수를 빼낼 때 아주 좋은 도구이다. 잘 이용해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Heap&lt;/b&gt;에 대한 자세한 설명은 밑에서 볼 수 있다.&lt;/p&gt;
&lt;figure id=&quot;og_1696504295136&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[자료구조] 힙(Heap) / 우선순위 큐(PriorityQueue) 파이썬으로 구현하기&quot; data-og-description=&quot;Heap이란 heap : '무엇인가를 차곡차곡 쌓아올린 더미' 라는 뜻이 있다. 말 그대로 힙은 항상 완전 이진 트리의 형태를 띤다. 우선순위 큐 데이터를 추가한 순서와 상관없이 데이터를 꺼낼 때 값을 &quot; data-og-host=&quot;beehand.tistory.com&quot; data-og-source-url=&quot;https://beehand.tistory.com/73&quot; data-og-url=&quot;https://beehand.tistory.com/73&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/huJ3p/hyT53V0KJT/6zFVyp2OC79Ot6aK089ABk/img.png?width=260&amp;amp;height=254&amp;amp;face=0_0_260_254,https://scrap.kakaocdn.net/dn/BsN6q/hyT5VDGcNm/8k4FibzqSy2WkmUiidDid1/img.png?width=260&amp;amp;height=254&amp;amp;face=0_0_260_254,https://scrap.kakaocdn.net/dn/c4sT79/hyT5WbwPZH/6McdBuQWu6EHD8utcWJbR1/img.png?width=837&amp;amp;height=320&amp;amp;face=0_0_837_320&quot;&gt;&lt;a href=&quot;https://beehand.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://beehand.tistory.com/73&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/huJ3p/hyT53V0KJT/6zFVyp2OC79Ot6aK089ABk/img.png?width=260&amp;amp;height=254&amp;amp;face=0_0_260_254,https://scrap.kakaocdn.net/dn/BsN6q/hyT5VDGcNm/8k4FibzqSy2WkmUiidDid1/img.png?width=260&amp;amp;height=254&amp;amp;face=0_0_260_254,https://scrap.kakaocdn.net/dn/c4sT79/hyT5WbwPZH/6McdBuQWu6EHD8utcWJbR1/img.png?width=837&amp;amp;height=320&amp;amp;face=0_0_837_320');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[자료구조] 힙(Heap) / 우선순위 큐(PriorityQueue) 파이썬으로 구현하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Heap이란 heap : '무엇인가를 차곡차곡 쌓아올린 더미' 라는 뜻이 있다. 말 그대로 힙은 항상 완전 이진 트리의 형태를 띤다. 우선순위 큐 데이터를 추가한 순서와 상관없이 데이터를 꺼낼 때 값을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;beehand.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩테스트 대비/프로그래머스</category>
      <author>bee22</author>
      <guid isPermaLink="true">https://beehand.tistory.com/157</guid>
      <comments>https://beehand.tistory.com/157#entry157comment</comments>
      <pubDate>Thu, 5 Oct 2023 20:35:02 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 조건문의 list?  True or False</title>
      <link>https://beehand.tistory.com/156</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;조건문에서 list 사용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건문에서 DFS, BFS 등의 리스트, 큐를 활용하는 알고리즘을 사용하다보면 조건문에 리스트를 사용하는 경우가 흔하게 있다. 그런데 나는 개념이 잡혀있지 않을 때는 조금 헷갈릴 때도 있어서, visited 처럼 거의 고유명사처럼 사용되는 리스트는 아예 외워버리고는 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1696486550511&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if not visited:&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, 그래서 visited가 뭔데? 방문하지 않은 상황이라는 것은 알겠다만..그래서 코드 안에서 작동되는 이 visited라는 상황은 뭔데? 라는 의문이 끝없이 든 적도 있었다. &lt;s&gt;(그렇게 계속 궁금하기만 했던 나 반성해..)&amp;nbsp;&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;False, True의 조건&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 알아냈다. 파이썬의 특성 자체였다. &lt;b&gt;list에 대한 조건문에서, 비어있는 list는 False로 판단된다. 그리고 하나 이상의 원소가 있는 list라면 True로 판단된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 파이썬에서는 조건식을 평가할 때, 값이 &lt;b&gt;'False', 'None', '0', '&amp;nbsp; ' (빈 문자열), 빈 컨테이너(list, tuple, dictionary 등)은 False로 판단&lt;/b&gt;된다. 그리고 &lt;b&gt;그 외의 값들은 모두 True&lt;/b&gt;로 판단된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 list의 유무를 판단할 때 not을 붙여서 사용하면 가독성도 좋고, 사용하기도 편리하다.&lt;/p&gt;</description>
      <category>코딩테스트 대비/Python 문법</category>
      <author>bee22</author>
      <guid isPermaLink="true">https://beehand.tistory.com/156</guid>
      <comments>https://beehand.tistory.com/156#entry156comment</comments>
      <pubDate>Thu, 5 Oct 2023 15:21:45 +0900</pubDate>
    </item>
    <item>
      <title>[Python][프로그래머스] lv3. 베스트앨범</title>
      <link>https://beehand.tistory.com/155</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=python3&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=python3&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1696433230676&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=python3&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cpUfnG/hyT5RHJ5cY/dJTxgRttdwcErX7hLO5txk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/HSPSa/hyT55srg22/stdCrkEoJrACtQ3AEwauV0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=python3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=python3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cpUfnG/hyT5RHJ5cY/dJTxgRttdwcErX7hLO5txk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/HSPSa/hyT55srg22/stdCrkEoJrACtQ3AEwauV0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내 코드&lt;/h2&gt;
&lt;pre id=&quot;code_1696433252967&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(genres, plays):
    answer = []
    mlist = {}
    total_score={}
    
    for idx, (genre, play) in enumerate(zip(genres, plays)):
        if genre in mlist:
            mlist[genre].append((idx, play))
            total_score[genre] += play
        else:
            mlist[genre] = [(idx, play)]
            total_score[genre] = play
    
    mlist = sorted(mlist.items(), key=lambda x: total_score[x[0]], reverse=True) 
    
    for genre, info in mlist: #장르, 노래정보
        for idx, play in sorted(info, key= lambda x: x[1], reverse=True)[:2]:
            answer.append(idx)

    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 리뷰&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;dictionary, lambda 정렬&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 프로그래머스의 해시 카테고리 안에 있는 문제인데, 해시 카테고리가 없더라도 무조건 dict가 편할 것 같다는 느낌이 오는 문제이다. 문제를 풀기 위해 lambda로 푸는 방식을 계속 생각했는데, 역시 lambda로 해결하는 게 정말 편했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제에서는 두 개의 list가 주어진다. 하나는 노래 장르, 하나는 플레이한 횟수가 담겨있는 리스트이다. 이를 다음의 조건에 따라 정렬해서 출력해야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;플레이 횟수가 가장 많은 장르 순서&lt;/li&gt;
&lt;li&gt;그 안에서도 플레이 횟수가 많은 idx 순서&lt;/li&gt;
&lt;li&gt;각 장르별 2개씩 출력&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696433344466&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    answer = []
    mlist = {}
    total_score={}
    for idx, (genre, play) in enumerate(zip(genres, plays)):
        if genre in mlist:
            mlist[genre].append((idx, play))
            total_score[genre] += play
        else:
            mlist[genre] = [(idx, play)]
            total_score[genre] = play&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 우선 두 개의 dict를 사용했다. 하나는 mlist로, 각각의 장르별 플레이 횟수와 idx를 저장하는 리스트이다. 다른 하나는 total_score로 장르별 전체 플레이 횟수를 저장하는 dict이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 idx를 생각하기 위해 enumerate와 zip을 사용했다. 먼저 장르별 순위를 매기기 위해 zip(장르, 플레이 횟수)를 묶어주었고, mlist에 저장했다. 그리고 동시에 total_score에 해당하는 장르의 플레이 횟수를 누적해서 더했다. 이러면 기본 세팅은 끝난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696433778019&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; mlist = sorted(mlist.items(), key=lambda x: total_score[x[0]], reverse=True)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 mlist를 정렬해준다. 이를 정렬하는 이유는 첫 번째 조건인 장르의 전체 플레이 횟수가 높은 순대로 정렬한다는 조건 때문이다. 그래서 mlist.items()로 key와 value를 불러준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 첫 번째는 total_score[x[0]] 순으로 정렬, 두 번째로 x[1]이 높은 순대로 정렬한다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;total_score[x[0]] 는 장르의 총 점수를 기준으로 정렬하겠다는 의미이다. 만약 x[0]만 쓴다면 단어의 이름 순으로 정렬이 된다. x가 mlist의 key이고, 곧 장르 이름이기 때문이다. 그래서 동일한 총 점수를 가진 것들에서는 무작위로 정렬이 이루어질 수 있다. 그렇기 때문에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;total_score[x[0]] 으로 써줘야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696434063587&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    for genre, info in mlist: #장르, 노래정보
        for idx, play in sorted(info, key= lambda x: x[1], reverse=True)[:2]:
            answer.append(idx)

    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 mlist는 장르의 전체 플레이 횟수대로 정렬된 상태이다. (장르, (idx, play 횟수)) 이 상태로 정렬되어 있는데, 이제 두 번째 조건인 play 횟수가 큰 순으로 정렬을 해주어야 한다. 그래서 info를 꺼내고, 이 안에서 play횟수에 해당하는 x[1] 순으로 정렬해준다. 그리고 reverse=True를 해서 내림차순을 만들어준다. 마지막에 [:2]는 [0,1]에 해당하며 2개만 꺼내겠다는 의미이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 취향이지만 dict문제는 다른 유형보다 조금 더 재밌는 것 같다. 이 문제 역시 dict 문제들 중에서도 재밌는 문제였다. lambda에 대해 공부하고 싶다면 좋은 문제인 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>코딩테스트 대비/프로그래머스</category>
      <author>bee22</author>
      <guid isPermaLink="true">https://beehand.tistory.com/155</guid>
      <comments>https://beehand.tistory.com/155#entry155comment</comments>
      <pubDate>Thu, 5 Oct 2023 00:44:22 +0900</pubDate>
    </item>
    <item>
      <title>[Python] extend vs append 구분하기</title>
      <link>https://beehand.tistory.com/154</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;append&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 문법을 사용하다보면 정말 많이 쓰는 함수 중 하나가 append이다. 너무 당연하게 사용하던 탓에, append가 문제의 출력 조건을 지키지 않으면 당황할 때가 종종 있다. 그럴 때는 for로 풀어주거나, join으로 풀어주고는 하는데 이제는 그럴 필요가 없다! 그럴 경우에 extend를 생각한다면, 더 많은 조건을 부합할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 append는 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1696405994722&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.append(list2)
print(list1)  

# 출력: [1, 2, 3, [4, 5, 6]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 list에 다른 list 하나를 더 추가한다면, 갑자기 list안에 list를 품어버린다. 진짜 말 그대로 append는 요소를 그대로 추가한다. &lt;b&gt;append&lt;/b&gt;는 리스트에 새로운 요소를 추가할 때 사용되지만, 인자로 &lt;b&gt;전달된 값 자체&lt;/b&gt;를 리스트의 &lt;b&gt;마지막 요소로 추가&lt;/b&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;extend&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 extend는 list에만 있는 함수고, iterable 객체의 요소들을 추가할 때 사용한다. append와 매우 다른 점은, &lt;b&gt;extend&lt;/b&gt;는 list의 &lt;b&gt;각 요소가 개별적인 요소로 다른 list에 추가&lt;/b&gt;된다는 점이다. 다음과 같다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696406339813&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1)  

# 출력: [1, 2, 3, 4, 5, 6]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트를 extend 했지만, 정작 list1에 추가된 것은 list2을 구성하고 있는 각각의 요소 하나하나가 들어온 것이다. 그래서 결과를 출력할 때는 이런 모습을 요구하는 문제들이 많은데, 그럴 때 사용하기 좋다.&lt;/p&gt;</description>
      <category>코딩테스트 대비/Python 문법</category>
      <author>bee22</author>
      <guid isPermaLink="true">https://beehand.tistory.com/154</guid>
      <comments>https://beehand.tistory.com/154#entry154comment</comments>
      <pubDate>Wed, 4 Oct 2023 17:02:27 +0900</pubDate>
    </item>
    <item>
      <title>시드 스터디카페 후기</title>
      <link>https://beehand.tistory.com/153</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;스터디카페 첫 방문&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시드 스터디카페를 몇 달 전부터 가기 시작했다. 그때는 시험을 앞두고 있는 상태라 급해서 근처 스터디 카페 아무데나 들어갔는데, 그게 시드였다. 막상 이용해보니 생각보다 괜찮기도 하고, 동네 스터디카페의 가격들이 거의 비슷하게 형성되어 있어서 굳이 비교할 필요가 없다고 생각했다. 그래서 이후 스터디카페 사용할 일이 있으면 늘 이곳만 찾게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;1996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CZ9t9/btsv7bRPzCb/BD1DQVhIQtTkKKdlt4Akv1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CZ9t9/btsv7bRPzCb/BD1DQVhIQtTkKKdlt4Akv1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CZ9t9/btsv7bRPzCb/BD1DQVhIQtTkKKdlt4Akv1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCZ9t9%2Fbtsv7bRPzCb%2FBD1DQVhIQtTkKKdlt4Akv1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1497&quot; height=&quot;1996&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;1996&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 들어가면 한번 더 찍고 문을 열어야 해서 방음은 잘 된다. 바로 옆의 스터디룸은 바로 옆에 문이 있어서 QR 찍는 소리가 들리는 정도로 방음이 덜 되긴 하지만, 그래도 나쁘지 않다. 그래서 이 방에서 시험도 본 적 있다. 감독관이 아무 터치도 하지 않았을 정도이니 시험 보기에 괜찮다고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내부 시설들&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;1821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfwa1J/btswcHIBM8N/FxK0JGeWLkLvvko4yloJ4K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfwa1J/btswcHIBM8N/FxK0JGeWLkLvvko4yloJ4K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfwa1J/btswcHIBM8N/FxK0JGeWLkLvvko4yloJ4K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfwa1J%2FbtswcHIBM8N%2FFxK0JGeWLkLvvko4yloJ4K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;634&quot; height=&quot;845&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;1821&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 각종 필요한 물건들이 가지런히 놓여있어서 필요할 때 빼서 쓰기 좋다. 이 부분은 정말 만족스럽다. 특히 충전기 안 가져왔을 때 조금 곤란할 수 있는데, 그런 곤란함도 느끼지 않아도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;2040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cT07VM/btswgT9SdHI/F3NgozAtZctqDh1WwAdbA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cT07VM/btswgT9SdHI/F3NgozAtZctqDh1WwAdbA1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cT07VM/btswgT9SdHI/F3NgozAtZctqDh1WwAdbA1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcT07VM%2FbtswgT9SdHI%2FF3NgozAtZctqDh1WwAdbA1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;777&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;2040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 내가 가장 마음에 들었던 부분은 깔끔하게 정리된 이 곳이다. 공부하면 졸릴 때도 있는데, 냉수 먹고 잠 깨는 것 가능...전체적으로 깔끔하고 깨끗해서 너무 좋다. 커피도 제공되니 좋고, 점점 진화하는 느낌이라서 기대되는 것도 있다. 예전에는 핫식스가 없었던 것 같은데 최근에 가보니 핫식스가 생겼더라..&lt;s&gt;.(원래 있었나..?)&amp;nbsp;&lt;/s&gt;무튼 정말 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;2310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xk75L/btswBBOaeah/B2hZqc9bf6N8cKSkidYAoK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xk75L/btswBBOaeah/B2hZqc9bf6N8cKSkidYAoK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xk75L/btswBBOaeah/B2hZqc9bf6N8cKSkidYAoK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXk75L%2FbtswBBOaeah%2FB2hZqc9bf6N8cKSkidYAoK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;887&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;2310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 사물함도 있고, 밖에 더 많은 사물함들이 있다. 그래서 공부를 열심히 하는 사람들이라면 얼마든지 책을 놓고 다닐 수 있다. 진짜 편할 것 같지만 나는 노트북만 있으면 돼서 사물함을 써본 적은 없다. 근데 사물함마저 깔끔하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 조금 독특한 부분은 화장실이 밖에 있고, 화장실 바로 앞에는 서서 공부할 수 있는 책상이 놓여져있다. 가끔&lt;s&gt;(이라 하고 종종이라 읽는다) &lt;/s&gt;화장실 가면서 열공 중인 사람들을 볼 수 있다. 서로 신경쓰지 않으니 편하게 다녀올 수 있다. 전체적으로 정말 깨끗하고 깔끔한 게 이곳만의 장점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 노트북존이 있다. 내가 이 사실을 몰라서 예전에 여기를 망설였던 적이 있는데...! 아무도 얘기를 안해서 이 동네에는 그런 스카가 존재하지 않는 줄 알았다. 이런...근데 노트북존을 사용해보니까, 생각보다 더 조용하고...몇 시간 오래 있어봤는데 노트북을 사람들이 생각보다 좀 조심스럽게 사용하는 것 같다. 분위기가 그러니까, 나처럼 눈치 많이 보는 사람들은 약간의 각오?를 하고 와야 할 것 같은 느낌이다. 그래도 노트북존에서 편하게 버튼 누르고 할 수 있어서 강의듣기에는 매우 편하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 동네 사는 동안에는 꽤 자주 사용할 것 같은 느낌이다. 정말 깔끔하고 깨끗한 스터디카페다.&lt;/p&gt;</description>
      <category>공부/기타</category>
      <author>bee22</author>
      <guid isPermaLink="true">https://beehand.tistory.com/153</guid>
      <comments>https://beehand.tistory.com/153#entry153comment</comments>
      <pubDate>Sun, 1 Oct 2023 22:50:08 +0900</pubDate>
    </item>
    <item>
      <title>[직무부트캠프] 코멘토 - 금융 IT 개발 실무 (API 개발, DB)</title>
      <link>https://beehand.tistory.com/152</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;나의 첫 부트캠프&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때는 2022년 4월 어느 날... 갑자기 학교 공지에 글이 하나 떴다. 부트캠프를 전액으로 지원해준다는 글이었다. 원래 모든 학교가 남는 건 돈밖에 없으니, 학생의 본분은 학교의 돈을 쓰는 것이라고 알고 있던 나는 얼른 지원했다. 오늘도 뽕뽑았다고 땀 쓰윽 닦으며 기다렸는데, 한 며칠 있다가 알림이 오더라.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/digM4y/btswas5SCG4/t1Llc9BvWKHnRzaJTBks80/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/digM4y/btswas5SCG4/t1Llc9BvWKHnRzaJTBks80/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/digM4y/btswas5SCG4/t1Llc9BvWKHnRzaJTBks80/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdigM4y%2Fbtswas5SCG4%2Ft1Llc9BvWKHnRzaJTBks80%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;364&quot; height=&quot;199&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 직무 관련된 경험이나 활동하는 것을 좋아했던 대학생 때의 나는 헐레벌떡 코멘토 들어가서 등록했다.&lt;s&gt; (혹시 놓칠까봐ㅋㅋ)&amp;nbsp;&lt;/s&gt;와 근데 진짜 인기 많았는지, 그때 슥 둘러봤던 강의들이 무슨 3n번째 강의고, 6n번째 강의고...아니 그때 나도 전문성 쌓아서 강의하고 싶다는 욕심이 끓어올랐다. 정말 다양한 분야의 현직자들이 직접 하는 강의들이 많더라.&lt;/p&gt;
&lt;figure id=&quot;og_1696055168860&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코멘토&quot; data-og-description=&quot;진짜 현직자와 찐한 실무체험. 인턴 경험이 없다면 코멘토 직무부트캠프에 참여하세요. 어려운 지원 프로세스 없이 직무경험을 쌓을 수 있습니다.&quot; data-og-host=&quot;comento.kr&quot; data-og-source-url=&quot;https://comento.kr/edu&quot; data-og-url=&quot;https://comento.kr/edu&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGGsse/hyT2AGrjdC/Vwx5M4vF4nOVtdowAXPYWK/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=1597_408_1833_666,https://scrap.kakaocdn.net/dn/Tmzgk/hyT2zU5nQE/3f8w3HqJ7MVGUQNq7UJzn1/img.jpg?width=978&amp;amp;height=780&amp;amp;face=611_282_739_410,https://scrap.kakaocdn.net/dn/bUarQx/hyT555Rmxz/NskNi19w6HBVY7d2zavh90/img.jpg?width=978&amp;amp;height=780&amp;amp;face=0_0_978_780&quot;&gt;&lt;a href=&quot;https://comento.kr/edu&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://comento.kr/edu&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGGsse/hyT2AGrjdC/Vwx5M4vF4nOVtdowAXPYWK/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=1597_408_1833_666,https://scrap.kakaocdn.net/dn/Tmzgk/hyT2zU5nQE/3f8w3HqJ7MVGUQNq7UJzn1/img.jpg?width=978&amp;amp;height=780&amp;amp;face=611_282_739_410,https://scrap.kakaocdn.net/dn/bUarQx/hyT555Rmxz/NskNi19w6HBVY7d2zavh90/img.jpg?width=978&amp;amp;height=780&amp;amp;face=0_0_978_780');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;코멘토&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;진짜 현직자와 찐한 실무체험. 인턴 경험이 없다면 코멘토 직무부트캠프에 참여하세요. 어려운 지원 프로세스 없이 직무경험을 쌓을 수 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;comento.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 4학년 때 금융권을 꿈꿔왔던 사람이라서, 당연히 금융 IT는 어떤 강의가 있는지부터 찾아보았다. 사실 듣고싶은 강의가 너무 많아서 고민이 됐고, 내가 사용할 수 있는 카드도 하나라서 신중하게 결정할 수밖에 없었다. 그렇게 고심 끝에 결정한 강의가 바로 금융 API 개발 부트캠프다.&amp;nbsp;그런데 너무 아쉽게도 지금 그 강의가 리스트에 보이지 않는다...강사님 그때도 대단하시더니 1년 사이에 정말 바빠지셨나보군요...&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4주차 강의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 들었던 강의는 총 4주차로 구성된 커리큘럼이었다. 1주차 때는 간단하게 Maria DB 깔고, 엑셀을 받아서 필요한 정보만 추출해오는 작업을 했다. 아니 너무 좋았던 게 과제를 내고, 그 과제에 대한 피드백을 1:1로 해주신다는 것이었다. 솔직히 나 4학년 때 진짜 개노답 삼형제 중 한명이라, &lt;s&gt;개발에 '개'자도 몰랐다ㅋㅋ.&amp;nbsp;&lt;/s&gt;솔직히 이거 피드백 단체로 받으면 공개 처형감이었다ㅋㅋㅋ&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eBpFLr/btswgU1PHii/Sar2DQDDaqnURSN1LXufUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eBpFLr/btswgU1PHii/Sar2DQDDaqnURSN1LXufUK/img.png&quot; data-alt=&quot;따뜻한 피드백,,눈물..&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eBpFLr/btswgU1PHii/Sar2DQDDaqnURSN1LXufUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeBpFLr%2FbtswgU1PHii%2FSar2DQDDaqnURSN1LXufUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;183&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;따뜻한 피드백,,눈물..&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 이후로 SQLD 후다닥 땄다지...피드백 수용 빠른 편. 확실히 SQLD 있으니까 이거 다시 하라면 쉽게 할 수 있을 것 같다! 그때는 조금 어려웠는데 말이지. 그리고 이렇게 각각 과제 문제에 대한 답변을 다 올려주신다. 이 부분은 너무 좋았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YNIaD/btsv7fGv1Ln/GWIAR1UYoIcRXSVfrgwkrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YNIaD/btsv7fGv1Ln/GWIAR1UYoIcRXSVfrgwkrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YNIaD/btsv7fGv1Ln/GWIAR1UYoIcRXSVfrgwkrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYNIaD%2Fbtsv7fGv1Ln%2FGWIAR1UYoIcRXSVfrgwkrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;506&quot; height=&quot;332&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이런 식으로 답변을 주시는데, 코드는 강사님의 소중한 자산이니 모자이크를 하겠다. 2주차에는 스크래핑을 했다. 사이트를 이용해서 크롤링한 후 정보를 가져오는 작업이었다. 웹 크롤링은 이미 학교에서 한 번 해본 적이 있지만, 망나니였던 나는 왜 매일이 처음같을까..? 그래도 열심히 해냈다!&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nPhvy/btsv7p3mLQo/KkZFQ2GNehWfzcFA7F3HUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nPhvy/btsv7p3mLQo/KkZFQ2GNehWfzcFA7F3HUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nPhvy/btsv7p3mLQo/KkZFQ2GNehWfzcFA7F3HUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnPhvy%2Fbtsv7p3mLQo%2FKkZFQ2GNehWfzcFA7F3HUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;265&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 못하든 잘하든 너무 잘해주셨다고 말해주시는 따뜻한 마음씨,, 덕분에 이렇게 성장할 수 있었습니다 강사님ㅎㅎ 이 칭찬에 힘입어 다음 주차는 대차게 말아먹었다ㅋㅋ 진짜 API 규격 나에게는 아직 어렵더라ㅜ 3주차에는 API 연동 규격서를 작성해보았는데 확실히 지켜야 할 부분들이 많고 모르는 것들이 많았다..진짜 새로운 분야를 배우는 느낌이 팍 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 4주차에서는 이 모든 것들을 사용한 프로젝트 개발을 했다. 정말 나는 부족한 사람이구나를 많이 느끼면서 열심히 따라가려고 노력했던 것 같다. 학교 덕분에 이런 경험도 다 해보고, 금융권 IT가 만만치 않구나 싶은 생각이 들었다. 그리고 매번 MySQL만 사용하다가 새롭게 Maria DB를 사용해봤는데, 신기하고 더 많은 경험을 쌓게 되어서 좋았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;수료 후 도움이 되었나?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진짜 자소서 쓸 때 느꼈던 건데, 요즘은 경험이 정말 중요한 시대인 것 같다. 사실 신입한테 별 기대 안하는 것도 크기 때문에, 거창하게 뭘 운영했다, 내가 이 정도나 개선했다 이런 빅 프로젝트도 좋지만 그런 경험은 쌓기가 어렵다. 회사 들어가야 다룰 수 있는 툴들도 많고 하다보니, 이렇게 소소한 프로젝트 하면서 나 이렇게 경험 쌓으려고 노력했어요 하고 어필하는 것도 잘 먹히는 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Lpcd/btsv7U29IhF/sybRXDGlVGZC30h8OEQuuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Lpcd/btsv7U29IhF/sybRXDGlVGZC30h8OEQuuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Lpcd/btsv7U29IhF/sybRXDGlVGZC30h8OEQuuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Lpcd%2Fbtsv7U29IhF%2FsybRXDGlVGZC30h8OEQuuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;49&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강사님 계신 곳은 신입이 못 가는 곳이잖아요..살아서 한 번쯤은 뵐 수 있겠죠...? 아무튼 정말 좋은 경험이었고, 이런 부트 캠프 기회가 한 번 더 있다면 무조건 참여할 의향이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 후기는 직무부트캠프를 직접 구매하고 수강한 후 작성하였으며, 후기 작성 이벤트에 참여하여 소정의 원고료를 받았습니다.&lt;/p&gt;</description>
      <category>공부/자격증</category>
      <author>bee22</author>
      <guid isPermaLink="true">https://beehand.tistory.com/152</guid>
      <comments>https://beehand.tistory.com/152#entry152comment</comments>
      <pubDate>Sat, 30 Sep 2023 15:42:02 +0900</pubDate>
    </item>
  </channel>
</rss>