<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bej_ve.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sat, 05 Nov 2022 14:05:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. bej_ve.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/i_am_developer" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[프로그래머스] 거리두기 확인하기]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B1%B0%EB%A6%AC%EB%91%90%EA%B8%B0-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B1%B0%EB%A6%AC%EB%91%90%EA%B8%B0-%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 05 Nov 2022 14:05:36 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
5개의 대기실을 본 죠르디는 각 대기실에서 응시자들이 거리두기를 잘 기키고 있는지 알고 싶어졌습니다. 자리에 앉아있는 응시자들의 정보와 대기실 구조를 대기실별로 담은 2차원 문자열 배열 places가 매개변수로 주어집니다. 각 대기실별로 거리두기를 지키고 있으면 1을, 한 명이라도 지키지 않고 있으면 0을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.</p>
<ul>
<li>places의 원소는 P,O,X로 이루어진 문자열입니다.</li>
<li>places 원소의 길이(대기실 가로 길이) = 5</li>
<li>P는 응시자가 앉아있는 자리를 의미합니다.</li>
<li>O는 빈 테이블을 의미합니다.</li>
<li>X는 파티션을 의미합니다.</li>
</ul>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">from collections import deque

def bfs(p):
    start=[]

    for i in range(5):
        for j in range(5):
            if p[i][j]==&#39;P&#39;:
                start.append([i,j])
    for s in start:
        queue=deque([s])
        visited=[[0]*5 for i in range(5)]
        distance=[[0]*5 for i in range(5)]
        visited[s[0]][s[1]]=1

        while queue:
            y,x=queue.popleft()
            dx=[-1,1,0,0]
            dy=[0,0,-1,1]

            for i in range(4):
                nx=x+dx[i]
                ny=y+dy[i]

                if 0&lt;=nx&lt;5 and 0&lt;=ny&lt;5 and visited[ny][nx]==0:
                    if p[ny][nx]==&#39;O&#39;:
                        queue.append([ny,nx])
                        visited[ny][nx]=1
                        distance[ny][nx]=distance[y][x]+1

                    if p[ny][nx]==&#39;P&#39; and distance[y][x]&lt;=1:
                        return 0
    return 1

def solution(places):
    answer = []
    for i in places:
        answer.append(bfs(i))

    return answer
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 표 편집]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%91%9C-%ED%8E%B8%EC%A7%91</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%91%9C-%ED%8E%B8%EC%A7%91</guid>
            <pubDate>Sat, 05 Nov 2022 09:44:51 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
처음 표의 행 개수를 나타내는 정수 n, 처음에 선택된 행의 위치를 나타내는 정수 k, 수행한 명령어들이 담긴 문자열 배열 cmd가 매개변수로 주어질 때, 모든 명령어를 수행한 후 표의 상태와 처음 주어진 표의 상태를 비교하여 삭제되지 않은 행은 O, 삭제된 행은 X로 표시하여 문자열 형태로 return 하도록 solution 함수를 완성해주세요.</p>
<ul>
<li>&quot;U X&quot;: 현재 선택된 행에서 X칸 위에 있는 행을 선택합니다.</li>
<li>&quot;D X&quot;: 현재 선택된 행에서 X칸 아래에 있는 행을 선택합니다.</li>
<li>&quot;C&quot; : 현재 선택된 행을 삭제한 후, 바로 아래 행을 선택합니다. 단, 삭제된 행이 가장 마지막 행인 경우 바로 윗 행을 선택합니다.</li>
<li>&quot;Z&quot; : 가장 최근에 삭제된 행을 원래대로 복구합니다. 단, 현재 선택된 행은 바뀌지 않습니다.</li>
</ul>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">def solution(n, k, cmd):
    answer = &#39;&#39;

    linkedList={i: [i-1,i+1] for i in range(1, n+1)}
    OX=[&quot;O&quot; for i in range(1,n+1)]
    stack=[]
    k+=1
    print(linkedList)
    for c in cmd:
        if c[0]==&#39;D&#39;:
            for _ in range(int(c[2:])):
                k=linkedList[k][1]
        elif c[0]==&#39;U&#39;:
            for _ in range(int(c[2:])):
                k=linkedList[k][0]
        elif c[0]==&#39;C&#39;:
            prev,next=linkedList[k]
            stack.append([prev,next,k])
            OX[k-1]=&quot;X&quot;

            if next==n+1:
                k=linkedList[k][0]
            else:
                k=linkedList[k][1]

            if prev==0:
                linkedList[next][0]=prev
            elif next==n+1:
                linkedList[prev][1]=next
            else:
                linkedList[prev][1]=next
                linkedList[next][0]=prev
        elif c[0]==&#39;Z&#39;:
            prev,next,now=stack.pop()
            OX[now-1]=&quot;O&quot;

            if prev==0:
                linkedList[next][0]=now
            elif next==n+1:
                linkedList[prev][1]=now
            else:
                linkedList[prev][1]=now
                linkedList[next][0]=now
    return &quot;&quot;.join(OX)
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 모음 사전]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AA%A8%EC%9D%8C-%EC%82%AC%EC%A0%84</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AA%A8%EC%9D%8C-%EC%82%AC%EC%A0%84</guid>
            <pubDate>Thu, 03 Nov 2022 15:18:26 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
사전에 알파벳 모음 &#39;A&#39;, &#39;E&#39;, &#39;I&#39;, &#39;O&#39;, &#39;U&#39;만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 &quot;A&quot;이고, 그다음은 &quot;AA&quot;이며, 마지막 단어는 &quot;UUUUU&quot;입니다.</p>
<p>단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">def solution(word):
    answer = 0
    word_list=[]
    words=&quot;AEIOU&quot;

    def all_word(cnt, w):
        if cnt==5:
            return
        for i in range(len(words)):
            word_list.append(w+words[i])
            all_word(cnt+1,w+words[i])

    all_word(0,&quot;&quot;)
    return word_list.index(word)+1

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 빛의 경로 사이클]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B9%9B%EC%9D%98-%EA%B2%BD%EB%A1%9C-%EC%82%AC%EC%9D%B4%ED%81%B4</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B9%9B%EC%9D%98-%EA%B2%BD%EB%A1%9C-%EC%82%AC%EC%9D%B4%ED%81%B4</guid>
            <pubDate>Thu, 03 Nov 2022 14:51:57 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
각 칸마다 S, L, 또는 R가 써져 있는 격자가 있습니다. 당신은 이 격자에서 빛을 쏘고자 합니다. 이 격자의 각 칸에는 다음과 같은 특이한 성질이 있습니다.</p>
<ul>
<li>빛이 &quot;S&quot;가 써진 칸에 도달한 경우, 직진합니다.</li>
<li>빛이 &quot;L&quot;이 써진 칸에 도달한 경우, 좌회전을 합니다.</li>
<li>빛이 &quot;R&quot;이 써진 칸에 도달한 경우, 우회전을 합니다.</li>
<li>빛이 격자의 끝을 넘어갈 경우, 반대쪽 끝으로 다시 돌아옵니다. 예를 들어, 빛이 1행에서 행이 줄어드는 방향으로 이동할 경우, 같은 열의 반대쪽 끝 행으로 다시 돌아옵니다.</li>
</ul>
<p>당신은 이 격자 내에서 빛이 이동할 수 있는 경로 사이클이 몇 개 있고, 각 사이클의 길이가 얼마인지 알고 싶습니다. 경로 사이클이란, 빛이 이동하는 순환 경로를 의미합니다.</p>
<p>격자의 정보를 나타내는 1차원 문자열 배열 grid가 매개변수로 주어집니다. 주어진 격자를 통해 만들어지는 빛의 경로 사이클의 모든 길이들을 배열에 담아 오름차순으로 정렬하여 return 하도록 solution 함수를 완성해주세요.</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">dx=[1,0,-1,0]
dy=[0,-1,0,1]

def solution(grid):
    global visited,n,m
    n=len(grid)
    m=len(grid[0])
    answer=[]
    visited=[[[False]*4 for _ in range(m)] for _ in range(n)]
    for sx in range(n):
        for sy in range(m):
            for d in range(4):
                if not visited[sx][sy][d]:
                    rst=simul(sx, sy, d, grid)
                    if rst!=0:
                        answer.append(rst)
    answer.sort()
    return answer

def simul(sx, sy, sd, grid):
    global visited
    x,y,d=sx,sy,sd
    cnt=0
    visited[sx][sy][sd]=True
    while True:
        x=(x+dx[d])%n
        y=(y+dy[d])%m
        cnt+=1

        if grid[x][y]==&#39;R&#39;:
            d=(d+1)%4
        elif grid[x][y]==&#39;L&#39;:
            d=(d-1)%4
        if visited[x][y][d]:
            if (x,y,d)==(sx,sy,sd):
                return cnt
            else:
                return 0
        visited[x][y][d]=True

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 전력망을 둘로 나누기]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A0%84%EB%A0%A5%EB%A7%9D%EC%9D%84-%EB%91%98%EB%A1%9C-%EB%82%98%EB%88%84%EA%B8%B0</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A0%84%EB%A0%A5%EB%A7%9D%EC%9D%84-%EB%91%98%EB%A1%9C-%EB%82%98%EB%88%84%EA%B8%B0</guid>
            <pubDate>Tue, 01 Nov 2022 15:58:28 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
n개의 송전탑이 전선을 통해 하나의 트리 형태로 연결되어 있습니다. 당신은 이 전선들 중 하나를 끊어서 현재의 전력망 네트워크를 2개로 분할하려고 합니다. 이때, 두 전력망이 갖게 되는 송전탑의 개수를 최대한 비슷하게 맞추고자 합니다.</p>
<p>송전탑의 개수 n, 그리고 전선 정보 wires가 매개변수로 주어집니다. 전선들 중 하나를 끊어서 송전탑 개수가 가능한 비슷하도록 두 전력망으로 나누었을 때, 두 전력망이 가지고 있는 송전탑 개수의 차이(절대값)를 return 하도록 solution 함수를 완성해주세요.</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">
from collections import deque

def bfs(graph, start, visited):
    queue=deque([start])
    visited[start]=True
    cnt=0
    while queue:
        v=queue.popleft()
        cnt+=1
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i]=True
    return cnt

def solution(n, wires):
    answer = n-2
    for i in range(len(wires)):
        tmps=wires.copy()
        graph=[[]for i in range(n+1)]
        visited=[False]*(n+1)
        tmps.pop(i)
        for wire in tmps:
            x,y=wire
            graph[x].append(y)
            graph[y].append(x)
        for idx,g in enumerate(graph):
            if g!=[]:
                start=idx
                break
        cnts=bfs(graph,start,visited)
        other_cnts=n-cnts
        if abs(cnts-other_cnts)&lt;answer:
            answer=abs(cnts-other_cnts)

    return answer
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 교점에 별 만들기]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B5%90%EC%A0%90%EC%97%90-%EB%B3%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B5%90%EC%A0%90%EC%97%90-%EB%B3%84-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Tue, 01 Nov 2022 14:22:01 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
Ax + By + C = 0으로 표현할 수 있는 n개의 직선이 주어질 때, 이 직선의 교점 중 정수 좌표에 별을 그리려 합니다.
별이 그려진 부분은 <em>, 빈 공간(격자선이 교차하는 지점)은 .으로 표현하면 다음과 같습니다.
&quot;...........&quot;<br>&quot;.....</em>.....&quot;<br>&quot;...........&quot;<br>&quot;...........&quot;<br>&quot;.<em>.......</em>.&quot;<br>&quot;...........&quot;<br>&quot;...........&quot;<br>&quot;...........&quot;<br>&quot;...........&quot;<br>&quot;.<em>.......</em>.&quot;<br>&quot;...........&quot;<br>이때 격자판은 무한히 넓으니 모든 별을 포함하는 최소한의 크기만 나타내면 됩니다.</p>
<p>따라서 정답은</p>
<p>&quot;....<em>....&quot;<br>&quot;.........&quot;<br>&quot;.........&quot;<br>&quot;</em>.......*&quot;<br>&quot;.........&quot;<br>&quot;.........&quot;<br>&quot;.........&quot;<br>&quot;.........&quot;<br>&quot;<em>.......</em>&quot;
입니다.</p>
<p>직선 A, B, C에 대한 정보가 담긴 배열 line이 매개변수로 주어집니다. 이때 모든 별을 포함하는 최소 사각형을 return 하도록 solution 함수를 완성해주세요.</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">from itertools import combinations

def intersection_point(line1, line2):
    a,b,e=line1
    c,d,f=line2
    if a*d==b*c:
        return None
    x=(b*f-e*d)/(a*d-b*c)
    y=(e*c-a*f)/(a*d-b*c)
    if x==int(x) and y==int(y):
        return (int(x),int(y))

def solution(line):
    N=len(line)
    combs=list(combinations(line,2))
    points=set()
    for comb in combs:
        point=intersection_point(comb[0],comb[1])
        if point:
            points.add(point)
    xs=[p[0] for p in points]
    x_min=min(xs)
    x_max=max(xs)

    ys=[p[1] for p in points]
    y_min=min(ys)
    y_max=max(ys)

    answer = [&#39;.&#39;*(x_max-x_min+1)]*(y_max-y_min+1)

    for point in points:
        x,y=point
        answer[y_max-y]=answer[y_max-y][:x-x_min]+&#39;*&#39;+answer[y_max-y][x-x_min+1:]
    return [&#39;&#39;.join(ans) for ans in answer]
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] n^2 배열 자르기]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-n2-%EB%B0%B0%EC%97%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-n2-%EB%B0%B0%EC%97%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0</guid>
            <pubDate>Tue, 01 Nov 2022 08:43:00 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.</p>
<ol>
<li>n행 n열 크기의 비어있는 2차원 배열을 만듭니다.</li>
<li>i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.</li>
<li>1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.</li>
<li>새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.</li>
</ol>
<p>정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">def solution(n, left, right):
    answer = []
    for i in range(left, right+1):
        a=i//n
        b=i%n
        if a&lt;b: a,b=b,a
        answer.append(a+1)
    return answer
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 파괴되지 않은 건물]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8C%8C%EA%B4%B4%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EA%B1%B4%EB%AC%BC</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8C%8C%EA%B4%B4%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EA%B1%B4%EB%AC%BC</guid>
            <pubDate>Sat, 29 Oct 2022 15:14:17 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
건물의 내구도를 나타내는 2차원 정수 배열 board와 적의 공격 혹은 아군의 회복 스킬을 나타내는 2차원 정수 배열 skill이 매개변수로 주어집니다. 적의 공격 혹은 아군의 회복 스킬이 모두 끝난 뒤 파괴되지 않은 건물의 개수를 return하는 solution함수를 완성해 주세요.</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">def solution(board, skill):
    answer=0
    tmp=[[0 for j in range(len(board[0])+1)]for i in range(len(board)+1)]

    for  t, r1, c1, r2, c2, d in skill:
        if t==2:
            d= -d
        tmp[r1][c1]-=d
        tmp[r1][c2+1]+=d
        tmp[r2+1][c1]+=d
        tmp[r2+1][c2+1]-=d

    for i in range(len(tmp)-1):
        for j in range(len(tmp[0])-1):
            tmp[i][j+1]+=tmp[i][j]
    for i in range(len(tmp)-1):
        for j in range(len(tmp[0])-1):
            tmp[i+1][j]+=tmp[i][j]
    for i in range(len(board)):
        for j in range(len(board[0])):
            if board[i][j]+tmp[i][j]&gt;0:
                answer+=1

    return answer</code></pre>
<p>&lt;설명&gt;
단순하게 구현했다가 효율성에서 실패하게 된다.
그래서 누적합을 사용해서 이중포문을 사용하지 않도록 노력했다.
<a href="https://kimjingo.tistory.com/155">링크텍스트</a> 해당 블로그를 보고 풀이를 이해했다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 두 큐 합 같게 만들기]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%91%90-%ED%81%90-%ED%95%A9-%EA%B0%99%EA%B2%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%91%90-%ED%81%90-%ED%95%A9-%EA%B0%99%EA%B2%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Fri, 28 Oct 2022 16:02:43 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
길이가 같은 두 개의 큐가 주어집니다. 하나의 큐를 골라 원소를 추출(pop)하고, 추출된 원소를 다른 큐에 집어넣는(insert) 작업을 통해 각 큐의 원소 합이 같도록 만들려고 합니다. 이때 필요한 작업의 최소 횟수를 구하고자 합니다. 한 번의 pop과 한 번의 insert를 합쳐서 작업을 1회 수행한 것으로 간주합니다.</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">from collections import deque

def solution(queue1, queue2):
    deque1=deque(queue1)
    deque2=deque(queue2)
    sum1=sum(deque1)
    sum2=sum(deque2)

    for i in range(len(deque1)*3):
        if sum1==sum2:
            return i
        if sum1&gt;sum2:
            num=deque1.popleft()
            deque2.append(num)
            sum1-=num
            sum2+=num
        else:
            num=deque2.popleft()
            deque1.append(num)
            sum2-=num
            sum1+=num

    return -1</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 연속 부분 수열 합의 개수]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%97%B0%EC%86%8D-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4-%ED%95%A9%EC%9D%98-%EA%B0%9C%EC%88%98</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%97%B0%EC%86%8D-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4-%ED%95%A9%EC%9D%98-%EA%B0%9C%EC%88%98</guid>
            <pubDate>Thu, 27 Oct 2022 15:06:16 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.</p>
<p>elements      result
[7,9,1,1,4]      18</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">def solution(elements):
    answer = 0
    numberSet=set()

    n=len(elements)
    elements=elements*2
    for i in range(n):
        for j in range(n):
            numberSet.add(sum(elements[j:j+i+1]))

    answer=len(numberSet)
    return answer</code></pre>
<p>&lt;풀이&gt;
set을 사용해서 중복되는 값을 자동으로 제거해준다.
list에서도 sum함수를 사용할 수 있다는 점!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 롤케이크 자르기]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%A1%A4%EC%BC%80%EC%9D%B4%ED%81%AC-%EC%9E%90%EB%A5%B4%EA%B8%B0</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%A1%A4%EC%BC%80%EC%9D%B4%ED%81%AC-%EC%9E%90%EB%A5%B4%EA%B8%B0</guid>
            <pubDate>Thu, 27 Oct 2022 14:40:28 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
롤케이크에 올려진 토핑들의 번호를 저장한 정수 배열 topping이 매개변수로 주어질 때, 롤케이크를 공평하게 자르는 방법의 수를 return 하도록 solution 함수를 완성해주세요.</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">from collections import Counter

def solution(topping):
    dic=Counter(topping)
    set_dic=set()
    answer=0
    for i in topping:
        dic[i]-=1
        set_dic.add(i)
        if dic[i]==0:
            dic.pop(i)
        if len(dic)==len(set_dic):
            answer+=1

    return answer</code></pre>
<p>&lt;풀이&gt;
counter와 dictionary의 개념을 확실히 아는 것이 중요했다.
collections의 Counter를 사용하게 되면 dictionary의 형태로 담기게 된다.
ex) {&#39;1&#39;:2, &#39;2&#39;:3, &#39;3&#39;:4}</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 부대복귀]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B6%80%EB%8C%80%EB%B3%B5%EA%B7%80</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B6%80%EB%8C%80%EB%B3%B5%EA%B7%80</guid>
            <pubDate>Wed, 26 Oct 2022 15:06:42 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
강철부대가 위치한 지역을 포함한 총지역의 수 n, 두 지역을 왕복할 수 있는 길 정보를 담은 2차원 정수 배열 roads, 각 부대원이 위치한 서로 다른 지역들을 나타내는 정수 배열 sources, 강철부대의 지역 destination이 주어졌을 때, 주어진 sources의 원소 순서대로 강철부대로 복귀할 수 있는 최단시간을 담은 배열을 return하는 solution 함수를 완성해주세요. 복귀가 불가능한 경우 해당 부대원의 최단시간은 -1입니다.</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">from collections import deque

def solution(n, roads, sources, destination):
    visit=[-1]*(n+1)
    graph=[[] for _ in range(n+1)]
    for s,e in roads:
        graph[s].append(e)
        graph[e].append(s)

    queue=deque([destination])
    visit[destination]=0
    while queue:
        now=queue.popleft()

        for node in graph[now]:
            if visit[node]==-1:
                visit[node]=visit[now]+1
                queue.append(node)

    return [visit[i] for i in sources]</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스/python] 콜라 문제]]></title>
            <link>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4python-%EC%BD%9C%EB%9D%BC-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@i_am_developer/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4python-%EC%BD%9C%EB%9D%BC-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Wed, 26 Oct 2022 14:31:47 GMT</pubDate>
            <description><![CDATA[<p>&lt;문제&gt;
콜라 빈 병 a개를 가져다주면 콜라 b병을 주는 마트가 있다. 빈 병 n개를 가져다주면 몇 병을 받을 수 있는가?</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">import math

def solution(a, b, n):
    answer = 0
    while(n&gt;=a):
        remain = n % a
        n =math.floor(n / a) * b
        answer += n
        n += remain
    return answer</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준/python/1700] 멀티탭 스케줄링]]></title>
            <link>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python1700-%EB%A9%80%ED%8B%B0%ED%83%AD-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81</link>
            <guid>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python1700-%EB%A9%80%ED%8B%B0%ED%83%AD-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81</guid>
            <pubDate>Wed, 26 Oct 2022 10:16:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/i_am_developer/post/b04253ee-e254-4fd3-a365-fec2cb7e4601/image.png" alt=""></p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">n,k=map(int, input().split())
list=list(map(int, input().split()))
plug=[0]*n

cnt=0
list_idx=0
tmp=0
tmp_i=0

for i in list:
    if i in plug: #멀티탭에 이미 있는 경우
        pass
    elif 0 in plug: #멀티탭에 빈곳이 있는 경우
        plug[plug.index(0)]=i
    else:
        for j in plug:
            if j not in list[list_idx:]: #이후에 없으면
                tmp=j
                break
            elif list[list_idx:].index(j)&gt;tmp_i: #이후에 있을 때, 어느 것이 나중에 나오고 먼저 나오는지 판단 
                tmp=j
                tmp_i=list[list_idx:].index(j)
        plug[plug.index(tmp)]=i
        tmp=tmp_i=0
        cnt+=1
    list_idx+=1

print(cnt)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준/python/1138] 한 줄로 서기]]></title>
            <link>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python1138-%ED%95%9C-%EC%A4%84%EB%A1%9C-%EC%84%9C%EA%B8%B0</link>
            <guid>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python1138-%ED%95%9C-%EC%A4%84%EB%A1%9C-%EC%84%9C%EA%B8%B0</guid>
            <pubDate>Sun, 23 Oct 2022 15:28:59 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/i_am_developer/post/b08439f3-ea5d-42d6-87aa-4f1f29783bbf/image.png" alt=""></p>
<blockquote>
<ul>
<li>그리디 알고리즘
각 단계에서 가장 최선의 선택을 하는 방법
탐욕 알고리즘을 적용시키려면 두가지 조건을 만족해야 한다.
1-앞의 선택이 이후의 선택에 영향을 주지 않아야 한다.
2-문제의 최적해가 부분 문제에 대해서도 최적해여야 한다.</li>
</ul>
</blockquote>
<p>&lt;문제 설명&gt;
사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다. N명의 사람이 있고, 사람들의 키는 1부터 N까지 모두 다르다.</p>
<p>각 사람들이 기억하는 정보가 주어질 때, 줄을 어떻게 서야 하는지 출력하는 프로그램을 작성하시오.</p>
<p>&lt;코드&gt;</p>
<pre><code class="language-python">n=int(input())
list=list(map(int, input().split()))
ans=[0]*n
for j in range(1, n+1):
    t=list[j-1]
    cnt=0
    for i in range(n):
        if cnt==t and ans[i]==0:
            ans[i]=j
            break
        elif ans[i]==0:
            cnt+=1
print(*ans)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준/python/2437] 저울]]></title>
            <link>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python2437-%EC%A0%80%EC%9A%B8</link>
            <guid>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python2437-%EC%A0%80%EC%9A%B8</guid>
            <pubDate>Fri, 27 May 2022 13:46:18 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/i_am_developer/post/ebb3b4c1-40f7-4981-b94f-d52b3acb5ff7/image.png" alt=""></p>
<p>문제링크:<a href="https://www.acmicpc.net/problem/2437">저울</a></p>
<p>이 문제는 코드는 간단하지만 논리를 이해하는데 시간이 오래걸렸습니다. 핵심논리는 현재 가지고 있는 추로 만들 수 있는 무게가 1, 3, 5, 7, 8 이라면 x무게의 추가 추가됐을 때 1+x, 3+x, 5+x, 7+x, 8+x의 무게를 더 만들 수 있다는 것입니다.</p>
<pre><code class="language-python">n=int(input())
list=list(map(int, input().split()))
list.sort()
result=1

for i in list:
    if result&lt;i:
        break
    result+=i

print(result)
</code></pre>
<p>이 문제에서 핵심은 1부터 무게를 만들어 나갈 때 만들 수 없는 최소숫자를 구하는 것입니다.
그래서 result는 1로 시작했습니다.
result는 현재 가지고 있는 추로 만들 수 있는 최대무게+1로 생각하는게 직관적으로 이해할 수 있는 것 같습니다.(+1을 해주는 이유는 마지막에 만들 수 없는 최소무게를 출력하기 위해서)</p>
<p><br>[1 1 2 3 6 7 30]을 예시로,</p>
<p>for문을 시작하기 전에는 추가 없기 때문에 만들 수 있는 최대무게는 0이 되고 result는 1이 됩니다.</p>
<ol>
<li>첫번째 추(1)를 가지게되면 0+1을 만들 수 있기 때문에 result는 2(result+1)가 됩니다.</li>
<li>두번째 추(1)를 가지게되면 0+1, 1+1을 만들 수 있기 때문에 result는 3(result+1)이 됩니다.</li>
<li>세번째 추(2)를 가지게되면 0+1, 1+2, 2+2를 만들 수 있기 때문에 result는 5(result+2)이 됩니다.</li>
<li>네번째 추(3)을 가지게되면 0+3,..., 4+3을 만들 수 있기 때문에 result는 8(result+3)이 됩니다.</li>
<li>다섯번째 추(6)을 가지게되면 0+6,...,7+6을 만들 수 있기 때문에 result는 14(result+6)이 됩니다.</li>
<li>여섯번째 추(7)을 가지게되면 0+7,...13+7을 만들 수 있기 때문에 result는 21(result+7)이 됩니다.</li>
<li>마지막 추(30)을 가지게되면 0+30,...,20+30을 만들 수 있습니다. 이 때, result가 21이었기 때문에 21부터 만들 수 있어야 하는데 마지막추는 30부터 만들 수 있습니다. 그렇기 때문에 21은 만들 수 없는 최소 무게가 됩니다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준/python/1202] 보석도둑]]></title>
            <link>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python1202-%EB%B3%B4%EC%84%9D%EB%8F%84%EB%91%91</link>
            <guid>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python1202-%EB%B3%B4%EC%84%9D%EB%8F%84%EB%91%91</guid>
            <pubDate>Fri, 13 May 2022 14:35:30 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/i_am_developer/post/7aaeee97-dd9f-490e-ab6f-5500aaaf1bc8/image.png" alt=""></p>
<p>문제링크 : <a href="https://www.acmicpc.net/problem/1202">보석도둑</a></p>
<p>최대한 비싼 보석을 훔치는 방법을 찾는 문제이다.
heapq는 자동으로 정렬이 되는 효과가 있기 때문에 정렬이 시간초과가 날 경우 유용하게 사용할 수 있다.</p>
<pre><code class="language-python">import sys
import heapq

input=sys.stdin.readline
n,k=map(int, input().split())
jew=[list(map(int, input().split()))for _ in range(n)]
bag=[int(input())for _ in range(k)]
jew.sort()
bag.sort()

total=0
temp=[]
for b in bag: #bag의 최솟값부터
    while jew and b&gt;=jew[0][0]:
        heapq.heappush(temp, -jew[0][1])
        heapq.heappop(jew)
    if temp:
        total+=heapq.heappop(temp)
    elif not jew:
        break
print(-total)
</code></pre>
<p>heap은 작은 값이 부모노드로 큰 값이 자식노드로 들어간다.
heappop을 사용할 경우 root값이 빠져나온다(가장 작은 값)</p>
<p>정말 좋은 기술인데 왜 항상 떠오르지 않을까!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준/python/1715]카드 정렬하기]]></title>
            <link>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python1715%EC%B9%B4%EB%93%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python1715%EC%B9%B4%EB%93%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 06 May 2022 15:00:14 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/i_am_developer/post/3d36bbb3-a5ee-4943-8bd3-5d4394a1d738/image.png" alt=""></p>
<p>문제링크 : <a href="https://www.acmicpc.net/problem/1715">카드 정렬하기</a></p>
<h3>문제</h3>
이번 문제는 보자마자 작은 수부터 차례대로 합해야 한다는 아이디어가 생각났다.
그런데 단순구현으로 정렬을 사용해서 푸니까 시간초과라는 문제가 생겼다. 고민 끝에 자동으로 우선순위 큐가 완성되는 힙을 사용했다.<br><br>
코딩테스트 문제를 풀 때도 시간초과가 날까봐 걱정되는 문제들이 있는데 heapq를 꼭 기억해야겠다.

<pre><code class="language-python">import heapq

n=int(input())
card=[]
for i in range(n):
    heapq.heappush(card, int(input()))
sum=0
if len(card)==1:
    print(0)
else:
    while len(card)&gt;1:
        result=heapq.heappop(card)+heapq.heappop(card)
        sum+=result
        heapq.heappush(card,result)
    print(sum)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준/python/2812] 크게만들기]]></title>
            <link>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python2812-%ED%81%AC%EA%B2%8C%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python2812-%ED%81%AC%EA%B2%8C%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Fri, 06 May 2022 14:38:06 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/i_am_developer/post/021470b2-df08-4d8c-8ac1-857f0b93f6cc/image.png" alt=""></p>
<p>문제링크 : <a href="https://www.acmicpc.net/problem/2812">크게만들기</a></p>
<h3>문제</h3>
n자리수의 숫자에서 m개의 숫자를 지웠을 때 나올 수 있는 수 중에서 최대값을 구하는 문제이다.
알고리즘을 고민하다가 가장 앞의 수부터 작은 것을 지워야하고, 비교를 해서 뒤의 수가 자신보다 크다면 그 수는 지우는 방식을 생각해냈다.



<pre><code class="language-python">n,m=map(int, input().split())
num=list(map(int, input().strip()))
result=[]
count=0

for i in range(n):
    while count&lt;m and result:
        if result[len(result)-1]&lt;num[i]:
            result.pop()
            count += 1
        else:
            break
    result.append(num[i])

for i in range(n-m):
    print(result[i],end=&quot;&quot;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준/python/1092] 배]]></title>
            <link>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python1092-%EB%B0%B0</link>
            <guid>https://velog.io/@i_am_developer/%EB%B0%B1%EC%A4%80python1092-%EB%B0%B0</guid>
            <pubDate>Thu, 05 May 2022 14:58:39 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/i_am_developer/post/298bb56c-6c72-4d44-b122-495a18d5327d/image.png" alt=""></p>
<p>문제링크 : <a href="https://www.acmicpc.net/problem/1092">배</a></p>
<h3>문제</h3>
이번 문제는 크레인으로 박스들을 옮기는 문제다.
처음에 for문을 여러번 써서 시간초과가 났다. 시간초과를 해결하기 위해 for문으로 모든 박스들을 탐색하지 않고 정렬과 while문을 통해 이동시킬 수 있는 박스를 찾으면 벗어나도록 했다.

<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
count=0
visited=[0 for _ in range(m)]
crane_visited=[0]*n

if max(crane) &lt; max(box):
    print(-1)
else:
    while count&lt;len(box):
        for i in range(n):
            while crane_visited[i]&lt;len(box):
                if not visited[crane_visited[i]] and crane[i]&gt;=box[crane_visited[i]]:
                    visited[crane_visited[i]]=True
                    count+=1
                    crane_visited[i]+=1
                    break
                crane_visited[i]+=1
        time+=1
    print(time)</code></pre>
]]></description>
        </item>
    </channel>
</rss>