<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hyeees2ong__.log</title>
        <link>https://velog.io/</link>
        <description>어..ㅓ 이게 왜 돌아가</description>
        <lastBuildDate>Thu, 04 Aug 2022 17:16:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hyeees2ong__.log</title>
            <url>https://velog.velcdn.com/images/hyeees2ong__/profile/9b716827-7ac3-443d-b57c-b9a57333e8a9/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hyeees2ong__.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hyeees2ong__" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[백준 - 2606 바이러스]]></title>
            <link>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-2606-%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A4</link>
            <guid>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-2606-%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A4</guid>
            <pubDate>Thu, 04 Aug 2022 17:16:22 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/2606">2606 바이러스[실버 3]</a></p>
<p><img src="https://velog.velcdn.com/images/hyeees2ong__/post/eed5b9c4-5325-43b5-b611-fb8a5495b64a/image.png" alt=""></p>
<p>오랜만이라서 싹 다 까묵음...</p>
<p>공부하는김에 DFS와 BFS, 두 방식으로 풀어볼게요</p>
<hr>
<h4 id="bfs">BFS</h4>
<pre><code class="language-python">from collections import  deque
N = int(input())
M = int(input())
graph = list([] for _ in range(N+1))
visitChk = [False] * (N+1)

for _ in range(M) :
    i, j = map(int,input().split())
    graph[i].append(j)
    graph[j].append(i)

def bfs(start) :
    dq = deque([start])
    while dq :
        now = dq.popleft()
        visitChk[now]  = True
        for j in graph[now] :
            if not visitChk[j] :
                dq.append(j)
    count = 0;
    for i in visitChk :
        if i :
            count = count + 1
    print(count-1)
bfs(1)
</code></pre>
<p>BFS에서 중요한 deque !</p>
<pre><code class="language-python">def bfs(start) :
    dq = deque([start])
    while dq :
        now = dq.popleft()
        visitChk[now]  = True
        for j in graph[now] :
            if not visitChk[j] :
                dq.append(j)</code></pre>
<p>이 부분이 BFS를 하는 부분이다 </p>
<hr>
<h3 id="dfs">DFS</h3>
<pre><code class="language-python">N = int(input())
M = int(input())
graph = list([] for _ in range(N+1))
visitChk = [False] * (N+1)

for _ in range(M) :
    i, j = map(int,input().split())
    graph[i].append(j)
    graph[j].append(i)

def dfs(now) :
    visitChk[now] = True
    for j in graph[now] :
        if not visitChk[j] :
            dfs(j)

dfs(1)

count = 0
for i in visitChk:
    if i:
        count = count + 1
print(count - 1)
</code></pre>
<p>DFS는 재귀호출을 이용하여 BFS보다 비교적 간단하게 구현 가능하다 </p>
<pre><code class="language-python">def dfs(now) :
    visitChk[now] = True
    for j in graph[now] :
        if not visitChk[j] :
            dfs(j)
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1525 퍼즐]]></title>
            <link>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-1525-%ED%8D%BC%EC%A6%90</link>
            <guid>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-1525-%ED%8D%BC%EC%A6%90</guid>
            <pubDate>Thu, 28 Jul 2022 13:16:49 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/1525">1525 퍼즐</a>
<img src="https://velog.velcdn.com/images/hyeees2ong__/post/4383fdc5-77b8-491f-9fd7-be00f6e9e7fb/image.png" alt="">
<img src="https://velog.velcdn.com/images/hyeees2ong__/post/c0041e40-c295-4d3f-9fa7-86be107943de/image.png" alt=""></p>
<p>Idea) </p>
<p>0을 움직이는 좌표라 생각해봤다. 그래서 BFS를 이용하려고 했다.</p>
<p>그림을 예로 들면, 0이 이동할 수 있는 방향은 1 , 2, 3 세 방향이다.</p>
<p>움직인다는 것은 움직일 수 있는 방향의 있는 숫자와 자리를 바꾸는 것을 의미한다.</p>
<p>별도의 정답 리스트를 만들어 놓아서, 0이 4방향으로 숫자를 바꾸고(이동하고) 비교함으로써 index에 맞는 숫자가 들어갔는지 확인한다.</p>
<pre><code>for _ in range(4) :
    y좌표 이동
    x좌표 이동
    이동한 좌표와 원래 있던 좌표와 값을 바꾼다.
    if not 방문 and 유효성 and ans[ny][nx] == board[ny][nx]
        d + 1
        방문처리
        q에 추가 (ny,nx,nd)
    else :
        바뀐 값을 다시 원래대로 돌려 놓는다.</code></pre><hr>
<pre><code class="language-python">board = dict()
boardStr = &#39;&#39;
for i in range(3):
    boardStr += &#39;&#39;.join(sys.stdin.readline().split())

dx = (1,0,-1,0)
dy = (0,1,0,-1)

answer = &quot;123456780&quot;

dq = deque()

def validChk(y,x) :
    return 0&lt;=y&lt;3 and 0&lt;=x&lt;3

def bfs(boardStr) :
    dq.append(boardStr)
    board[boardStr] = 0

    while dq :
        tmp = dq.popleft()
        if tmp == answer :
            print(board[tmp])
            return

        zeroIndex = tmp.find(&#39;0&#39;)
        zx = zeroIndex%3
        zy = zeroIndex//3

        for k in range(4) :
            nx = zx + dx[k]
            ny = zy + dy[k]
            nZeroIndex = ny*3+nx
            if validChk(ny,nx) :
                tmpList = list(tmp)
                tmpList[zeroIndex],tmpList[nZeroIndex] = tmpList[nZeroIndex],tmpList[zeroIndex]
                nxtStr = &#39;&#39;.join(tmpList)
                if not board.get(nxtStr):
                    board[nxtStr]  = board[tmp] + 1
                    dq.append(nxtStr)

    print(-1)

bfs(boardStr)</code></pre>
<p>bfs는 방문체크를 확인할 필요가 있는데 이 문제에서는 이것을 dict() 사전 자료형을 이용하여 확인한다.</p>
<p>입력받은 3 x 3 배열을 문자열로 바꾸어서 저장한다.</p>
<pre><code class="language-python">for i in range(3):
    boardStr += &#39;&#39;.join(sys.stdin.readline().split())
</code></pre>
<p>굳이 배열이 아닌 문자열로 저장하는 이유는 탐색을 진행하면서 문제에서 요구하는  &quot;123/456/780&quot; 을 0이 이동할 때 마다 확인해주어야 한다. 이 때 이차원배열을 사용하면 각 index를 하나씩 비교하면서 확인해야 하는데, 이를 문자열로 바꾸어 dict를 활용해서 확인한다면 더 빠르게 확인이 가능하고 제한된 메모리 안에서 해결이 가능하기 때문이다.</p>
<p>때문에 처음 큐에 들어가는 것은 시작좌표가 아닌 처음 board의 모양이다. (문자열)</p>
<p>dict에 문자열 : 횟수 형태로 저장한다. </p>
<p>이 문제를 공부하면서 BFS탐색으로 찾은 결과는 최단거리거나 최소횟수를 보장한다는 것이다.</p>
<p>BFS는 레벨1인 노드에서 레벨2인 노드를 탐색하고 레벨3인 노드를 탐색하는 순서로</p>
<p>탐색을 하기 떄문이다. </p>
<p>결과를 찾은 순간 레벨N이 었다면, N이 최단거리나 최소횟수이다.</p>
<pre><code class="language-python"> zeroIndex = tmp.find(&#39;0&#39;)
        zx = zeroIndex%3
        zy = zeroIndex//3            </code></pre>
<p>큐에서 pop되는 것은 문자열형태이기 떄문에 이를 탐색하기 위해서는 이차원배열의 형태로 바꿔줄 필요가 있다.</p>
<p>먼저 문자열에서 find()를 통해서 0의 index를 찾고 이를 이차원배열의 index로 변경해준다.</p>
<p>012/345/678 를 보면 각 x(행)는 0/1/2인데 3으로 나눈 나머지임을 알 수 있다.
y(열)도 비슷한 개념으로 각y는 012/012/012이다. 이는 index를 3으로 나눈 몫임을 알 수 있다.</p>
<pre><code class="language-python"> nZeroIndex = ny*3+nx     </code></pre>
<p>위에서 1차원의 index를 2차원으로 바꾼 것처럼 2차원의 index를 다시 1차원으로 바꾸어야 한다. 리스트에서 0을 바꾸는 작업을 해주어야 하기 때문이다.</p>
<p>이렇게 바꾼 리스트를 문자열로 바꾸어 큐에 저장한다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 2178 미로 탐색]]></title>
            <link>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-2178-%EB%AF%B8%EB%A1%9C-%ED%83%90%EC%83%89</link>
            <guid>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-2178-%EB%AF%B8%EB%A1%9C-%ED%83%90%EC%83%89</guid>
            <pubDate>Thu, 28 Jul 2022 12:34:19 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/2178">2178 미로 탐색</a></p>
<p><img src="https://velog.velcdn.com/images/hyeees2ong__/post/da5b7016-4268-4f1c-9fe1-45b9e8b3c6df/image.png" alt=""></p>
<p>전형적인 길찾기 문제로 최단거리를 구하는 문제이다. 따라서 BFS를 쓰는 것이 좋다</p>
<p>DFS로도 풀 수 있지만 BFS로 했을 때 정답의 경로가 발견이 되자마자 탐색을 종료하기 떄문에 운이 좋으면 같은 완전탐색인 DFS보다 시간을 더 단축시킬 수 있다.</p>
<hr>
<p>위 문제 처럼 격자 칸이 주어지고 사방으로 움직이면서 길을 찾는 문제들은 자주 출제되는 형태의 문제이다.</p>
<p>이 문제를 공부하면서 중요한 포인트라고 생각되는 것은 아래와 같다.</p>
<blockquote>
</blockquote>
<ol>
<li>dx,dy의 상대좌표를 이용하여 움직이는 좌표 계산하기</li>
<li>N x M 격자 좌표에서 유효성 검사하기 </li>
<li>격자칸을 좌표계로 대입할 때 주의하기<ul>
<li>x 좌표계는 dy , y좌표계는 dx이다 
[0][1] -&gt; (1,0) 
[0][2] -&gt; (2,0)
[1][3] -&gt; (3,1)
[2][3] -&gt; (3,2) </li>
</ul>
</li>
<li>bfs로 탐색하는 것은 좌표의 이동이다 = 위 아래 왼쪽 오른쪽
 -for k in range(4) =&gt; 4가지 방향... 8가지 방향이면 8번 반복</li>
</ol>
<hr>
<p>먼저 격자칸을 리스트에 저장하고 N x M 크기를 가지는 방문 체크 용도의 리스트를 선언하고 False로 초기화한다.</p>
<p>또한 격자칸은 N x M으로 크기가 정해져 있으므로 이 크기를 벗어나면 안된다.</p>
<p>따라서 별도의 격자칸을 벗어나는지 확인해주는 함수를 만들어준다</p>
<pre><code class="language-python">def vaildBoard(y,x) :
    return 0&lt;=y&lt;N and 0&lt;=x&lt;M</code></pre>
<p>좌표의 움직임을 dx,dy를 이용해서 상대좌표로 나타낼 것이다.</p>
<pre><code>dx = (1,0,-1,0) 
dy = (-1,0,1,0)</code></pre><p>BFS를 사용해 문제를 해결할 것이므로 deque(q)를 사용한다.</p>
<p>시작좌표와 최단거리를 구해야하므로 거리(d)를 q에 append하고 시작 좌표를 방문체크한다.</p>
<p>q가 빌 때 까지 반복한다. q에는 현재 (0,0,1)이 저장되어있다.</p>
<p>이 시작 좌표와 거리를 q에서 popleft한다.</p>
<p>해당 좌표가 N,M이면 거리를 출력하면 된다.</p>
<p>아니라면 bfs탐색을 시작한다.</p>
<p>공부했던 bfs는 그래프를 탐색하므로 각 tree[ 노드 번호 ] 였지만 이 문제는 미로의 탐색이다. 사람이 격자칸 미로를 움직인다고 생각하면 이 사람이 미로를 탐색하면서 이동 할 수 있는 방향은 4가지 이다. 따라서 사람이 이동할 수 있는 4가지 방향에 대해서 bfs탐색을 돌린다.</p>
<pre><code class="language-python">for y,x,d in range(4) : #4가지 방향
    ny = y + dy[k] 
    nx = x + dx[k]
    nd = d + 1</code></pre>
<p>ny와nx는 이동한 후에 좌표이다. 움직이는 좌표를 상대좌표를 이용해서 구한다고 했는데, dy,dx 리스트에 들어있는 1,-1을 이용해서 4가지 방향으로 이동한 좌표를 구한다.</p>
<p>좌표가 이동한 후에 방문을 한 좌표인지, 유효한 좌표인지 확인한다. 후에 q에 움직인 좌표 +1한 거리를 q에 넣어주고 방문체크를 해준다.</p>
<p>백준에 제출한 코드 </p>
<pre><code class="language-python">import sys
from collections import deque

dx = (1,0,-1,0)
dy = (0,1,0,-1)

N,M = map(int, sys.stdin.readline().split())

board = [sys.stdin.readline() for _ in range(N)]
visitChk = [[False] *  M for _ in range(N)]
dq = deque()
dq.append((0,0,1))
visitChk[0][0] = True

def endChk(y,x) :
    return 0&lt;=y&lt;N and 0&lt;=x&lt;M

while len(dq)&gt;0 :
    y,x,d = dq.popleft()

    if y == N-1 and x==M-1 :
        print(d)
        break

    for k in range(4) :
        ny = y + dy[k]
        nx = x + dx[k]
        nd = d + 1
        if endChk(ny,nx) and not visitChk[ny][nx] and board[ny][nx] == &quot;1&quot; :
            visitChk[ny][nx] = True
            dq.append((ny,nx,nd))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1260 DFS와 BFS]]></title>
            <link>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80-BFS</link>
            <guid>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-1260-DFS%EC%99%80-BFS</guid>
            <pubDate>Wed, 27 Jul 2022 16:53:09 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/1260">1260 DFS와 BFS</a>
<img src="https://velog.velcdn.com/images/hyeees2ong__/post/0b9b87ab-0847-4bd6-a886-7f2421ba2379/image.png" alt=""></p>
<p>DFS와 BFS를 공부하기 좋은 문제인것 같다.</p>
<p>알고리즘을 공부하면서 DFS와 BFS가 무엇인지는 알았지만 정작, 파이썬으로 구현할줄은 몰랐다. </p>
<p>그래서 이 문제를 통해 DFS와 BFS에 대해 정확히 알아가고 싶다.</p>
<p>먼저 DFS는 깊이우선탐색으로 아래 그림 처럼 연결된 하위 노드가 있으면 우선적으로 하위 노드들을 탐색한다.
<img src="https://velog.velcdn.com/images/hyeees2ong__/post/eda53b8c-5a32-4ae0-965d-d35bba7d8a46/image.png" style="width:100%"></p>
<p>반면에, BFS는 너비우선탐색으로 같은 레벨의 노드를 우선적으로 탐색한다.
<img src="https://velog.velcdn.com/images/hyeees2ong__/post/ec8094dd-cc29-4eaa-8559-3e6a69b55932/image.png" style="width:100%;"/></p>
<p>DFS와 BFS를 구현하기에 앞서, 탐색할 트리는 보통 리스트로 구현한다.</p>
<pre><code class="language-python">tree = [[False] * N for _ in range(M)]</code></pre>
<p>tree[N]의 리스트가 M개 존재하는 것이다. 그래서 노드 1번과 연결된 노드는 tree[1]에 저장돼있다.</p>
<p>DFS와BFS 문제를 해결하기에 앞서 먼저 입력된 트리를 리스트에 저장하고 연결된 노드를 표시해야한다. 위에서는 False로 했지만, 1이나 0 .. 등 여러가지로 표현하는 방법이 있다. </p>
<hr>
<h3 id="bfs">BFS</h3>
<p>보통 queue를 통하여 구현한다. BFS를 구현한 함수를 bfs라 하고 매개변수로 시작노드를 받는다고 하자.</p>
<p>bfs(시작노드) &lt;시작노드 : 보통 1번 노드&gt;</p>
<p>전달받은 시작노드를 queue(이하 q)에 저장한다.</p>
<blockquote>
<p>현재 q 상태는 q = [1]이다</p>
</blockquote>
<p>시작 노드를 방문처리한다.</p>
<blockquote>
<p>별도의 방문처리를 담당하는 1차원 리스트를 선언하고 False로 처리하며, 방문한 노드의 index를 True로 변경함으로써 방문한 노드를 구별한다.</p>
</blockquote>
<p>이제 q에 들어 있는 노드를 popleft(이하 pop)한다. 이하 과정부터는 q가 비워진 상태일까지 한다.</p>
<pre><code>이하 과정은 모두 while q : 에 속해 q가 비워질 때 까지 반복문이 돌아간다.</code></pre><blockquote>
<p>pop하면서 원하는 작업을 실행하면 된다. 이 문제에서는 pop한 노드의 번호를 출력하면 된다.</p>
</blockquote>
<blockquote>
<p>현재 q 상태는 q = [1]이다</p>
</blockquote>
<p>아까 만들어 놓은 트리를 이용하여 bfs를 실시하면 된다 -&gt; tree [ q에서 pop된 노드 번호 ]를 이용하여 for 반복문을 돌린다.</p>
<p>이미 tree에는 노드의 연결 상태가 모두 저장되어있기 때문에 방문처리가 가능하다.</p>
<p>그림을 예로 들면 이미 tree[1]에는 [2,3]의 노드 번호가 저장되어있다.</p>
<p>tree[1]에서 반복문을 돌면서 방문 하지 않은 노드라면 q에 추가하고 방문 처리를 해준다.</p>
<p>대략적으로, </p>
<pre><code>for tree[ q에서 pop된 노드 번호 ] :
    if 방문 안함 :
        q에 append
        해당 노드 방문처리</code></pre><p>이런 과정을 겪는다.</p>
<blockquote>
<p>1번 노드가 pop되고 bfs를 한 번 돌린 q의 상태는 q = [ 2, 3 ] 이다.
현재 방문 처리된 노드는 1, 2, 3번 노드이다.</p>
</blockquote>
<p>아직 q에는 값이 들어 있으므로 다시 q에서 pop(popleft)부터 시작하는 과정이 반복된다. q에 저장된 1번 노드와 연결된 노드의 하위 노드들을 bfs하는 것이다.</p>
<p>2번 노드가 pop되고 tree[2]에서 반복문을 돌린다.</p>
<p><strong>! 여기서 방문처리 하는 이유가 나온다. 2번 노드는 1번 노드와도 연결되어 있으므로 현재 tree[2]에 1번 노드가 저장되어 있기 때문에 1번 노드에 대하여 방문처리를 하지않으면 또 다시 1번노드가 q에 append되고 무한루프에 빠지게된다. !</strong></p>
<p>1번 노드는 방문 처리됐으므로 q에 append하지 않는다. 2번과 연결된 4번과 5번 노드는 방문하지 않은 노드이므로 q에 append하고 방문처리한다.</p>
<blockquote>
<p>q의 현재 상태는 = [ 3, 4, 5 ]이며,
방문처리된 노드는 1, 2, 3, 4, 5번 노드이다.</p>
</blockquote>
<p>이후 과정을 계속 반복한다. q가 FIFO (First In First Out) 구조이므로 같은 레벨의 노드가 먼저 pop되고 하위 레벨의 노드는 나중에 pop되기 때문에 bfs, 너비우선탐색이 가능하다.</p>
<hr>
<h3 id="dfs">DFS</h3>
<p>재귀함수를 통하여 구현가능하다. DFS를 구현한 함수를 dfs라하고 매개변수로 시작노드를 받는다고 하자.</p>
<p>dfs(시작노드) &lt;시작노드 : 보통 1번 노드&gt;</p>
<p>전달받은 시작노드를 방문 처리한다. 그리고 BFS와 마찬가지로 tree[ 노드 번호 ]에서 for반복문을 돌린다. 방문 하지 않은 노드라면 방문처리하고 dfs[ 해당 노드 ]를 호출한다.</p>
<pre><code class="language-python">dfs(1) -&gt; tree[1] = { 2, 3 }
    dfs(2) -&gt; tree[2] = { 4 , 5 }
        dfs(4) -&gt; tree[4] ={ x } 
        dfs(5) -&gt; tree[5] = { 6 }
            dfs(6) -&gt; tree[6] = { 3 }
                dfs(3) -&gt; tree[3] = { 7 , 8 }
                    dfs(7) -&gt; tree[7] = { x } 
                    dfs(8) -&gt; tree[8] = { x } 
</code></pre>
<p>위 과정이 그림에 해당하는 dfs호출 순서이며 곧, dfs의 탐색순서이다.</p>
<hr>
<p>완성된 코드는 여기서 보면 된다.
<a href="https://velog.io/@hamfan524/%EB%B0%B1%EC%A4%80-1260%EB%B2%88-Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC">완성된 코드</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1021 회전하는 큐]]></title>
            <link>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-1021-%ED%9A%8C%EC%A0%84%ED%95%98%EB%8A%94-%ED%81%90</link>
            <guid>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-1021-%ED%9A%8C%EC%A0%84%ED%95%98%EB%8A%94-%ED%81%90</guid>
            <pubDate>Tue, 26 Jul 2022 16:50:36 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hyeees2ong__/post/c8e57b6d-7284-448f-8e85-3e70a08467ed/image.png" alt=""></p>
<p>deque의 메소드 중 하나인 .rotata()를 이용하면 된다.</p>
<p>1번 연산은 첫번째 요소를 pop하므로 popleft연산이므로 일반 queue가 아닌 deque를 사용해야 한다.
2번 연산은 왼쪽으로 한 칸 씩 이동 즉, 왼쪽으로 회전하므로 rotate(음수) 또한
3번 연산은 오른쪽으로 한 칸 씩 이동 즉, 오른쪽 회전하므로 rotate(양수)이다.</p>
<p><img src="https://velog.velcdn.com/images/hyeees2ong__/post/99a8ec99-74eb-474d-9b2e-0c146895ffb0/image.png" alt=""></p>
<pre><code>2 9 5 &lt;- 각 K를 의미한다.
2를 popleft하기 위해서는 두 가지 방법이 있다.
왼쪽으로 1번 rotate 시켜야한다  = rotate(-(2-1)) 
오른쪽으로 9번 rotate 시켜야한다 = roata(10-(2-1))

2,3번 연산의 최소 횟수 이므로 최소한의 회전을 찾아야 하므로 min을 이용한다.


해당 요소를 popleft한 후에는 deque의 길이가 9로 줄어든다.

또한 2를 popleft하기 위해서 회전이 일어났으므로 deque의 상태는 처음 상태와는 다르다. 왼쪽으로 한번 회전하고 2를 popleft했으므로 deque의 처음 원소는 3번째 원소이다(편의상 3이라고 함) 

3에서 부터 9를 popleft하기 위해서는 두 가지 방법이 있다.
왼쪽으로 6번 rotate 시켜야한다  = rotate(-(9-3))
오른쪽으로 3번 rotate 시켜야한다 = roata(9-(9-3))

즉 , K번째 요소를 얻기 위해서 K-deque[0](오른쪽 회전), K-(K-deque[0])(왼쪽 회전) 중 더 작은 값을 가진 방향으로 회전하면 된다.
K값이 더 작으면 음수로 무조건 양수보다 작기 때문에 절대값으로 비교한다~~~~
=&gt;rotate(min( abs(K-deque[0]),abs(K-(K-deque[0])) ) )

9를 popleft했으므로 dequeue의 길이는 8이다. 이 때 첫번째 요소는 10이다.

10에서 부터 5를 popleft하기 위해서는 두 가지 방법이 있다.
왼쪽으로 5번 rotate 시켜야한다  = rotate(-(5-10))
오른쪽으로 3번 rotate 시켜야한다 = roata(8-(5-10)) ==&gt; ??</code></pre><p>라고 생각했는데 막상 해보니까 아니다...</p>
<p>이 문제의 idea는 ...  </p>
<p>왼쪽, 오른쪽 회전 중 더 작은 값을 찾는 것이다.</p>
<p>이 값을 찾기 위해서는 빼내려는 요소의 index값을 알아야 한다. 이때 deque.index()를 이용해서 해당 요소의 index값을 알 수 있다.</p>
<p>즉 deque.index(2 , 5 , 9)를 통해서 현재 index를 얻어와 deque[0]에서 가까운 쪽으로 회전하는 것이다.</p>
<p>index()를 통해서 얻어온 요소의 index값을 K라 하자. </p>
<p>K는 첫번째 요소로 부터 떨어진 거리이다. 거꾸로 생각하면 deque의 끝에서 부터의 거리도 구할 수 있다. len(deque) - K이다.</p>
<p>즉 첫번째 요소로 부터 더 가까우면 왼쪽으로 회전, 끝에서 부터 더 가까우면 오른쪽 회전하면 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 17608 막대기]]></title>
            <link>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-17608</link>
            <guid>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-17608</guid>
            <pubDate>Tue, 26 Jul 2022 15:19:18 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hyeees2ong__/post/32ff208a-4f79-4096-9e57-8ce7c74014dc/image.png" alt=""></p>
<p>이 문제는 스택으로도 풀 수 있고 덱으로도 풀 수 있는 문제이다.</p>
<p>나는 덱으로 풀었다.</p>
<p>이유는 덱으로 스택을 구현할 수 있기 때문에 굳이 스택을 사용안했고 덱을 공부하고 있기 때문에 덱을 사용하였다.</p>
<p>문제에 나온 것 처럼 막대기를 오른쪽 방향에서 봤을 때 막대기가 몇 개 보이는지 구하는 문제이다.</p>
<p>예를 들어  6 6 9 7 6 4 6 을 오른쪽에서 본다면 제일 앞에 나와있는 6길이의 막대기보다 작은 길이의 막대기는 보이지 않는다. 따라서 6보다 큰 7과 9길이의 막대기만 보인다.</p>
<p>나는 deque에 막대길의 길이를 다 넣고 가장 긴 길이의 막대기와 비교하면서 answer값을 1씩 증가시켰다.</p>
<p>최장길이 : 6 -&gt; <del>4</del> -&gt; <del>6</del> -&gt; 7 -&gt; 9 -&gt; <del>6</del> -&gt; <del>6</del>
answer : 1 -&gt; 1 -&gt; 1 -&gt; 2 -&gt; 3 -&gt; 3 -&gt; 3</p>
<p>-&gt; <strong>이 문제의 포인트는 최장길이를 업데이트 해주어야한다.</strong></p>
<p>5 5 4 3 2 1을 보자 deque에서 가장 먼저 pop된 1은 현재 가장 최장길이이다.</p>
<p>하지만 pop을 한 번 더 하면 최장길이는 2로 바뀌어야 한다. (이 때 answer값을 1증가시킨다)</p>
<p>최장길이 : 1 -&gt; 2 -&gt; 3 -&gt; 4 -&gt; 5
answer : 1 -&gt; 2 -&gt; 3 -&gt; 4 -&gt; 5</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 2346 풍선 터뜨리기]]></title>
            <link>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-2346</link>
            <guid>https://velog.io/@hyeees2ong__/%EB%B0%B1%EC%A4%80-2346</guid>
            <pubDate>Tue, 26 Jul 2022 15:07:53 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/2346">백준문제 바로가기</a></p>
<p><img src="https://velog.velcdn.com/images/hyeees2ong__/post/68a3d28c-aa68-4af7-a0ac-fe6c43689fd1/image.png" alt=""></p>
<p>[Idea]</p>
<p>먼저, 출력이 풍선 안에 숫자가 아닌 Index의 번호가 나와야 하기 때문에 입력받은 숫자와 함께 Index를 함께 저장해주었다.</p>
<p>예를 들면,  예제 입력에 3 2 1 -3 1을 (3,1) (2,2) (1,3) (-3,4) (-1,5) 처럼 저장하는 것이다.</p>
<p>그리고 pop을 하면 먼저 첫번째 요소가 양수인지 음수인지 판별을 해준다.</p>
<p>만약 양수라면 pop을 하고 음수라면 popleft를 한다</p>
<p>먼저 첫번째 풍선을 pop하면 (3,1)이 나오고 3은 양수이므로 (3,1)을 제외하고 pop을 풍선안에 적혀있는 숫자(k) 만큼 pop을 하면서 k-1만큼 append해준다</p>
<p>이러면 (3,1) // (2,2) (1,3) (-3,4) (-1,5) 에서 (-3,4) (-1,5) (2,2) (1,3) 처럼 
k-1만큼 append하고 마지막(k번째) 으로 pop을 하면 (-3,4)가 나온다.</p>
<p>(-3,4)를 보며 -3이므로 음수이다. 이때는 3과 다르게 pop이 아닌  popleft를 한다.</p>
<p>현재 (-3,4)는 pop이 되어 나갔고 (-1,5) (2,2) (1,3)이 현재 deque의 상태이다.</p>
<p>앞서 말했던 바와 같이, -3의 절댓값이 3(k)만큼 popleft를 하고 2(k-1)만큼 append가 아닌 appnedleft를 해준다. </p>
<p>위 과정을 거치면 (-1,5) (2,2) (1,3) 이 (1,3) (2,2) (-1,5)에서 마지막(k)에서 popleft를 하면 (-1,5)가 나온다. </p>
<p>마지막으로 (2,2) (1,3)에서 -1의 절댓값인 1만큼 popleft를 하면 (1,3)이 나오고 마지막으로 남은 (2,2)를 pop하면 된다 .</p>
<p>각 풍선을 pop할 때마다, 두번째 요소인 index를 ans배열에 저장한다.</p>
<p>일단은 요로코롬 생각해보았다.</p>
<p>근데 이 방법보다는 </p>
<p><img src="https://velog.velcdn.com/images/hyeees2ong__/post/a34c571a-1e4f-4770-b001-f0056627360a/image.png" alt=""></p>
<p>[출처] <a href="https://excelsior-cjh.tistory.com/96">https://excelsior-cjh.tistory.com/96</a></p>
<p>deque에 있는 rotate메소드를 쓰면 된다.</p>
<p>하..</p>
<p>rotate를 이용하여 문제를 해결한 방법</p>
<p>[출처] <a href="https://computer-science-student.tistory.com/582">https://computer-science-student.tistory.com/582</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘]]></title>
            <link>https://velog.io/@hyeees2ong__/goToAlgorithm</link>
            <guid>https://velog.io/@hyeees2ong__/goToAlgorithm</guid>
            <pubDate>Mon, 25 Jul 2022 06:25:49 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>알고리즘</p>
</blockquote>
<p> 해당 알고리즘을 클릭하시면 알고리즘 시리즈로 이동합니다. ! </p>
<ul>
  <li>배열 / 연결리스트</li></br>
  <li><a href="https://velog.io/@hyeees2ong__/stack">
  스택</a></li></br>
  <li><a href="https://velog.io/@hyeees2ong__/queue-deque-heapq">
  queue / deque / heapq</a></li></br>
  <li>map / set</li></br>
  <li>브루트 포스 : 완전탐색</li></br>
  <li>순열 / 조합</li></br>
  <li>그리디 알고리즘</li></br>
  <li>DFS / BFS </li></br>
  <li>백트랙킹</li></br>
  <li>선형탐색 / 이분탐색</li></br>
  <li>매개변수 탐색 : 파라메트릭 서치</li></br>
  <li>DP  - 동적계획법</li></br>
</ul>]]></description>
        </item>
        <item>
            <title><![CDATA[문자열]]></title>
            <link>https://velog.io/@hyeees2ong__/%EB%AC%B8%EC%9E%90%EC%97%B4</link>
            <guid>https://velog.io/@hyeees2ong__/%EB%AC%B8%EC%9E%90%EC%97%B4</guid>
            <pubDate>Thu, 14 Jul 2022 14:21:52 GMT</pubDate>
            <description><![CDATA[<h2 id="문자열">문자열</h2>
<blockquote>
<p>문자열은 변경 불가능한 자료형이다 !</p>
</blockquote>
<pre><code> 1  2  3  4  5  6
 s  t  r  i  n  g
-6 -5 -4 -3 -2 -1</code></pre><p>문자열을 앞에서 셀 때는 index가 0부터 시작하며, 뒤에서 셀 때는 index가 -1부터 시작한다.</p>
<pre><code class="language-python">str = &quot;good&quot;
for goodChar in str :
    print(goodChar,end=&quot;,&quot;)</code></pre>
<pre><code>&gt; g,o,o,d</code></pre><pre><code class="language-python">str=&quot;good&quot;
for goodChar in range(len(str)) :  # 문자열의 길이만큼 반복
    print(goodChar,end=&quot;,&quot;)</code></pre>
<pre><code>&gt; g,o,o,d</code></pre><h2 id="슬라이싱">슬라이싱</h2>
<pre><code>[시작 : 끝 : 증감값]</code></pre><p>(시작 값) 부터 (끝 값 - 1)의 index에 해당하는 문자만을 가져온다</p>
<pre><code class="language-python">str=&quot;good&quot;
print(str[1:3])</code></pre>
<pre><code>&gt; oo</code></pre><h2 id="문자열-관련-함수">문자열 관련 함수</h2>
<pre><code class="language-python">str = &quot;press is fun&quot;</code></pre>
<pre><code class="language-python">print(len(str)) #문자열의 길이 12 

print(str.find(&#39;s&#39;)) #s의 처음 위치 3

print(str.rfind(&#39;s&#39;)) #s의 마지막 위치 7 = 뒤에서 부터 찾기

print(str.index(&#39;i&#39;)) #i의 처음 index

print(str.count(&#39;s&#39;)) #s의 개수 3

print(&quot;push&quot; in str) #False : str에 push가 있는지 

print(&quot;push&quot; not in str) #True : str에 push가 없는지 
</code></pre>
<ul>
<li>분리, 결합,대체</li>
</ul>
<pre><code class="language-python">print(str.strip()) # pressisfun 양 쪽 공백 제거 

print(str.split()) # [&#39;press&#39;, &#39;is&#39;, &#39;fun&#39;] split()의 인수로 문자열을 분리

print(&quot; &quot;.join()) # press is fun 문자열 중간에 &quot;~&quot;이 삽입됨 

print(str.replace(&quot;press&quot;,&quot;push&quot;)) # push is fun press를 push로 replace</code></pre>
<ul>
<li>포맷팅</li>
</ul>
<pre><code class="language-python">print(str + &quot;and good &quot; + str(333)) # press is fun and good 333 &#39;+&#39;로 문자열들을 연결
</code></pre>
<table>
    <tr>
      <th>표식</th>
      <th>설명</th> 
    </tr>
    <tr>
      <th>%d</th>
      <th>정수</th> 
    </tr>
    <tr>
      <th>%f</th>
      <th>실수</th> 
    </tr>
  <tr>
      <th>%s</th>
      <th>문자열</th> 
    </tr>
  <tr>
      <th>%c</th>
      <th>문자 하나</th> 
    </tr>
  <tr>
      <th>%h/%H</th>
      <th>16진수</th> 
    </tr>
  <tr>
      <th>%o/%O</th>
      <th>8진수</th> 
    </tr>
  <tr>
      <th>%%</th>
      <th>%문자</th> 
    </tr>
</table>

<pre><code class="language-python">print(&quot;%d월 %d일 %s&quot; %(month,day,str)) #month월은 day일 str</code></pre>
<pre><code class="language-python">print(&quot;.2f&quot;,0.3333333) #0.33 소수점 이하 2자리</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[반복문]]></title>
            <link>https://velog.io/@hyeees2ong__/%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@hyeees2ong__/%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Thu, 14 Jul 2022 13:43:53 GMT</pubDate>
            <description><![CDATA[<h2 id="for">for</h2>
<pre><code>for 변수 in 반복가능한 컬렉션 : 
    반복할 명령</code></pre><ul>
<li>range(시작, 끝, 증가값)
시작값 default : 0
증가값 default : 1</li>
</ul>
<pre><code class="language-python">for i in range(1,10) : #10번반복 </code></pre>
<pre><code class="language-python">for i in range(10) : #10번반복 
# for in in range(0,10,1)</code></pre>
<ul>
<li>변수 생략 가능<pre><code class="language-python">for _ in range(10) : #10번반복 
  변수와 상관없이 반복되는 명령문이 실행</code></pre>
<h2 id="while">while</h2>
<pre><code>while True : 
  반복할 명령
  if 탈출 조건 : break</code></pre></li>
</ul>
<p>무한루프 사용 시, 탈출조건을 꼭 명시해주어야 한다.</p>
<pre><code class="language-python">for i in range(1,10) : #10번반복 </code></pre>
<pre><code class="language-python">for i in range(10) : #10번반복 
# for in in range(0,10,1)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[연산자와 형변환]]></title>
            <link>https://velog.io/@hyeees2ong__/%EC%97%B0%EC%82%B0%EC%9E%90%EC%99%80-%ED%98%95%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@hyeees2ong__/%EC%97%B0%EC%82%B0%EC%9E%90%EC%99%80-%ED%98%95%EB%B3%80%ED%99%98</guid>
            <pubDate>Wed, 13 Jul 2022 16:18:44 GMT</pubDate>
            <description><![CDATA[<h2 id="연산자">연산자</h2>
<p>+, -, *, / 이 4가지 연산자,  기본적인 사칙 연산자 외에도</p>
<p>고급 산술 연산자가 있다.</p>
<p>** : 거듭제곱</p>
<p>// : 정수 나누기 </p>
<p>% : 나머지 연산자  ---&gt; 짝수와 홀수를 판별할 때 많이 사용</p>
<pre><code class="language-python">print(11**2) ## 11 x 11 

print(125//4) ## 125 / 4 의 몫 부분

print(125%4) ## 125 / 4 의 나머지 부분</code></pre>
<pre><code>121
31
1</code></pre><hr>
<pre><code class="language-python">i=3
if i%2 == 0 :
    print(&quot;짝수입니다&quot;)
elif i%2 == 1 :
    print(&quot;홀수입니다&quot;)</code></pre>
<pre><code>홀수입니다</code></pre><h4 id="2로-나누었을-때--나머지가-0이면-짝수이고-1이면-홀수임을-이용한다">2로 나누었을 때,  나머지가 0이면 짝수이고 1이면 홀수임을 이용한다.</h4>
<hr>
<h2 id="형변환">형변환</h2>
<ul>
<li><h3 id="문자열-연산">문자열 연산</h3>
</li>
</ul>
<p>앞서 소개했던 기본적인 연산자 중 +,* 를 수학적 연산 뿐만이 아닌 문자열에도 사용할 수 있다.</p>
<pre><code class="language-python">str1 = &quot;벤치 증량에는&quot;
str2 = &quot; 해머컬 !&quot;
print(str1 + str2)</code></pre>
<pre><code>벤치 증량에는 해머컬 !</code></pre><p>+로 문자열끼리 이어주기 위해서는 피연산자가 문자열이어야한다. </p>
<pre><code class="language-python">str1 = &quot;해머컬좋아 &quot;
print(str1 * 3)</code></pre>
<pre><code>해머컬좋아 해머컬좋아 해머컬좋아 </code></pre><p>*로 문자열을 반복해주기 위해서는 연산자의 좌측은 문자열, 우측은 정수형이어야한다. </p>
<hr>
<ul>
<li><h3 id="str과-int">str()과 int()</h3>
<h3 id="문자열-변환-str-그리고-정수형-변환-int">문자열 변환 str() 그리고 정수형 변환 int()</h3>
<blockquote>
<p>int()</p>
</blockquote>
</li>
</ul>
<ol>
<li>오직 아라비아 숫자와 부호만이 존재해야한다 !</li>
</ol>
<ul>
<li>int(&quot;333%&quot;) ## 오류 !! % &lt;- 문자</li>
<li>int(&quot;3333.2222&quot;) ## 오류 !! . &lt;- 문자 </li>
</ul>
<ol start="2">
<li>두 번째 인수로 진법을 지정가능하다.</li>
</ol>
<ul>
<li>int(&quot;1a&quot;,16) ## 26</li>
<li>int(&quot;15&quot;,8) ## 13</li>
</ul>
<hr>
<h3 id="str">str()</h3>
<pre><code class="language-python">print(&quot;문자열&quot; + 333)</code></pre>
<p>문자열과 정수형을 + 연산할 수 없다 !!</p>
<pre><code class="language-python">print(&quot;문자열&quot; + str(333)) # 문자열333</code></pre>
<p>이처럼 정수형을 str()을 이용해서 문자열로 변환하고 +연산해야한다. return 문자열</p>
<hr>
<h3 id="int">int()</h3>
<pre><code class="language-python">print(333 + &quot;444&quot;)</code></pre>
<p>마찬가지로 문자열과 정수형을 + 연산할 수 없다 !!</p>
<pre><code class="language-python">print(333 + int(444)) #777</code></pre>
<p>이처럼 문자열을 int()로 정수형으로 변환하고 +연산해야한다. return 정수형</p>
<hr>
<h3 id="실수형-변환-float">실수형 변환 float()</h3>
<pre><code class="language-python">print( 1 + float(&quot;2,3&quot;)) #3.3
print( 1 + float(&quot;23e-1&quot;)) #3.3</code></pre>
<p>이 처럼 x.x 형식처럼 고정소수점 방식이나 xe-y처럼 부동소수점 방식으로 되어있어야 float()를 사용할 수 있다. 따라서 문자열로 되어있는 실수를 정수형으로 사용하기 위해서는 먼저 float()로 형변환 int()로 형변환해 사용하여야 한다.</p>
<pre><code class="language-python">print( 10 + int(float(&quot;22.5&quot;)) # 32
#&quot;22.5&quot; -&gt; 22.5 -&gt; 22</code></pre>
<hr>
<h3 id="실수를-반올림--round">실수를 반올림 , round()</h3>
<pre><code class="language-python">print( round(2.54 , 1)) # 2.5
print( round(123456 , -3)) #123000</code></pre>
<hr>
<h3 id="한꺼번에-같은-값-대입하기">한꺼번에 같은 값 대입하기</h3>
<pre><code class="language-python">a = b = c = 5</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[ord()와 chr()]]></title>
            <link>https://velog.io/@hyeees2ong__/ord%EC%99%80-chr</link>
            <guid>https://velog.io/@hyeees2ong__/ord%EC%99%80-chr</guid>
            <pubDate>Wed, 13 Jul 2022 15:35:08 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-python">##ord() 와 chr()
print(&quot;A의 아스키코드 값 : &quot;, ord(&#39;A&#39;))
print(&quot;아스키코드 65의 문자 값 : &quot;,chr(65))</code></pre>
<p>오늘 코테 보면서 처음 알았던 ord() 와 chr()</p>
<p>ord()는 인수로 받은 문자의 아스키코드 값을 반환한다.
chr()는 인수로 받은 아스키코드 값의 문자를 반환한다.</p>
<pre><code>A의 아스키코드 값 :  65
아스키코드 65의 문자 값 :  A</code></pre><hr>
<pre><code class="language-python">##반복문
for i in range(ord(&quot;a&quot;),ord(&#39;z&#39;)+1) :
    print(chr(i), end=&quot; &quot;)</code></pre>
<p>ord와 chr()을 이용해서 a부터 z를 출력해보았다.</p>
<pre><code>a b c d e f g h i j k l m n o p q r s t u v w x y z </code></pre><hr>
<p>오늘 푼 백준 문제에서 ord()를 활용 가능하다.</p>
<p><a href="https://velog.io/@hyeees2ong__/1935-%ED%9B%84%EC%9C%84-%ED%91%9C%EA%B8%B0%EC%8B%9D-2">백준문제 : 1935</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[입/출력]]></title>
            <link>https://velog.io/@hyeees2ong__/%EC%9E%85%EC%B6%9C%EB%A0%A5-PythonCodingTestStudy</link>
            <guid>https://velog.io/@hyeees2ong__/%EC%9E%85%EC%B6%9C%EB%A0%A5-PythonCodingTestStudy</guid>
            <pubDate>Wed, 13 Jul 2022 15:18:07 GMT</pubDate>
            <description><![CDATA[<h1 id="출력">출력</h1>
<pre><code class="language-python">print(&quot;출력내용&quot; , sep= &quot;~&quot; , end = &quot;~&quot;)</code></pre>
<p>sep -&gt; 출력할 요소들의 사이 사이의 들어감 default : 띄어쓰기
end -&gt; 모두 출력하고 난 뒤 들어감 default : 줄바꿈(\n)</p>
<pre><code class="language-python">a=1
b=2
print(&quot;결과 :&quot;,a,b)</code></pre>
<p>때문에 print(a,b)는 print(a,b, sep=&quot; &quot;, end=&quot;\n&quot;) 이다</p>
<pre><code>결과 : 1 2
(커서위치)</code></pre><h2 id="코테에서-자주쓰는-출력문">코테에서 자주쓰는 출력문</h2>
<pre><code class="language-c">print(&quot;&quot;.join(반복가능한 문자열))</code></pre>
<p>배열이나 스택 등 반복가능한 문자열을 출력할 때 사용했다.</p>
<p>보통 print를 통해서 배열이나 스택같은 리스트형을 출력하면 [ &#39;요소1&#39; , &#39;요소2&#39; , ~ ]  이렇게 출력이 되지만 join을 이용하여 출력을 한다면 -&gt; 요소1 요소2 &lt;- 이런 형식으로 출력이 가능하다.</p>
<pre><code class="language-c">print(&quot;\n&quot; or &quot; &quot; or &quot; , &quot; .join(반복가능한 문자열))</code></pre>
<p>위와 같이 여러 방식으로 응용 가능하다.</p>
<h1 id="입력">입력</h1>
<p>파이썬에서 입력은 간단하게 받을 수 있다</p>
<pre><code class="language-python">input()</code></pre>
<p>input을 통해서 사용자로부터 입력을 받을 수 있다. input()은 사용자의 입력을 문자열로 리턴한다.</p>
<p>따라서 사용자가 숫자를 입력했다면 int()나 계산하고 싶은 형으로 형변환 해주어야 한다.</p>
<pre><code class="language-python">user_num_int = int(input())
uesr_num_float = float(input())</code></pre>
<h2 id="코테-입력문">코테 입력문</h2>
<p>코딩 테스트에서는 시간이 제한되어있으므로 한 줄 씩 입력받는 형태에서는 input()보다 다른 입력 방식을 선호한다.</p>
<pre><code class="language-python">import sys

user_input = sys.stdline.readline()
</code></pre>
<p>readline()은 input()과 다르게 사용자가 입력을 다하고 입력하는 엔터키(줄바꿈문자)까지 문자열로 인식하고 리턴하기 때문에 이 줄바꿈문자를 제거해주어야 한다</p>
<pre><code class="language-python">import sys

user_input = sys.stdline.readline().strip()
</code></pre>
<p>또한, 한번에 여러 개의 입력을 받고 싶을 때는 map을 사용하면 된다.</p>
<pre><code class="language-python">a, b = map(int,sys.stdline.readline().split())</code></pre>
<p>입력된 각 값들이 int로 형변화하여 공백을 기준으로 a,b에 들어가게 된다.</p>
<blockquote>
<p>추후 공부하면서 알게된게 있다면 추가하겠습니다</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 1935 : 후위 표기식 2]]></title>
            <link>https://velog.io/@hyeees2ong__/1935-%ED%9B%84%EC%9C%84-%ED%91%9C%EA%B8%B0%EC%8B%9D-2</link>
            <guid>https://velog.io/@hyeees2ong__/1935-%ED%9B%84%EC%9C%84-%ED%91%9C%EA%B8%B0%EC%8B%9D-2</guid>
            <pubDate>Wed, 13 Jul 2022 11:31:05 GMT</pubDate>
            <description><![CDATA[<p>후위표기식은 피연산자 뒤에 연사자를 적는 것이다.</p>
<p>1-2학년 때인가 자료구조 수업시간에 배웠던 기억이 난다.</p>
<p>보자마자 이 문제는 스택을 사용해야겠다고 생각했다. Vv</p>
<p><a href="https://www.acmicpc.net/problem/1935">백준 문제 바로가기</a></p>
<pre><code class="language-c">import sys

k = int(input())
exp = input()
expLen = len(exp)
num = []
exp_stk = []
i, j = 0,0
for _ in range(k) :
    a =int(sys.stdin.readline().strip())
    if(a&lt;100) :
        num.append(a)
if k&gt;=1 and k&lt;=26 and expLen &lt;100:
    for i in range(expLen) :
        if &#39;A&#39; &lt;= exp[i] &lt;= &#39;Z&#39; :
            exp_stk.append(num[ord(exp[i])-ord(&#39;A&#39;)])
            j+=1
            if(j&gt;=k) : j = k-1
        else :
            a = exp_stk.pop()
            b = exp_stk.pop()
            if exp[i] == &#39;+&#39;:
                res = float(b) + float(a)
                exp_stk.append(res)
            elif exp[i] == &#39;-&#39;:
                res = float(b) - float(a)
                exp_stk.append(res)
            elif exp[i] == &#39;*&#39;:
                res = float(b) * float(a)
                exp_stk.append(res)
            elif exp[i] == &#39;/&#39;:
                res = float(b) / float(a)
                exp_stk.append(res)

    print(&quot;{:.2f}&quot;.format(exp_stk.pop()),end=&quot;&quot;)</code></pre>
<p>문제 구현은 앞 키로거보다 쉬웠다.</p>
<p>하지만 틀렸습니다가 계속 떴다...?</p>
<p><img src="https://velog.velcdn.com/images/hyeees2ong__/post/63a8382c-2d53-4d00-80b4-296753964763/image.png" alt=""></p>
<p>어이가없네...</p>
<p>틀린 코드는 </p>
<pre><code class="language-c">  if &#39;A&#39; &lt;= exp[i] &lt;= &#39;Z&#39; :
            exp_stk.append(num[ord(exp[i])-ord(&#39;A&#39;)])</code></pre>
<p>피연산자를 만났을 때 스택에 append하는 부분이었다,</p>
<p>나는 이 부분을 </p>
<pre><code class="language-c"> if exp[i] &gt;= &quot;A&quot; and exp[i] &lt;=&quot;Z&quot; :
               exp_stk.append(num[j])
            j+=1
            if(j&gt;=k) : j = k-1</code></pre>
<p>피연자와 상관없이 강제로 잡았다. 즉 
A나 B,C와 상관없이 피연산자의 순서대로 입력받은 수가 저장된 배열의 인덱스를 옮겼다.</p>
<p>하지만 이 문제가 원하는 것은 피연사자에 따라서 인덱스가 자동으로 결정되는 것이었다.</p>
<p>충격 쓰발</p>
<pre><code>ord() -&gt; 입력받은 문자를 아스키코드로 바꿔주는 함수이다.</code></pre><p>즉, 피연산자의 아스키코드값을 인덱스로 변환해주는 것인데, 이를 위해서는 0부터 시작하는 배열 인덱스 특성상 A(65) - A(65)를 해주어야 0부터 시작할 수 있다,</p>
<p>따라서 A(65)를 빼주어야 원활하게 피연사자에 따라서 입력받은 수가 저장된 배열의 인덱스를 결정할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 - 5397 : 키로거]]></title>
            <link>https://velog.io/@hyeees2ong__/5397-%ED%82%A4%EB%A1%9C%EA%B1%B0</link>
            <guid>https://velog.io/@hyeees2ong__/5397-%ED%82%A4%EB%A1%9C%EA%B1%B0</guid>
            <pubDate>Wed, 13 Jul 2022 01:23:06 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-c"># KeyLoger
import sys
ans2 = []
a=int(input())
for _ in range(a):
    ans = []
    left_ans = []
    pw = sys.stdin.readline().strip()
    length = len(pw)
    if(length &gt; 0) :
        for i in range(length):
            if (pw[i] == &#39;&lt;&#39;):
                if ans :
                    left_ans.append(ans.pop())
            elif (pw[i] == &quot;&gt;&quot;):
                if left_ans :
                    ans.append(left_ans.pop())
            elif (pw[i]==&quot;-&quot;):
                if ans :
                    ans.pop();
            else :
                ans.append(pw[i])
    if left_ans :
        while True :
            if not left_ans : break
            ans.append(left_ans.pop())
    print(&#39;&#39;.join(ans))
</code></pre>
<p><a href="https://www.acmicpc.net/problem/5397">백준 5397번 바로가기</a></p>
<p>처음에는 배열로 접근하여 문제를 해결하고자 하였다.</p>
<p><img src="https://velog.velcdn.com/images/hyeees2ong__/post/3765595d-25f0-4812-bf23-c3d4def6157d/image.png" alt=""></p>
<p><del>이거말고도 두 페이지 더 있음</del></p>
<p>하지만 시간초과&lt;- 욘 석이 계속 나왔다</p>
<p>이유는 배열로 구현하고자 했을 때, insert와 dle() 할 때 배열의 요소들이 한 자리씩 밀리거나 당겨지거나 할때 시간이 O(1)이 아닌 O(N)으로 들기 때문이다.</p>
<p>따라서 이 문제는 자료구조 중에서 배열이 아닌 다른 자료구조를 사용하여야 했다.</p>
<p>맨 처음에는 스택과 연결리스트를 생각해서 풀려고했지만, 배열로도 충분히 할 수 있을 것 같다는 생각이 들어 배열로 길을 잡고 시작했다.</p>
<p>3-4시간 동안 머<del>가</del>리를 박아보니 느껴지는 점이 있다. </p>
<p>코딩테스트는 &quot;시간&quot;, 즉 결과만이 아닌 효율 또한 중요하게 생각해야할 요소라는 것이다. 이 문제는 배열로도 구현 가능했지만 스택과 연결리스트를 사용해서 문제를 해결하는 것이 더 빠른 시간안에 결과를 도출할 수 있었다.</p>
<p>고작 별 2개짜리에 이렇게 박아대니 큰일났다 증말</p>
<p>또한, 중요한 요소가 &quot;조건&quot; 이다. </p>
<p>스택을 이용하여 구현을 다하고 파이참으로 반례까지 찾아보면서 틀린 것이 없나 찾아보았지만 결과가 모두 잘 나왔다. 하지만 백준에서는 &quot;틀렸습니다&quot;가 계속 나왔다.</p>
<p>내가 조건을 잘못썼나? 생각하고 조건을 다시 보았지만 전혀 감이 잡히는게 없었다.</p>
<p>혹시나 하고 대문자, 소문자, 숫자 (비밀번호에 해당하는 부분)을 스택에 append하는 코드를 유심히 보았다.</p>
<pre><code class="language-c">   if ((pw[i] &lt;= &quot;Z&quot; and pw[i] &gt;= &#39;A&#39;) or 
           (pw[i] &lt;= &#39;z&#39; and pw[i] &gt;= &#39;a&#39;) 
           or (pw[i] &gt;= &quot;1&quot; and pw[i] &lt;=&quot;9&quot;)):
                ans.append(pw[i])</code></pre>
<p>사실 지금도 뭐가 다른지 모르겠다.</p>
<p>입력한 비밀번호는 문자열이니까 숫자도 당연히 문자 취급하는 것이 아닌가??</p>
<p>라고 생각했지만 그냥 한번 else로 빼볼까 하고 돌려보니까 잘됐다...?</p>
<h1 id="조건과-사용할-자료구조-잘-정하기">조건과 사용할 자료구조 잘 정하기</h1>
]]></description>
        </item>
    </channel>
</rss>