<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>go_blin.log</title>
        <link>https://velog.io/</link>
        <description>.</description>
        <lastBuildDate>Sat, 18 Sep 2021 16:38:11 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. go_blin.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/go_blin" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[BOJ] 11726 : 2xn 타일링]]></title>
            <link>https://velog.io/@go_blin/BOJ-11726-2xn-%ED%83%80%EC%9D%BC%EB%A7%81</link>
            <guid>https://velog.io/@go_blin/BOJ-11726-2xn-%ED%83%80%EC%9D%BC%EB%A7%81</guid>
            <pubDate>Sat, 18 Sep 2021 16:38:11 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/11726">BOJ 11726 : 2xn 타일링</a></p>
<h3 id="문제">문제</h3>
<p>2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.</p>
<p>아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.</p>
<p><img src="https://images.velog.io/images/go_blin/post/1bc5b230-ff66-41f7-8ee0-7cecc9b16488/image.png" alt=""></p>
<h3 id="span-stylecolorff1493제출-코드span"><span style="color:#FF1493">제출 코드</span></h3>
<pre><code>n=int(input())
d=[0]*1001

d[1]=1
d[2]=2

for i in range(3,n+1):
    d[i]=d[i-1]+d[i-2]

print(d[n]%10007)
</code></pre><h3 id="span-stylecolorslateblue풀이span"><span style="color:slateblue">풀이</span></h3>
<p>이 문제는 그림을 그려 생각해보면 쉬운데, 
n=1 일 때의 방법의 수 : 1
n=2 일 때의 방법의 수 : 2
n=3 일 때의 방법의 수 : 3
n=4 일 때의 방법의 수 : 5
... 이고 이 문제가 최적 부분 구조를 가진다는 점만 떠올린다면 바로 풀 수 있다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 14495 : 피보나치 비스무리한 수열]]></title>
            <link>https://velog.io/@go_blin/BOJ-14495-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%EB%B9%84%EC%8A%A4%EB%AC%B4%EB%A6%AC%ED%95%9C-%EC%88%98%EC%97%B4</link>
            <guid>https://velog.io/@go_blin/BOJ-14495-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%EB%B9%84%EC%8A%A4%EB%AC%B4%EB%A6%AC%ED%95%9C-%EC%88%98%EC%97%B4</guid>
            <pubDate>Sat, 18 Sep 2021 16:18:00 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/14495">BOJ 14495 : 피보나치 비스무리한 수열</a></p>
<h3 id="문제">문제</h3>
<p>피보나치 비스무리한 수열은 f(n) = f(n-1) + f(n-3)인 수열이다. f(1) = f(2) = f(3) = 1이며 피보나치 비스무리한 수열을 나열하면 다음과 같다.</p>
<p>1, 1, 1, 2, 3, 4, 6, 9, 13, 19, ...</p>
<p>자연수 n을 입력받아 n번째 피보나치 비스무리한 수열을 구해보자!</p>
<h3 id="span-stylecolorff1493제출-코드span"><span style="color:#FF1493">제출 코드</span></h3>
<pre><code>d=[0]*117

d[1]=1
d[2]=1
d[3]=1

n=int(input())

for i in range(4, n+1):
    d[i]=d[i-1]+d[i-3]


print(d[n])
</code></pre><h3 id="span-stylecolorslateblue풀이span"><span style="color:slateblue">풀이</span></h3>
<p>이 문제는 정말 기본적인 다이나믹 프로그래밍 문제이다.
처음에 테이블을 초기화 할 때 범위를 잘못 설정해서 런타임 에러가 났다..ㅎㅎ
풀고나서 보니까 초기화할 때 굳이 0으로 하지 않고 전체를 1로 초기화해도 풀렸을 것 같다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[BOJ] 2805 : 나무 자르기]]></title>
            <link>https://velog.io/@go_blin/BOJ-2805-%EB%82%98%EB%AC%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0</link>
            <guid>https://velog.io/@go_blin/BOJ-2805-%EB%82%98%EB%AC%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0</guid>
            <pubDate>Mon, 13 Sep 2021 14:30:22 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/2805">BOJ 1805 : 나무 자르기</a></p>
<p>이 문제는 이분 탐색을 이용해 최댓값을 찾으면 되는 문제이다.</p>
<p>처음에는 시간 초과가 났었는데 나무의 수가 목표량을 넘어갈 때 brake를 걸어주니 통과됐다.</p>
<pre><code>import sys
n, m = map(int,sys.stdin.readline().split())
array = list(map(int,input().split()))

start = 0
end = max(array)

result=0

while start &lt;= end :
    mid = (start + end) //2
    total = 0

    for x in array:
        if x &gt;= mid:
            total += x-mid
            if total &gt; m:
                break

    if total &gt;= m:
        result = mid
        start = mid +1
    else:
        end = mid -1

print(result)
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[파이썬] collections 모듈 - Counter (사용빈도 확인)]]></title>
            <link>https://velog.io/@go_blin/%ED%8C%8C%EC%9D%B4%EC%8D%AC-collections-%EB%AA%A8%EB%93%88-Counter-%EC%82%AC%EC%9A%A9%EB%B9%88%EB%8F%84-%ED%99%95%EC%9D%B8</link>
            <guid>https://velog.io/@go_blin/%ED%8C%8C%EC%9D%B4%EC%8D%AC-collections-%EB%AA%A8%EB%93%88-Counter-%EC%82%AC%EC%9A%A9%EB%B9%88%EB%8F%84-%ED%99%95%EC%9D%B8</guid>
            <pubDate>Sat, 21 Aug 2021 09:00:57 GMT</pubDate>
            <description><![CDATA[<p>데이터의 개수를 셀 때 유용한 파이썬의 collections 모듈의 Counter 클래스 사용법을 알아보겠습니다.</p>
<p>알파벳 사용빈도 확인</p>
<pre><code>from collections import Counter
Counter(&#39;hello world&#39;) </code></pre><p>위의 코드를 실행하면 다음과 같은 결과가 나옵니다.</p>
<pre><code>Counter({&#39;l&#39;: 3, &#39;o&#39;: 2, &#39;h&#39;: 1, &#39;e&#39;: 1, &#39; &#39;: 1, &#39;w&#39;: 1, &#39;r&#39;: 1, &#39;d&#39;: 1})</code></pre><p>다음으로는 <strong>most_common()</strong> 함수에 대해 설명하겠습니다.
most_common()함수는 Counter()에서 가장 빈도수가 높은 순으로 표시 해 주는 함수입니다.
인자값으로 숫자를 입력하면 숫자번째까지의 빈도수를 표시합니다.</p>
<pre><code>from collections import Counter
data=&quot;hello world&quot;

result=Counter(data)
print(result.most_common())
print(result.most_commom(2))</code></pre><p>위의 코드를 실행하면 다음과 같은 결과가 나옵니다.</p>
<pre><code>[(&#39;l&#39;,3),(&#39;o&#39;,2),(&#39;h&#39;,1),(&#39;e&#39;,1),(&#39; &#39;,1),(&#39;w&#39;,1),(&#39;r&#39;,1),(&#39;d&#39;,1)]
[(&#39;l&#39;,3),(&#39;o&#39;,2)]</code></pre><p>이 외에도 Counter()에는 많은 내부 함수가 포함되어 있지만 이 글에서는 다루지 않도록 하겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[올림, 내림, 반올림]]></title>
            <link>https://velog.io/@go_blin/%EC%98%AC%EB%A6%BC-%EB%82%B4%EB%A6%BC-%EB%B0%98%EC%98%AC%EB%A6%BC</link>
            <guid>https://velog.io/@go_blin/%EC%98%AC%EB%A6%BC-%EB%82%B4%EB%A6%BC-%EB%B0%98%EC%98%AC%EB%A6%BC</guid>
            <pubDate>Sat, 21 Aug 2021 08:36:13 GMT</pubDate>
            <description><![CDATA[<h3 id="올림">올림</h3>
<blockquote>
<p>import math 
math.ceil(-3.5)   #결과 : -3
math.ceil(3.5)    #결과 : 4</p>
</blockquote>
<h3 id="내림">내림</h3>
<blockquote>
<p>import math
math.floor(-3.5) #결과 : -4
math.floor(3.5) #결과 : 3</p>
</blockquote>
<blockquote>
<p>math.trunc(-3.5) #결과 : -3
math.floor(-3.5) #결과 : -4</p>
</blockquote>
<p>trunc() 함수는 내림을 할 때 0쪽으로 향하는 반면(int()와 비슷) floor() 함수는 무조건 낮은 값으로 내림한다.</p>
<h3 id="반올림">반올림</h3>
<p>파이썬에 내장된 round() 함수를 사용한다.</p>
<p>두 개의 인자를 받지만, 두 번째 인자가 생략되면 소수 첫째 자리에서 반올림한다.</p>
<blockquote>
<p>round(3.123) #결과 : 3
round(3.123,2) #결과 : 3.12</p>
</blockquote>
<p>✨사사오입 원칙
round()는 사사오입 원칙을 따른다. 
사사오입 원칙은 반올림 할 자리의 수가 5이면 반올림 할 때 앞자리의 숫자가 짝수면 내림하고 홀수면 올림한다.</p>
<blockquote>
<p>round(4.5) #결과 : 4
round(3.5) #결과 : 4</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준2798_블랙잭]]></title>
            <link>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%802798%EB%B8%94%EB%9E%99%EC%9E%AD</link>
            <guid>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%802798%EB%B8%94%EB%9E%99%EC%9E%AD</guid>
            <pubDate>Mon, 26 Jul 2021 10:07:28 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p>카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.</p>
<p>한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.</p>
<p>김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.</p>
<p>이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.</p>
<p>N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.</p>
<p>합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.</p>
<h3 id="출력">출력</h3>
<p>첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.</p>
<h3 id="span-stylecolorff1493제출-코드span"><span style="color:#FF1493">제출 코드</span></h3>
<pre><code>n,m = map(int,input().split())
data=list(map(int,input().split()))

result=0

for i in range(n):
    for j in range(i+1,n):
        for k in range(j+1,n):
            if data[i]+data[j]+data[k]&gt;m:
                continue
            else:
                result=max(result,data[i]+data[j]+data[k])

print(result)
</code></pre><h3 id="span-stylecolorslateblue풀이-과정span"><span style="color:slateblue">풀이 과정</span></h3>
<p>이 문제는 순열과 조합이 떠올랐다.
그래서 간단히 for문으로 해결할 수 있었는데 찾아보니 파이썬의 itertools 모듈의 combination 함수를 쓰면 더 간단히 풀 수 있다고 한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준18238_ZOAC 2]]></title>
            <link>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%8018238ZOAC-2</link>
            <guid>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%8018238ZOAC-2</guid>
            <pubDate>Sat, 24 Jul 2021 10:25:04 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p>2019년 12월, 두 번째로 개최된 ZOAC의 오프닝을 맡은 성우는 누구보다 화려하게 ZOAC를 알리려 한다.</p>
<p>작년 ZOAC의 방식은 너무 식상하다고 생각한 성우는 문자열을 보여주는 새로운 규칙을 고안해냈다!</p>
<p>규칙은 이러하다.</p>
<p>그림과 같은 원판에 문자들이 순서대로 적혀있다. 처음 순간에 화살표는 &#39;A&#39;를 가리키고 있다.
원판은 왼쪽 또는 오른쪽으로 돌릴 수 있다. 원판을 한 칸 돌리는 데에는 1의 시간이 소요된다.
화살표가 가리키고 있는 문자를 출력할 수 있다. 문자를 출력하는 데에 걸리는 시간은 없다.
시간이 너무 오래 걸리면 지루해할 ZOAC의 참가자들을 위해 성우는 해당 문자열을 앞에서부터 차례대로 최대한 빠르게 출력하려고 한다.</p>
<p>바쁜 성우를 위하여 해당 문자열을 출력하는 데 걸리는 시간의 최솟값을 구해보자.</p>
<h3 id="입력">입력</h3>
<p>첫 번째 줄에 알파벳 대문자로 구성된 문자열이 주어진다. 문자열의 길이는 최대 100자이다. 빈 문자열은 주어지지 않는다.</p>
<h3 id="출력">출력</h3>
<p>입력으로 주어진 문자열을 출력하는 데에 걸리는 시간의 최솟값을 출력한다.</p>
<h3 id="span-stylecolorff1493제출-코드span"><span style="color:#FF1493">제출 코드</span></h3>
<pre><code>data = list(input())

start=&#39;A&#39;
time=0

for i in data:
    left=ord(i) - ord(start)
    right = ord(start) - ord(i)

    if left&lt;0:
        left+=26
    elif right &lt;0:
        right+=26

    time+=min(left,right)
    start=i

print(time)
</code></pre><h3 id="span-stylecolorslateblue풀이과정span"><span style="color:slateblue">풀이과정</span></h3>
<p>왼쪽으로 도는 경우와 오른쪽으로 도는 경우 중 더 짧은 쪽을 선택하면 된다.
값이 음수인 경우만 주의하면 되고 아스키 코드 변환 함수인 ord()를 사용해 쉽게 풀 수 있었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준11399_ATM]]></title>
            <link>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%8011399ATM</link>
            <guid>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%8011399ATM</guid>
            <pubDate>Sat, 24 Jul 2021 10:12:20 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p>인하은행에는 ATM이 1대밖에 없다. 지금 이 ATM앞에 N명의 사람들이 줄을 서있다. 사람은 1번부터 N번까지 번호가 매겨져 있으며, i번 사람이 돈을 인출하는데 걸리는 시간은 Pi분이다.</p>
<p>사람들이 줄을 서는 순서에 따라서, 돈을 인출하는데 필요한 시간의 합이 달라지게 된다. 예를 들어, 총 5명이 있고, P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우를 생각해보자. [1, 2, 3, 4, 5] 순서로 줄을 선다면, 1번 사람은 3분만에 돈을 뽑을 수 있다. 2번 사람은 1번 사람이 돈을 뽑을 때 까지 기다려야 하기 때문에, 3+1 = 4분이 걸리게 된다. 3번 사람은 1번, 2번 사람이 돈을 뽑을 때까지 기다려야 하기 때문에, 총 3+1+4 = 8분이 필요하게 된다. 4번 사람은 3+1+4+3 = 11분, 5번 사람은 3+1+4+3+2 = 13분이 걸리게 된다. 이 경우에 각 사람이 돈을 인출하는데 필요한 시간의 합은 3+4+8+11+13 = 39분이 된다.</p>
<p>줄을 [2, 5, 1, 4, 3] 순서로 줄을 서면, 2번 사람은 1분만에, 5번 사람은 1+2 = 3분, 1번 사람은 1+2+3 = 6분, 4번 사람은 1+2+3+3 = 9분, 3번 사람은 1+2+3+3+4 = 13분이 걸리게 된다. 각 사람이 돈을 인출하는데 필요한 시간의 합은 1+3+6+9+13 = 32분이다. 이 방법보다 더 필요한 시간의 합을 최소로 만들 수는 없다.</p>
<p>줄을 서 있는 사람의 수 N과 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어졌을 때, 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 구하는 프로그램을 작성하시오.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)</p>
<h3 id="출력">출력</h3>
<p>첫째 줄에 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력한다.</p>
<h3 id="span-stylecolorff1493제출-코드span"><span style="color:#FF1493">제출 코드</span></h3>
<pre><code>N=int(input())

data=list(map(int,input().split()))

data.sort()

result=0
sum=0

for i in range(N):
    result=result+data[i]
    sum+=result
print(sum)
</code></pre><h3 id="span-stylecolorslateblue풀이과정span"><span style="color:slateblue">풀이과정</span></h3>
<p>기다리는 시간을 줄이기 위해 시간이 적게 걸리는 사람 순으로 정렬한다.
result는 i번째 사람이 걸리는 시간을 계산한 것이고 이를 모두 더하면 원하는 결과가 나온다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준2217_로프]]></title>
            <link>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%802217%EB%A1%9C%ED%94%84</link>
            <guid>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%802217%EB%A1%9C%ED%94%84</guid>
            <pubDate>Sat, 24 Jul 2021 09:51:17 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p>N(1 ≤ N ≤ 100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다.</p>
<p>하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.</p>
<p>각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에 정수 N이 주어진다. 다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다. 이 값은 10,000을 넘지 않는 자연수이다.</p>
<h3 id="출력">출력</h3>
<p>첫째 줄에 답을 출력한다.</p>
<h3 id="span-stylecolorff1493제출-코드span"><span style="color:#FF1493">제출 코드</span></h3>
<pre><code>N=int(input())
rope=[]
result=[]

for i in range(N):
    rope.append(int(input()))
rope.sort(reverse=True)

for i in range(N):
    result.append(rope[i]*(i+1))

print(max(result))
</code></pre><h3 id="span-stylecolorslateblue풀이과정span"><span style="color:slateblue">풀이과정</span></h3>
<p><strong>k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.</strong> 이 문장이 이 문제의 핵심이다.
내가 생각한 건 로프 개수별로 (가장 작은 무게를 들 수 있는 로프가 들 수 있는 질량 x 병렬 연결한 로프의 개수)를 구하고 비교해 나가는 것이다.
즉, [10,15]가 있다고 하면, 이것을 내림차순으로 정리하고 로프의 개수를 곱해주는 것이다.( [15x1, 10x2]) </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준2839_설탕 배달]]></title>
            <link>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%802839%EC%84%A4%ED%83%95-%EB%B0%B0%EB%8B%AC</link>
            <guid>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%802839%EC%84%A4%ED%83%95-%EB%B0%B0%EB%8B%AC</guid>
            <pubDate>Fri, 23 Jul 2021 14:54:20 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p>상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.</p>
<p>상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.</p>
<p>상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)</p>
<h3 id="출력">출력</h3>
<p>상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.</p>
<h3 id="span-stylecolor228b22제출-코드span"><span style="color:#228B22">제출 코드</span></h3>
<pre><code>N = int(input())

result = 0
while N &gt;= 0 :
    if N % 5 == 0 : 
        result += (N // 5)  
        print(result)
        break
    N -= 3  
    result += 1 
else :
    print(-1)</code></pre><h3 id="span-stylecolorslateblue풀이과정span"><span style="color:slateblue">풀이과정</span></h3>
<p>가장 적은 수의 봉지를 사용하려면 5킬로그램으로 된 봉지를 많이 써야한다는 것이 포인트이다!
5의 배수가 될 때까지 3킬로그램으로 된 봉지를 사용하는 방식으로 코드를 작성했고, 나누어 떨어지지 않을 때에는 -1을 출력하게 했다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준10162_전자레인지]]></title>
            <link>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%8010162%EC%A0%84%EC%9E%90%EB%A0%88%EC%9D%B8%EC%A7%80</link>
            <guid>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%8010162%EC%A0%84%EC%9E%90%EB%A0%88%EC%9D%B8%EC%A7%80</guid>
            <pubDate>Fri, 23 Jul 2021 14:45:25 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p>3개의 시간조절용 버튼 A B C가 달린 전자레인지가 있다. 각 버튼마다 일정한 시간이 지정되어 있어 해당 버튼을 한번 누를 때마다 그 시간이 동작시간에 더해진다. 버튼 A, B, C에 지정된 시간은 각각 5분, 1분, 10초이다.</p>
<p>냉동음식마다 전자레인지로 요리해야할 시간 T가 초단위로 표시되어 있다. 우리는 A, B, C 3개의 버튼을 적절히 눌러서 그 시간의 합이 정확히 T초가 되도록 해야 한다. 단 버튼 A, B, C를 누른 횟수의 합은 항상 최소가 되어야 한다. 이것을 최소버튼 조작이라고 한다.</p>
<p>만일 요리시간이 100초라고 하면(T=100) B를 1번, C는 4번 누르면 된다. 이와 다르게 C를 10번 눌러도 100초가 되지만 이 경우 10번은 최소 횟수가 아니기 때문이 답이 될 수 없다. 이 경우 B 1번, C 4번, 총 5번이 최소버튼 조작이다. 그리고 T=234와 같이 3개의 버튼으로 시간을 정확히 맞출 수 없는 경우도 있다.</p>
<p>여러분은 주어진 요리시간 T초를 맞추기 위한 최소버튼 조작 방법을 구하는 프로그램을 작성해야 한다.</p>
<h3 id="입력">입력</h3>
<p>첫 번째 줄에는 요리시간 T(초)가 정수로 주어져 있으며 그 범위는 1 ≤ T ≤ 10,000 이다.</p>
<h3 id="출력">출력</h3>
<p>여러분은 T초를 위한 최소버튼 조작의 A B C 횟수를 첫 줄에 차례대로 출력해야 한다. 각각의 횟수 사이에는 빈 칸을 둔다. 해당 버튼을 누르지 않는 경우에는 숫자 0을 출력해야한다. 만일 제시된 3개의 버튼으로 T초를 맞출 수 없으면 음수 -1을 첫 줄에 출력해야 한다.</p>
<h3 id="span-stylecolor228b22제출-코드span"><span style="color:#228B22">제출 코드</span></h3>
<pre><code>T = int(input())

if T % 10 != 0:
    print(-1)
else:
    A = B = C = 0
    A = T // 300
    B = (T % 300) // 60
    C = (T % 300) % 60 // 10
    print(A, B, C)</code></pre><h3 id="span-stylecolorslateblue풀이과정span"><span style="color:slateblue">풀이과정</span></h3>
<p>이 문제는 단순한 수학 문제이다!
A, B, C 모두 10의 배수이기 때문에 10으로 나누어 떨어지지 않으면 -1 출력.
그렇지 않으면 큰 수부터 나눈 몫을 저장해 출력하면 된다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준1946_신입사원]]></title>
            <link>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%801946%EC%8B%A0%EC%9E%85%EC%82%AC%EC%9B%90</link>
            <guid>https://velog.io/@go_blin/%EB%B0%B1%EC%A4%801946%EC%8B%A0%EC%9E%85%EC%82%AC%EC%9B%90</guid>
            <pubDate>Fri, 23 Jul 2021 14:30:25 GMT</pubDate>
            <description><![CDATA[<h3 id="문제">문제</h3>
<p>언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는 기업의 이념에 따라 그들은 최고의 인재들만을 사원으로 선발하고 싶어 한다.</p>
<p>그래서 진영 주식회사는, 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙을 세웠다. 즉, 어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다.</p>
<p>이러한 조건을 만족시키면서, 진영 주식회사가 이번 신규 사원 채용에서 선발할 수 있는 신입사원의 최대 인원수를 구하는 프로그램을 작성하시오.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성적, 면접 성적의 순위가 공백을 사이에 두고 한 줄에 주어진다. 두 성적 순위는 모두 1위부터 N위까지 동석차 없이 결정된다고 가정한다.</p>
<h3 id="출력">출력</h3>
<p>각 테스트 케이스에 대해서 진영 주식회사가 선발할 수 있는 신입사원의 최대 인원수를 한 줄에 하나씩 출력한다.</p>
<h3 id="span-stylecolor228b22제출-코드span"><span style="color:#228B22">제출 코드</span></h3>
<pre><code>import sys

T = int(input()) 

for i in range(0,T):
    Cnt = 1
    people = []

    N = int(input())
    for i in range(N):
        doc, Interview = map(int,sys.stdin.readline().split())
        people.append([doc, Interview])

    people.sort() 
    Max = people[0][1]

    for i in range(1,N):
        if Max &gt; people[i][1]:
            Cnt += 1
            Max = people[i][1]

    print(Cnt)</code></pre><h3 id="span-stylecolorslateblue풀이과정span"><span style="color:slateblue">풀이과정</span></h3>
<ol>
<li><p>일단 서류심사 성적을 기준으로 오름차순 정렬을 한다. (서류심사 성적이 더 높은 경우는 면접시험 성적 고려 X)</p>
</li>
<li><p>지원자 i가 선발되기 위해서는 자신보다 서류심사 성적이 좋은 사람보다 면접심사 성적이 좋아야 한다. 비교 대상으로 서류심사 성적이 1위인 사람을 두고, 차례로 면접심사 성적을 비교하다가 i의 면접심사 성적이 높다면 카운트를 증가시키고 비교 대상을 현재 값으로 바꿔준다.</p>
</li>
</ol>
<p>+input()을 사용했다가 시간초과가 떠서  sys.stdin.readline()을 이용해 해결했다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[영속 계층의 CRUD 구현]]></title>
            <link>https://velog.io/@go_blin/%EC%98%81%EC%86%8D-%EA%B3%84%EC%B8%B5%EC%9D%98-CRUD-%EA%B5%AC%ED%98%84</link>
            <guid>https://velog.io/@go_blin/%EC%98%81%EC%86%8D-%EA%B3%84%EC%B8%B5%EC%9D%98-CRUD-%EA%B5%AC%ED%98%84</guid>
            <pubDate>Mon, 05 Jul 2021 10:47:27 GMT</pubDate>
            <description><![CDATA[<p>영속 계층은 데이터에 대한 CRUD(Create, Read, Update, Delete) 작업을 진행한다.
이 글에서는 영속 계층의 CRUD에 대해 다룬다.</p>
<hr>
<p>영속 계층의 작업은 항상 다음과 같은 순서로 진행한다.</p>
<ol>
<li>테이블의 칼럼 구조를 반영하는 VO(Value Object) 클래스의 생성</li>
<li>MyBatis의 Mapper 인터페이스의 작성/XML 처리</li>
<li>작성한 Mapper 인터페이스의 테스트</li>
</ol>
<h4 id="vo-클래스의-작성">VO 클래스의 작성</h4>
<p>VO 클래스를 생성하는 작업은 테이블 설계를 기준으로 작성하면 된다.</p>
<p>프로젝트에 domain 패키지를 생성하고, BoardVO 클래스를 정의한다.</p>
<pre><code>@Data
public class BoardVO {
    private Long bno;
    private String title;
    private String content;
    private String writer;
    private Date regdate;
    private Date updateDate;
}</code></pre><p>BoardVO 클래스는 Lombok을 이용해서 생성자와 getter/setter, toString() 등을 만들어 내는 방식을 사용한다. (이를 위해 @Data 어노테이션 적용)</p>
<h4 id="mapper-인터페이스와-mapper-xml">Mapper 인터페이스와 Mapper XML</h4>
<p><strong>Mapper 인터페이스</strong>를 작성할 때는 리스트와 등록 작업을 우선해서 작성한다. mapper 패키지를 작성하고, BoardMapper 인터페이스를 추가한다.</p>
<pre><code>public interface BoardMapper {
    @Select(&quot;select * from tbl_board where bno &gt; 0&quot;)
    public List&lt;BoardVO&gt; getList();
}</code></pre><p>BoardMapper 인터페이스를 작성할 때는 이미 작성된 BoardVO 클래스를 활용해 필요한 SQL을 어노테이션의 속성값으로 처리할 수 있다.</p>
<p><strong>Mapper XML 파일</strong>
테스트가 완료되면 src/main/resources 내에 XML 파일을 작성한다. XML을 작성할 때는 반드시 &lt;<Mapper>mapper&gt;의 namespace 속성값을 Mapper 인터페이스와 동일한 이름을 준다. select 태그의 id 속성값은 메서드의 이름과 일치하게 작성한다. resultType 속성 값은 select 쿼리의 결과를 특정 클래스의 객체로 만들기 위해 설정한다.</p>
<h4 id="create-처리">create 처리</h4>
<p>  현재 bno를 PK 칼럼으로 이용하고, 자동으로 데이터가 추가될 때 번호가 만들어지는 방식을 사용(시퀀스 이용)한다. 자동으로 PK 값이 정해지는 경우 다음과 같은 2가지 방식으로 처리할 수 있다.</p>
<ul>
<li>insert만 처리되고 생성된 PK 값을 알 필요가 없는 경우</li>
<li>insert문이 실행되고 생성된 PK 값을 알아야 하는 경우(selectKey 이용)</li>
</ul>
<p>selectKey는 번거롭지만 insert 된 번호를 알아올 수가 있다. (insert는 bno의 값을 삽입할 때 nextval을 이용하므로 값을 알 수 없다.)</p>
<h4 id="read-처리">read 처리</h4>
<p>insert가 된 데이터를 조회하는 작업은 PK를 이용해서 처리하므로 BoardMapper의 파라미터 역시 BoardVO 클래스의 bno 타입 정보를 이용해서 처리한다. (primaryKey만 있으면 된다.)</p>
<h4 id="delete-처리">delete 처리</h4>
<p>  데이터를 삭제하는 작업 역시 PK 값을 이용해서 처리하므로 조회하는 작업과 유사하게 처리한다.
  등록, 삭제 수정과 같은 DML 작업은 &#39;몇 건의 데이터가 수정되었는지&#39;를 반환할 수 있다.</p>
<h4 id="update-처리">update 처리</h4>
<p>  제목, 내용, 작성자를 수정한다고 가정하면 파라미터가 여러 개이므로 DTO, VO 타입을 이용하는게 좋다. delete와 마찬가지로, 몇개의 데이터가 수정되었는지 처리할 수 있으므로 int형으로 작성한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스파르타 코딩클럽] 엑셀보다 쉬운 SQL - 1주차]]></title>
            <link>https://velog.io/@go_blin/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EC%BD%94%EB%94%A9%ED%81%B4%EB%9F%BD-%EC%97%91%EC%85%80%EB%B3%B4%EB%8B%A4-%EC%89%AC%EC%9A%B4-SQL-1%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@go_blin/%EC%8A%A4%ED%8C%8C%EB%A5%B4%ED%83%80-%EC%BD%94%EB%94%A9%ED%81%B4%EB%9F%BD-%EC%97%91%EC%85%80%EB%B3%B4%EB%8B%A4-%EC%89%AC%EC%9A%B4-SQL-1%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 20 Jun 2021 06:48:10 GMT</pubDate>
            <description><![CDATA[<p><strong>[수업 목표]</strong></p>
<ol>
<li>데이터베이스(DB)와 SQL이 왜 필요한지 이해한다.</li>
<li>DB에서 데이터를 가져오는 기초적인 문법인 Select와 Where문을 이해한다.</li>
<li>조금 더 복잡한 분석을 위해 자주 사용되는 유용한 문법을 익힌다.</li>
</ol>
<h3 id="1-데이터베이스db와-sql이-왜-필요할까"><strong>1. 데이터베이스(DB)와 SQL이 왜 필요할까?</strong></h3>
<p><strong>데이터베이스</strong>란? 여러 사람들이 같이 사용할 목적으로 데이터를 담는 통이라고 생각하면 됩니다.</p>
<p>원하는대로 데이터를 저장하고 사용하기 위해서는 다양한 기능이 있어야겠죠? 그래서 통상적으로, 모든 데이터베이스는 <strong>CRUD</strong>에 해당하는 기능을 지원해요.</p>
<p>C (Create): 데이터의 생성을 의미합니다
R (Read): 저장된 데이터를 읽어오는 것을 의미해요
U (Update): 저장된 데이터를 변경!
D (Delete): 저장된 데이터를 삭제하는 것을 의미해요</p>
<p><strong>자, 그럼 SQL은 왜 필요할까요?</strong>
데이터를 읽어오는 과정인 <strong>&quot;R (Read)&quot;를 엄청나게 편하게 만들어줍니다.</strong> 그리고, 데이터를 손쉽고 깔끔하게 정리/분석하는 기능도 지원한답니다!</p>
<p><strong>SQL</strong>은 Structured Query Language의 약자인데요, 결국 데이터베이스에 요청 (Query)을 날려서 원하는 데이터를 가져오는 것을 도와주는 언어라는 의미에요!</p>
<h3 id="2-select-쿼리문이란"><strong>2. Select 쿼리문이란?</strong></h3>
<p>쿼리(Query)문이란? 쿼리는 질의를 의미한다. 데이터베이스에 명령을 내리는 것을 의미합니다. </p>
<p>여기서 <strong>Select</strong> 쿼리문은, 데이터베이스에서 &#39;데이터를 선택해서 가져오겠다&#39;는 의미입니다.</p>
<p>Select 쿼리문은 *<em>1) 어떤 테이블에서 2) 어떤 필드의 데이터를 가져올지 *</em>로 구성됩니다.</p>
<h3 id="3-특정-데이터만-가져오고-싶다면-where-">*<em>3. 특정 데이터만 가져오고 싶다면? (Where) *</em></h3>
<p>Where 절은, Select 쿼리문으로 가져올 데이터에 조건을 걸어주는 것을 의미합니다.</p>
<p>select 쿼리문에 where 절을 함께 쓰기 위해서는 <strong>(1) 원하는 테이블과 (2) 조건</strong>, 이 두 가지만 기억하면 됩니다!</p>
<p><strong>[꿀팁🍯] 이렇게 쿼리를 작성하면 편해요!</strong></p>
<p>1) show tables로 어떤 테이블이 있는지 살펴보기 
2) 제일 원하는 정보가 있을 것 같은 테이블에 select * from 테이블명 쿼리 날려보기**
3) <strong>원하는 정보가 없으면 다른 테이블에도 2)를 해보기
4) 테이블을 찾았다! 조건을 걸 필드를 찾기
5) select</strong> *** from 테이블명 where 조건 이렇게 쿼리 완성!</p>
<h3 id="4-where-절과-자주-같이-쓰는-문법-써보기">4. Where 절과 자주 같이 쓰는 문법 써보기</h3>
<p><strong>[&#39;같지 않음&#39; 조건 걸어보기]</strong></p>
<p>&#39;같지 않음&#39; 조건은 != 로 걸 수 있습니다.</p>
<p>잠깐 상식!
&#39;!=&#39; 에서 ! (느낌표)는 부정 (not)을 의미합니다. &#39;=&#39;는 같음을 의미하니, &#39;!=&#39;는 같지 않음이겠죠!</p>
<p><strong>[&#39;범위&#39; 조건 걸어보기]</strong></p>
<p>&#39;범위&#39; 조건은 between 으로 걸 수 있어요.</p>
<pre><code>select * from orders
where created_at between &quot;2020-07-13&quot; and &quot;2020-07-15&quot;;</code></pre><p>이렇게 하면 <strong>7월 13일, 7월 14일</strong> 주문데이터만 나옵니다.</p>
<p><strong>[&#39;포함&#39; 조건 걸어보기]</strong></p>
<p>&#39;포함&#39; 조건은 in 으로 걸 수 있어요.</p>
<pre><code>select * from checkins 
where week in (1, 3);</code></pre><p><strong>[&#39;패턴&#39;(문자열 규칙) 조건 걸어보기]</strong></p>
<p>&#39;패턴&#39; 조건은 like 으로 걸 수 있어요.</p>
<pre><code>select * from users 
where email like &#39;%daum.net&#39;;</code></pre><p><strong>[꿀팁🍯] Like의 다양한 사용법</strong>
Like는 패턴으로 조건을 거는 문법으로, 사용법이 아주 다양하답니다! </p>
<ul>
<li>where email like &#39;a%&#39;: email 필드값이 a로 시작하는 모든 데이터</li>
<li>where email like &#39;%a&#39; email 필드값이 a로 끝나는 모든 데이터</li>
<li>where email like &#39;%co%&#39; email 필드값에 co를 포함하는 모든 데이터</li>
<li>where email like &#39;a%o&#39; email 필드값이 a로 시작하고 o로 끝나는 모든 데이터</li>
</ul>
<p>이외에도 여러 문법이 있는데, 그때그때 필요한 것을 찾아서 쓰면 된다.( 구글링 &#39;how to use like in sql&#39;)</p>
]]></description>
        </item>
    </channel>
</rss>