<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>donggle_22.log</title>
        <link>https://velog.io/</link>
        <description>기죽지 않는 개발자</description>
        <lastBuildDate>Mon, 14 Nov 2022 07:41:48 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>donggle_22.log</title>
            <url>https://images.velog.io/images/donggle_22/profile/839f84fb-d39d-4178-9c2f-2fa1f6a80677/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. donggle_22.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/donggle_22" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Algorithm/Python][SWEA] 1974번 스도쿠 검증]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPythonSWEA-1974%EB%B2%88-%EC%8A%A4%EB%8F%84%EC%BF%A0-%EA%B2%80%EC%A6%9D</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPythonSWEA-1974%EB%B2%88-%EC%8A%A4%EB%8F%84%EC%BF%A0-%EA%B2%80%EC%A6%9D</guid>
            <pubDate>Mon, 14 Nov 2022 07:41:48 GMT</pubDate>
            <description><![CDATA[<h2 id="swea-1974-스도쿠-검증">[SWEA] 1974. 스도쿠 검증</h2>
<p><a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&amp;problemLevel=2&amp;contestProbId=AV5Psz16AYEDFAUq&amp;categoryId=AV5Psz16AYEDFAUq&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=RECOMMEND_COUNT&amp;selectCodeLang=ALL&amp;select-1=2&amp;pageSize=10&amp;pageIndex=2">https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&amp;problemLevel=2&amp;contestProbId=AV5Psz16AYEDFAUq&amp;categoryId=AV5Psz16AYEDFAUq&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=RECOMMEND_COUNT&amp;selectCodeLang=ALL&amp;select-1=2&amp;pageSize=10&amp;pageIndex=2</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li><p>문법 :
  1) 2차원 배열 선언</p>
<ul>
<li>선언 후 0으로 초기화한 뒤 사용<pre><code class="language-python">puzzle=[[0]*9 for _ in range(9)]
for i in range(9):
    puzzle[i]=list(map(int, input().split()))</code></pre>
</li>
<li>선언과 동시에 사용<pre><code class="language-python">puzzle=[list(map(int, input().split())) for _ in range(9)]</code></pre>
2) 배열의 row에 list 형식으로 넣기<pre><code class="language-python">puzzle[i]=list(map(int, input().split()))</code></pre>
3) set(집합) 선언 + 집합 개수까지 구하기 
  =&gt; 중복되는 수가 있나 없나 검증 가능(9개면 중복되는 수가 없는 것)<pre><code class="language-python">len(set(col)) != 9</code></pre>
</li>
</ul>
</li>
<li><p>예외상황을 발생시킬 수도 있는 경우의 수를 잘 고민해 보아야한다..!</p>
</li>
</ul>
<h3 id="--내-코드">- 내 코드</h3>
<pre><code class="language-python">T = int(input())

for t in range(T):
    puzzle=[[0]*9 for _ in range(9)]
    for i in range(9):
        puzzle[i]=list(map(int, input().split()))
    for i in range(9):
        row = len(set(puzzle[i]))
        if row != 9:
            break
    for i in range(9):
        col = []
        for j in range(9):
            col.append(puzzle[j][i])
        if len(set(col)) != 9:
            break
    for i in range(0,9,3):
        square = []
        for j in range(0,9,3):
            square.append(puzzle[i][j])
            square.append(puzzle[i][j+1])
            square.append(puzzle[i][j+2])
            square.append(puzzle[i+1][j])
            square.append(puzzle[i + 1][j + 1])
            square.append(puzzle[i + 1][j + 2])
            square.append(puzzle[i+2][j])
            square.append(puzzle[i + 2][j + 1])
            square.append(puzzle[i + 2][j + 2])
            if len(set(square)) != 9:
                break
        if len(set(square)) != 9:
            break
    if row != 9 or len(set(col)) != 9 or len(set(square)) != 9:
        print(&quot;#{} {}&quot;.format(t + 1, 0))
    else:
        print(&quot;#{} {}&quot;.format(t + 1, 1))</code></pre>
<h3 id="--더-멋진-코드">- 더 멋진 코드</h3>
<pre><code class="language-python">T = int(input())
for tc in range(1, T+1):
    arr = [list(map(int, input().split())) for _ in range(9)]

    result = 1
    # 가로 세로 검사
    for i in range(9):
        cnt_r = [0] * 10
        cnt_c = [0] * 10
        for j in range(9):
            cnt_r[arr[i][j]] += 1
            cnt_c[arr[j][i]] += 1

        # 중복 체크
        for k in range(1, 10):
            if cnt_r[k] != 1:
                result = 0
                break
            if cnt_c[k] != 1:
                result = 0
                break

    # 3x3 격자 검사
    for i in range(3):
        for j in range(3):
            cnt_x = [0] * 10
            for k in range(3):
                for l in range(3):
                    cnt_x[arr[3*i+k][3*j+l]] += 1

            for k in range(1, 10):
                if cnt_x[k] != 1:
                    result = 0
                    break

    print(&quot;#{} {}&quot;.format(tc, result))</code></pre>
<ul>
<li>참고한 블로그 : <a href="https://jennnn.tistory.com/21">https://jennnn.tistory.com/21</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][SWEA] 2056번 연월일 달력]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPythonSWEA-2056%EB%B2%88-%EC%97%B0%EC%9B%94%EC%9D%BC-%EB%8B%AC%EB%A0%A5</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPythonSWEA-2056%EB%B2%88-%EC%97%B0%EC%9B%94%EC%9D%BC-%EB%8B%AC%EB%A0%A5</guid>
            <pubDate>Sun, 13 Nov 2022 15:54:53 GMT</pubDate>
            <description><![CDATA[<h2 id="swea-2056-연월일-달력">[SWEA] 2056. 연월일 달력</h2>
<p><a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&amp;contestProbId=AV5QLkdKAz4DFAUq&amp;categoryId=AV5QLkdKAz4DFAUq&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=RECOMMEND_COUNT&amp;selectCodeLang=ALL&amp;select-1=1&amp;pageSize=10&amp;pageIndex=1">https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&amp;contestProbId=AV5QLkdKAz4DFAUq&amp;categoryId=AV5QLkdKAz4DFAUq&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=RECOMMEND_COUNT&amp;selectCodeLang=ALL&amp;select-1=1&amp;pageSize=10&amp;pageIndex=1</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>문법 :
  1) 슬라이싱 : 문자열[시작문자인덱스:끝문자인덱스+1]<pre><code class="language-python">month = int(num[4:6])</code></pre>
  2) .zfill() : 문자열.zfill(개수)<pre><code>result=str(year).zfill(4)+&quot;/&quot;+str(month).zfill(2)+&quot;/&quot;+str(day).zfill(2)</code></pre></li>
</ul>
<h3 id="--내-코드">- 내 코드</h3>
<pre><code class="language-python">T=int(input())

for t in range(T):
    result=&quot;&quot;
    num=input()
    year=int(num[0:4])
    month = int(num[4:6])
    day = int(num[6:8])
    if month==1 or month==3 or month==5 or month==7 or month==8 or month==10 or month==12:
        if day&gt;=1 and day&lt;=31:
            result=str(year).zfill(4)+&quot;/&quot;+str(month).zfill(2)+&quot;/&quot;+str(day).zfill(2)
        else:
            result=&quot;-1&quot;
    elif month==4 or month==6 or month==9 or month==11:
        if day&gt;=1 and day&lt;=30:
            result=str(year).zfill(4)+&quot;/&quot;+str(month).zfill(2)+&quot;/&quot;+str(day).zfill(2)
        else:
            result=&quot;-1&quot;
    elif month==2:
        if day&gt;=1 and day&lt;=28:
            result=str(year).zfill(4)+&quot;/&quot;+str(month).zfill(2)+&quot;/&quot;+str(day).zfill(2)
        else:
            result=&quot;-1&quot;
    else:
        result=&quot;-1&quot;
    print(&quot;#{} {}&quot;.format(t+1,result))</code></pre>
<h3 id="--더-멋진-코드">- 더 멋진 코드</h3>
<pre><code class="language-python">t=int(input())

for i in range(t):
    print(&#39;#%s&#39; %(i+1),end=&#39; &#39;)
    date=input()
    year=int(date[:4])
    month=int(date[4:6])
    dd=int(date[6:])
    if month &lt;1 or month&gt;12:
        print(-1)
        continue

    if month in [1,3,5,7,8,10,12]:
        if dd &lt;1 or dd&gt;31:
            print(-1)
            continue
    if month ==2:
        if dd&lt;1 or dd&gt;28:
            print(-1)
            continue

    if month in [4,6,9,11]:
        if dd &lt;1 or dd&gt;30:
            print(-1)
            continue
    print(&quot;%04d/%02d/%02d&quot; %(year,month,dd))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python][문법] index 함수]]></title>
            <link>https://velog.io/@donggle_22/Python%EB%AC%B8%EB%B2%95-index-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@donggle_22/Python%EB%AC%B8%EB%B2%95-index-%ED%95%A8%EC%88%98</guid>
            <pubDate>Wed, 09 Nov 2022 12:48:54 GMT</pubDate>
            <description><![CDATA[<h3 id="--index-함수">- index 함수</h3>
<ul>
<li><p>리스트에서 특정 원소의 인덱스를 찾아주는 함수</p>
</li>
<li><p>문자열에서도 인덱스를 찾을 수 있음</p>
</li>
<li><p>중복된 원소가 있으면 가장 작은 인덱스를 리턴</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/donggle_22/post/276427f0-8b3f-4e29-9895-622b5bfc9cfd/image.png" alt="">
<img src="https://velog.velcdn.com/images/donggle_22/post/217a5ca1-cbe7-4bfd-97d2-3bee1dbdd8d3/image.png" alt="">
<img src="https://velog.velcdn.com/images/donggle_22/post/cf645deb-e925-4ffd-a950-a3380070fa01/image.png" alt=""></p>
<h3 id="--추가로">- 추가로</h3>
<p>스트링 앞에 0 채우는 방법(zfill, rjust)
<a href="https://kkamikoon.tistory.com/entry/Python-%EC%8A%A4%ED%8A%B8%EB%A7%81-%EC%95%9E%EC%97%90-0-%EC%B1%84%EC%9A%B0%EB%8A%94-%EB%B0%A9%EB%B2%95zfill-rjust">https://kkamikoon.tistory.com/entry/Python-%EC%8A%A4%ED%8A%B8%EB%A7%81-%EC%95%9E%EC%97%90-0-%EC%B1%84%EC%9A%B0%EB%8A%94-%EB%B0%A9%EB%B2%95zfill-rjust</a></p>
<p>ps. 코테 풀때마다 자꾸 헷갈려서 정리해보았다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][SWEA] 1954번 달팽이 숫자]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPythonSWEA-1954%EB%B2%88-%EB%8B%AC%ED%8C%BD%EC%9D%B4-%EC%88%AB%EC%9E%90</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPythonSWEA-1954%EB%B2%88-%EB%8B%AC%ED%8C%BD%EC%9D%B4-%EC%88%AB%EC%9E%90</guid>
            <pubDate>Wed, 09 Nov 2022 12:40:28 GMT</pubDate>
            <description><![CDATA[<h2 id="swea-1954-달팽이-숫자">[SWEA] 1954. 달팽이 숫자</h2>
<p><a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&amp;problemLevel=3&amp;contestProbId=AV5PobmqAPoDFAUq&amp;categoryId=AV5PobmqAPoDFAUq&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=RECOMMEND_COUNT&amp;selectCodeLang=ALL&amp;select-1=3&amp;pageSize=10&amp;pageIndex=1">https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&amp;problemLevel=3&amp;contestProbId=AV5PobmqAPoDFAUq&amp;categoryId=AV5PobmqAPoDFAUq&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=RECOMMEND_COUNT&amp;selectCodeLang=ALL&amp;select-1=3&amp;pageSize=10&amp;pageIndex=1</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>얻은 꿀팁 :<ul>
<li>print 할 때, 리스트 앞에 * 를 붙이면 []가 출력되지 않는다</li>
</ul>
</li>
<li>나는 약간 막노동 비슷하게 불었는데 알고리즘 적으로 고민해보면 훨씨 잘짜여진 패턴을 가진 코드를 짤 수 있다. 알고리즘적인 고민을 조금 더 해보고 짜는 습관을 들이자..!</li>
</ul>
<h3 id="--내-코드">- 내 코드</h3>
<pre><code class="language-python">T=int(input())

for t in range(T):
    N=int(input())
    snail=[[0]*N for i in range(1,N+1)]
    length=N
    step=&quot;right&quot;
    number=1
    row=0
    col=0
    while(length!=0):
        if step==&quot;right&quot;:
            for _ in range(length):
                snail[row][col]=number
                number+=1
                col+=1
            length-=1
            step=&quot;down&quot;
            row+=1
            col-=1
        elif step==&quot;down&quot;:
            for _ in range(length):
                snail[row][col]=number
                number+=1
                row+=1
            step=&quot;left&quot;
            row-=1
            col-=1
        elif step==&quot;left&quot;:
            for _ in range(length):
                snail[row][col]=number
                number+=1
                col-=1
            length-=1
            step = &quot;up&quot;
            row-=1
            col+=1
        elif step==&quot;up&quot;:
            for _ in range(length):
                snail[row][col]=number
                number+=1
                row-=1
            step=&quot;right&quot;
            row+=1
            col+=1
    print(&quot;#{}&quot;.format(t+1))
    # for i in range(N):
    #     for j in range(N):
    #         print(str(snail[i][j]), end= &quot; &quot;)
    #     print()
    for i in range(N):
        print(*snail[i])</code></pre>
<h3 id="--더-멋진-코드">- 더 멋진 코드</h3>
<pre><code class="language-python">T = int(input())

# row, col 인덱스로 탐색할 수 있게 방향 설정 (달팽이 방향이니까 우-&gt;하-&gt;좌-&gt;상)
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]

for tc in range(1, T+1):
    N = int(input())
    snail = [[0]*N for _ in range(N)]
    # 초기 위치 &amp; 회전방향 설정
    r, c = 0, 0
    dist = 0  # 0:우, 1:하, 2:좌, 3:상

    for n in range(1, N*N + 1):
        snail[r][c] = n
        r += dr[dist]
        c += dc[dist]

        # 범위를 벗어나거나 0이 아닌 다른 값이 이미 있다면, dist 방향 체인지
        # 근데 이런 경우라면 요소 인덱스를 다시 원위치시켜줘야하므로 빼줘야함
        # 그런다음 dist의 방향을 바꾸고, 방향 바꿨으면 다시 움직일 수 있도록 행렬 인덱스 업데이트
        if r &lt; 0 or c &lt; 0 or r &gt;= N or c &gt;= N or snail[r][c] != 0:
            # 실행취소
            r -= dr[dist]
            c -= dc[dist]
            # dist는 % 4 안해주면 0123, 4567, ... 이런식으로 숫자 커지므로 나머지로 접근
            dist = (dist + 1) % 4
            #  다시 gogo
            r += dr[dist]
            c += dc[dist]

    print(&quot;#{}&quot;.format(tc))
    for row in snail:
        print(*row)
    print()</code></pre>
<ul>
<li>참고한 블로그 : <a href="https://jennnn.tistory.com/3">https://jennnn.tistory.com/3</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python][문법] enumerate() 함수]]></title>
            <link>https://velog.io/@donggle_22/Python%EB%AC%B8%EB%B2%95-enumerate-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@donggle_22/Python%EB%AC%B8%EB%B2%95-enumerate-%ED%95%A8%EC%88%98</guid>
            <pubDate>Mon, 07 Nov 2022 09:47:05 GMT</pubDate>
            <description><![CDATA[<h3 id="--enumerate-함수로-더-깔끔하게-코딩하는-법">- enumerate() 함수로 더 깔끔하게 코딩하는 법</h3>
<ul>
<li><p>enumerate() 사용전</p>
<pre><code class="language-python">&gt;&gt;&gt; letters = [&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]
&gt;&gt;&gt; for i in range(len(letters)):
...     letter = letters[i]
...     print(i, letter)
...
0 A
1 B
2 C</code></pre>
</li>
<li><p>위 작업 enumerate()를 사용하면 더 간편</p>
<pre><code class="language-python">&gt;&gt;&gt; for entry in enumerate([&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]):
...     print(entry)
...
(0, &#39;A&#39;)
(1, &#39;B&#39;)
(2, &#39;C&#39;)</code></pre>
<pre><code class="language-python">&gt;&gt;&gt; for i, letter in enumerate([&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]):
...     print(i, letter)
...
0 A
1 B
2 C</code></pre>
</li>
<li><p>시작 인덱스 변경</p>
<pre><code class="language-python">&gt;&gt;&gt; for i, letter in enumerate([&#39;A&#39;, &#39;B&#39;, &#39;C&#39;], start=1):
...     print(i, letter)
...
1 A
2 B
3 C</code></pre>
</li>
<li><p>2차원 리스트 루프에 더욱 효과를 봄(시각적으로 이해 쉬워짐)</p>
<pre><code class="language-python">&gt;&gt;&gt; matrix = [[&#39;A&#39;, &#39;B&#39;, &#39;C&#39;], [&#39;D&#39;, &#39;E&#39;, &#39;F&#39;], [&#39;G&#39;, &#39;H&#39;, &#39;I&#39;]]</code></pre>
<pre><code class="language-python">&gt;&gt;&gt; for r in range(len(matrix)):
...     for c in range(len(matrix[r])):
...             print(r, c, matrix[r][c])
...
0 0 A
0 1 B
0 2 C
1 0 D
1 1 E
1 2 F
2 0 G
2 1 H
2 2 I</code></pre>
<p>=&gt; enumerate()를 이용해 변경</p>
<pre><code class="language-python">&gt;&gt;&gt; for r, row in enumerate(matrix):
...     for c, letter in enumerate(row):
...             print(r, c, letter)
...
0 0 A
0 1 B
0 2 C
1 0 D
1 1 E
1 2 F
2 0 G
2 1 H
2 2 I</code></pre>
</li>
<li><p>참고한 블로그
<a href="https://www.daleseo.com/python-enumerate/">https://www.daleseo.com/python-enumerate/</a></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][SWEA] 1859번 백만 장자 프로젝트]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPythonSWEA-1859%EB%B2%88-%EB%B0%B1%EB%A7%8C-%EC%9E%A5%EC%9E%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPythonSWEA-1859%EB%B2%88-%EB%B0%B1%EB%A7%8C-%EC%9E%A5%EC%9E%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Sun, 06 Nov 2022 19:47:28 GMT</pubDate>
            <description><![CDATA[<h2 id="swea-1859-백만-장자-프로젝트">[SWEA] 1859. 백만 장자 프로젝트</h2>
<p><a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&amp;contestProbId=AV5LrsUaDxcDFAXc&amp;categoryId=AV5LrsUaDxcDFAXc&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=RECOMMEND_COUNT&amp;selectCodeLang=ALL&amp;select-1=2&amp;pageSize=10&amp;pageIndex=1#;return%20false">https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&amp;contestProbId=AV5LrsUaDxcDFAXc&amp;categoryId=AV5LrsUaDxcDFAXc&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=RECOMMEND_COUNT&amp;selectCodeLang=ALL&amp;select-1=2&amp;pageSize=10&amp;pageIndex=1#;return%20false</a>;</p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>앞에서부터 접근하는 것이 아닌 뒤에서부터 접근이 핵심!</li>
<li>앞에서부터 접근하면 너무 오래걸려서 런타임 에러가 난다..!</li>
<li>앞으로 출력은 아래와 같이 하는 것이 더 보기 좋을 것 같다.<pre><code class="language-python">print(&#39;#{} {}&#39;.format(tc, profit))</code></pre>
</li>
</ul>
<h3 id="--내-코드">- 내 코드</h3>
<pre><code class="language-python">T=int(input())

for t in range(T):
    N=int(input())
    case=list(map(int, input().split()))
    buy=0
    count=0
    profit=0
    now=case[N-1]
    max=0
    for i in range(N-1,0,-1):
        if now&gt;case[i-1]:
            buy+=case[i-1]
            count+=1
            if max&lt;now:
                max=now
        else:
            profit+=(max*count-buy)
            count=0
            buy=0
            now=case[i-1]
    profit += (max * count - buy)
    print(&quot;#&quot;+str(t+1)+&quot; &quot;+str(profit))
</code></pre>
<h3 id="--참고할만한-더-멋진-코드">- 참고할만한 더 멋진 코드</h3>
<pre><code class="language-python"># 테스트 케이스 개수 T 입력
T = int(input())

# T만큼 반복
for tc in range(1, T+1):
    # 자연수 N의 개수 입력
    N = int(input())
    # N 리스트 입력
    N_list = list(map(int, input().split()))

    # N_list의 마지막 값을 최대값으로 설정
    max_value = N_list[-1]
    # 이익 변수 초기화
    profit = 0

    # N-2번째 인덱스부터 0번째 인덱스까지 1씩 감소하면서 반복 순회
    for i in range(N-2, -1, -1):
        # 만약 현재 매매가가 최대값보다 크면 최대값을 변경
        if N_list[i] &gt;= max_value:
            max_value = N_list[i]
        # 현재 매매가가 최대값보다 크지 않으면 차익을 profit 변수에 더해준다
        else:
            profit += max_value - N_list[i]

    # 결과 출력
    print(&#39;#{} {}&#39;.format(tc, profit))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][SWEA] 1926번 간단한 369게임]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPythonSWEA-1926%EB%B2%88-%EA%B0%84%EB%8B%A8%ED%95%9C-369%EA%B2%8C%EC%9E%84</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPythonSWEA-1926%EB%B2%88-%EA%B0%84%EB%8B%A8%ED%95%9C-369%EA%B2%8C%EC%9E%84</guid>
            <pubDate>Fri, 04 Nov 2022 14:36:49 GMT</pubDate>
            <description><![CDATA[<h2 id="swea-1926-간단한-369게임">[SWEA] 1926. 간단한 369게임</h2>
<p><a href="https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&amp;contestProbId=AV5PTeo6AHUDFAUq&amp;categoryId=AV5PTeo6AHUDFAUq&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=RECOMMEND_COUNT&amp;selectCodeLang=ALL&amp;select-1=2&amp;pageSize=10&amp;pageIndex=1">https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&amp;contestProbId=AV5PTeo6AHUDFAUq&amp;categoryId=AV5PTeo6AHUDFAUq&amp;categoryType=CODE&amp;problemTitle=&amp;orderBy=RECOMMEND_COUNT&amp;selectCodeLang=ALL&amp;select-1=2&amp;pageSize=10&amp;pageIndex=1</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>count를 세서 한번에 - 를 붙여주면 더 쉽게 풀 수 있었다!</li>
</ul>
<h3 id="--내-코드">- 내 코드</h3>
<pre><code class="language-python">N = int(input())
result=&quot;&quot;

for i in range(1, N+1):
    num = i
    isClap=0
    while num&gt;10:
        if num % 10 == 3 or num % 10 == 6 or num % 10 == 9:
            result += &quot;-&quot;
            isClap=1
        num //= 10
    if num % 10 == 3 or num % 10 == 6 or num % 10 == 9:
        result += &quot;-&quot;
        isClap=1
    if isClap==0:
        result += str(i)
    result += &quot; &quot;

print(result)
</code></pre>
<h3 id="--더-멋진-코드">- 더 멋진 코드</h3>
<pre><code class="language-python">N = int(input())
clap = [&#39;3&#39;, &#39;6&#39;, &#39;9&#39;]

for i in range(1, N+1):
    count = 0
    for j in str(i):
        if j in clap:
            count += 1
    if count &gt; 0:
        i = &#39;-&#39; * count
    print(i, end=&#39; &#39;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][SWEA] 1204번 최빈수 구하기]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPythonSWExpertAcademy-1204%EB%B2%88-%EC%B5%9C%EB%B9%88%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPythonSWExpertAcademy-1204%EB%B2%88-%EC%B5%9C%EB%B9%88%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 04 Nov 2022 06:03:26 GMT</pubDate>
            <description><![CDATA[<h2 id="swea-1204번-최빈수-구하기">[SWEA] 1204번 최빈수 구하기</h2>
<p><a href="https://swexpertacademy.com/main/code/problem/problemDetail.do">https://swexpertacademy.com/main/code/problem/problemDetail.do</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>순조롭게 해결하였는데 &quot;(단, 최빈수가 여러 개 일 때에는 가장 큰 점수를 출력하라)&quot;가 복병이었다.</li>
<li>해당 요구사항을 만족시키기 위해 앞에서부터 중복되는 배열에 0을 집어 넣어 중복되는 것 중에 가장 큰 인덱스로 이동하였는데 다른 코드를 찾아보니 뒤에서부터 접근하면 더 쉽고 간단하게 된다는 것을 알게 되었다.</li>
<li>조금 더 새로운 아이디어를 찾기 위해 노력하여야 겠다.</li>
</ul>
<h3 id="--내-코드">- 내 코드</h3>
<pre><code class="language-python">T = int(input())

for i in range(T):
    num = int(input())
    case = list(map(int, input().split()))
    frequency = [0 for i in range(101)]
    for j in range(1000):
        frequency[case[j]] += 1
    maxNum = max(frequency)
    maxIndex = frequency.index(max(frequency))
    while True:
        if maxNum in frequency:
            maxIndex = frequency.index(max(frequency))
            frequency[maxIndex] = 0
        else:
            break
    print(&quot;#&quot; + str(num) + &quot; &quot; + str(maxIndex))</code></pre>
<h3 id="--조금-더-괜찮아-보이는-코드">- 조금 더 괜찮아 보이는 코드</h3>
<pre><code class="language-python">#D2 1024 최빈수 구하기
t = int(input())
while t:
    #반복횟수를 감소시킴(반복문으로 처리해도 무방함)
    t -= 1
    #몇번째 케이스인지
    case = int(input())
    grade = list(map(int, input().split()))
    lst = [0]*101
    #각 자리수마다 카운팅한다.
    #숫자 1번이 나오면 1번 인덱스에 +1 이런식으로
    for g in grade:
        lst[g] += 1
    #최대값을 찾는다.
    max_num = max(list)
    #최대값과 같은값을 뒤에서부터 찾는다.
    #앞에서 부터 찾으면 정답이 틀릴 수 있다.
    for i in range(100, -1, -1):
        if max_num == lst[i]:
            print(f&quot;#{case} {i}&quot;)
            break</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][백준] 9012번 괄호]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPython%EB%B0%B1%EC%A4%80-9012%EB%B2%88-%EA%B4%84%ED%98%B8</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPython%EB%B0%B1%EC%A4%80-9012%EB%B2%88-%EA%B4%84%ED%98%B8</guid>
            <pubDate>Mon, 31 Oct 2022 11:10:21 GMT</pubDate>
            <description><![CDATA[<h2 id="boj-9012번-괄호">[BOJ] 9012번 괄호</h2>
<p><a href="https://www.acmicpc.net/problem/9012">https://www.acmicpc.net/problem/9012</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>&quot;)&quot; 가 더 많아지는 테스트 케이스를 조심!</li>
<li>해당 테스트 케이스를 예외사항으로 코드에 추가해 주어야 했다.</li>
</ul>
<h3 id="--내-코드">- 내 코드</h3>
<pre><code class="language-python">N = int(input())

for i in range(N):
    check = input()
    left=0
    right=0
    no=0
    for j in range(len(check)):
        if check[j] == &quot;(&quot;:
            left+=1
        else:
            right+=1
        if left&lt;right:
            no=1
            break
    if no==1:
        print(&quot;NO&quot;)
    elif left == right:
        print(&quot;YES&quot;)
    else:
        print(&quot;NO&quot;)</code></pre>
<h3 id="--더-깔끔한-코드">- 더 깔끔한 코드</h3>
<pre><code class="language-python">a = int(input())
for i in range(a):
    b = input()
    s = list(b)
    sum = 0
    for i in s:
        if i == &#39;(&#39;:
            sum += 1
        elif i == &#39;)&#39;:
            sum -= 1
        if sum &lt; 0:
            print(&#39;NO&#39;)
            break
    if sum &gt; 0:
        print(&#39;NO&#39;)
    elif sum == 0:
        print(&#39;YES&#39;)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][프로그래머스] [1차] 비밀지도]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPython%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-1%EC%B0%A8-%EB%B9%84%EB%B0%80%EC%A7%80%EB%8F%84</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPython%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-1%EC%B0%A8-%EB%B9%84%EB%B0%80%EC%A7%80%EB%8F%84</guid>
            <pubDate>Mon, 31 Oct 2022 10:27:38 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그래머스-1차-비밀지도">[프로그래머스] [1차] 비밀지도</h2>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/17681">https://school.programmers.co.kr/learn/courses/30/lessons/17681</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>bin() 이용해서 10진수 -&gt; 2진수로 변경</li>
<li>하고 ( | ) 로 묶어서 or 로 해서 두개 한번에 결과 가져옴</li>
<li>.zfill() 로 앞에 0을 채워주게 함</li>
</ul>
<h3 id="--처음-코드">- 처음 코드</h3>
<pre><code class="language-python">def solution(n, arr1, arr2):
    result = []
    for i in range(n):
        a = bin(arr1[i])[2:]
        b = bin(arr2[i])[2:]
        if len(a)&lt;n:
            while n-len(a):
                a = &quot;0&quot; + a
        if len(b)&lt;n:
            while n-len(b):
                b = &quot;0&quot; + b
        save = &quot;&quot;
        for j in range(n):
            if a[j] == &quot;1&quot; or b[j] == &quot;1&quot;:
                save += &quot;#&quot;
            else:
                save += &quot; &quot;
        result.append(save)
    return result</code></pre>
<h3 id="--수정한-코드">- 수정한 코드</h3>
<pre><code class="language-python">def solution(n, arr1, arr2):
    result = []
    for i in range(n):
        tmp = bin(arr1[i] | arr2[i])

        tmp = tmp[2:].zfill(n)
        tmp = tmp.replace(&#39;1&#39;, &#39;#&#39;)
        tmp = tmp.replace(&#39;0&#39;, &#39; &#39;)
        result.append(tmp)
    return result</code></pre>
<br>

<h1 id="✔-한-일-점검">✔ 한 일 점검</h1>
<br>

<h1 id="✔-내일-목표">✔ 내일 목표</h1>
<ul>
<li>백준 or 프로그래머스 - 2문제 이상</li>
<li>신용 과제</li>
<li>우코테, 싸피</li>
<li>졸작</li>
</ul>
<br>

<h1 id="✔-주저리">✔ 주저리</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring/개발] - TMI(5)]]></title>
            <link>https://velog.io/@donggle_22/Spring%EA%B0%9C%EB%B0%9C-TMI5-b9cj7m2g</link>
            <guid>https://velog.io/@donggle_22/Spring%EA%B0%9C%EB%B0%9C-TMI5-b9cj7m2g</guid>
            <pubDate>Mon, 19 Sep 2022 09:24:05 GMT</pubDate>
            <description><![CDATA[<h3 id="에러-모음">에러 모음</h3>
<ul>
<li>415 : 포스트맨(클라이언트) 에서 주는 형식이 잘못됨</li>
<li>404 : 지정된 주소를(url) 컨트롤러에서 찾을 수 없음</li>
</ul>
<h3 id="예외처리">예외처리</h3>
<pre><code class="language-java">@PostMapping(&quot;/user&quot;)
    public ResponseEntity&lt;BaseResponseBody&gt; signup (@RequestBody SignupDTO signupDTO){
        BaseResponseBody responseBody = new BaseResponseBody(&quot;회원가입 성공&quot;);
        try {
            userService.signUp(signupDTO);
        } catch (IllegalStateException e){
            responseBody.setResultCode(-1);     //클라이언트 잘못
            responseBody.setResultMsg(e.getMessage());
            return ResponseEntity.ok().body(responseBody);      //에러 코드 400 =&gt; 클라이언트 잘못
        } catch (Exception e){
            responseBody.setResultCode(-2);     //내 코드 잘못
            responseBody.setResultMsg(e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseBody);      //에러 코드 500 =&gt; 서버 잘못
        }
        return ResponseEntity.ok().body(responseBody);
    }</code></pre>
<pre><code class="language-java">@Transactional(readOnly = false)
    public User signUp(SignupDTO signupDTO) {
        User user = new User();
        if (signupDTO.getName().isBlank()) {
            throw new IllegalStateException(&quot;이름이 유효하지 않습니다.&quot;);
        }
        if (signupDTO.getNickname().isBlank()) {
            throw new IllegalStateException(&quot;닉네임이 유효하지 않습니다.&quot;);
        }
        if (!isValidEmailAddress(signupDTO.getEmail())) {
            throw new IllegalStateException(&quot;이메일 형식이 유효하지 않습니다.&quot;);
        }
        if(isDuplicateEmail(signupDTO.getEmail())){
            throw new IllegalStateException(&quot;이메일이 중복됩니다.&quot;);
        }
        if (signupDTO.getJobLevel() &lt; 1 || signupDTO.getJobLevel() &gt; 5) {
            throw new IllegalStateException(&quot;직무 숙련도가 유효하지 않습니다.&quot;);
        }
        if (signupDTO.getJob().isBlank()) {
            throw new IllegalStateException(&quot;직무 이름이 유효하지 않습니다.&quot;);
        }
        if (signupDTO.getUserSkills().isEmpty()) {
            throw new IllegalStateException(&quot;스킬을 입력해주세요&quot;);
        }
        // 유저 정보 저장
        user.setName(signupDTO.getName());
        user.setNickname(signupDTO.getNickname());
        user.setEmail(signupDTO.getEmail());
        user.setPassword(getEncryptPassword(signupDTO.getPassword()));
        user.setJob(signupDTO.getJob());
        user.setJobLevel(signupDTO.getJobLevel());
        user.setIsReceiveMail(signupDTO.getIsReceiveMail());
        user.setSelfIntro(signupDTO.getSelfIntro());
        userRepository.save(user);
        // 유저 스킬 저장
        for (UserSkillDTO userSkillDTO : signupDTO.getUserSkills()) {
            UserSkill userSkill = new UserSkill();
            userSkill.setUser(user);
            userSkill.setName(userSkillDTO.getName());
            userSkill.setLevel(userSkillDTO.getLevel());
            userSkillRepository.save(userSkill);
        }
        return user;
    }</code></pre>
<h3 id="enum-과-문자열-비교">enum 과 문자열 비교</h3>
<p>에는 valueof 이걸 쓰자!
예시)</p>
<pre><code class="language-java">project.getStatus().equals(ProjectStatus.valueOf(&quot;PROGRESS&quot;))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][백준] 2644번 촌수계산]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPython%EB%B0%B1%EC%A4%80-2644%EB%B2%88-%EC%B4%8C%EC%88%98%EA%B3%84%EC%82%B0</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPython%EB%B0%B1%EC%A4%80-2644%EB%B2%88-%EC%B4%8C%EC%88%98%EA%B3%84%EC%82%B0</guid>
            <pubDate>Tue, 13 Sep 2022 06:35:37 GMT</pubDate>
            <description><![CDATA[<h2 id="boj-2644번-촌수계산">[BOJ] 2644번 촌수계산</h2>
<p><a href="https://www.acmicpc.net/problem/2644">https://www.acmicpc.net/problem/2644</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>이 문제는 DFS와 BFS 두가지 방법 모두로 풀어보았다</li>
<li>이 문제는 DFS가 간단해서 더 나은것같다</li>
<li>전에 2차원 배열로 푸는게 나을 것 같다고 하는데 다시 정정한다. 이 코드처럼 연결리스트로 푸는게 훨씬 나은 것 같다!</li>
<li>끊어져있는 그래프일 때는 어떻게 푸는가 관련 문제도 한번 풀어봐야겠다.</li>
</ul>
<h3 id="--내-코드">- 내 코드</h3>
<pre><code class="language-python">from collections import deque

def bfs(start):
    queue = deque([start])
    visited[start]=True
    while queue:
        v = queue.popleft()
        for i in graph[v]:
            if visited[i]==False:
                queue.append(i)
                check[i]=check[v]+1
                visited[i]=True

def dfs(V):
    visited[V] = True
    for i in graph[V]:
        if visited[i]==False:
            check[i]=check[V]+1
            dfs(i)

N = int(input())

A, B = map(int, input().split())

M = int(input())

graph = [[] for row in range(N+1)]

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

visited = [False] * (N+1)
check=[0]*(N+1)

# bfs(A)
dfs(A)

if check[B]&gt;0:
    print(check[B])
else:
    print(-1)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][백준] 2606번 바이러스]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPython%EB%B0%B1%EC%A4%80-2606%EB%B2%88-%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A4</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPython%EB%B0%B1%EC%A4%80-2606%EB%B2%88-%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A4</guid>
            <pubDate>Mon, 12 Sep 2022 12:34:11 GMT</pubDate>
            <description><![CDATA[<h2 id="boj-2606번-바이러스">[BOJ] 2606번 바이러스</h2>
<p><a href="https://www.acmicpc.net/problem/2606">https://www.acmicpc.net/problem/2606</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>DFS와 BFS 두가지 방법 모두로 풀어보았다</li>
<li>두 방법 모두 가능하지만 이 문제처럼 일반적으로 모든 경우를 다 탐색해야 하는 경우는 DFS, 많은 경우의 수가 있어 (ex 미로) 다 탐색하지 않는 경우 BFS가 선호된다고 한다.</li>
<li>찾아보니까 2차원 배열이 아닌 dic을 이용하여 풀기도 하는 것 같다.</li>
</ul>
<h3 id="--내-코드">- 내 코드</h3>
<pre><code class="language-python">from collections import deque

def bfs(graph):
    queue = deque([1])
    visited[1]==True
    while deque:
        v=queue.popleft()
        for i in range(len(graph[v])):
            if visited[i]==False and graph[v][i]==1:
                queue.append(i)
                visited[i]=True
        if len(queue)==0:
            break


def dfs(graph, V, visited):
    visited[V]=True
    for i in range(len(graph[V])):
        if visited[i]==False and graph[V][i]==1:
            dfs(graph, i, visited)

N=int(input())
M=int(input())

graph = [[0 for col in range(N+1)] for row in range(N+1)]

for i in range(M):
    a, b = map(int, input().split())
    graph[a][b]=1
    graph[b][a]=1

visited = [False] * (N+1)
visited[0] = True

# bfs(graph)
dfs(graph,1,visited)
print(sum(visited)-2)</code></pre>
<h3 id="--조금-더-괜찮아-보이는-코드">- 조금 더 괜찮아 보이는 코드</h3>
<pre><code class="language-python">n = int(input())        # 컴퓨터의 수
m = int(input())        # 연결된 컴퓨터 쌍의 수

# 인접리스트 graph 선언 및 입력받기
graph = [[] for _ in range(n+1)]
for _ in range(m):                            # 연결된 컴퓨터 쌍의 수만큼 반복
    x, y = map(int, input().split())        
    graph[x].append(y)
    graph[y].append(x)

visited = [0] * (n+1)    # 방문처리 : 방문한 컴퓨터 수를 출력해야하므로 visited 에 True/False가 아닌 0/1로 처리

def dfs(graph, v, visited):
    visited[v] = 1
    for i in graph[v]:
        if visited[i] == 0:
            dfs(graph, i, visited)
    return True

dfs(graph, 1, visited)
print(sum(visited)-1)    # 방문한 컴퓨터 개수 - 1번 컴퓨터</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][백준] 1260번 DFS와 BFS]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPython%EB%B0%B1%EC%A4%80-1260%EB%B2%88-DFS%EC%99%80-BFS</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPython%EB%B0%B1%EC%A4%80-1260%EB%B2%88-DFS%EC%99%80-BFS</guid>
            <pubDate>Tue, 06 Sep 2022 12:04:54 GMT</pubDate>
            <description><![CDATA[<h2 id="boj-1260번-dfs와-bfs">[BOJ] 1260번 DFS와 BFS</h2>
<p><a href="https://www.acmicpc.net/problem/1260">https://www.acmicpc.net/problem/1260</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>DFS와 BFS의 정석 문제</li>
<li>얘를 기반으로 앞으로의 문제도 풀어나가야 겠다</li>
<li>앞에 이코테 강의 정리하면서 푼 예제 문제랑은 다르게 그래프를 행렬로 만들어서 풀었는데 이 방법이 더 나은 것 같다!🔥</li>
</ul>
<h3 id="--내-코드">- 내 코드</h3>
<pre><code class="language-python">from collections import deque

def dfs(graph, V, visited):
    visited[V]=True
    print(V, end = &#39; &#39;)
    for i in range(len(graph[V])):
        if visited[i]==False and graph[V][i]==1:
            dfs(graph, i, visited)

def bfs(graph, start, visited):
    queue = deque([start])
    visited[start]=True
    while queue:
        v = queue.popleft()
        print(v, end = &#39; &#39;)
        for i in range(len(graph[v])):
            if visited[i]==False and graph[v][i]==1:
                queue.append(i)
                visited[i]=True


N, M, V = map(int, input().split())

graph = [[0 for col in range(N+1)] for row in range(N+1)]

for i in range(M):
    a, b = map(int, input().split())
    graph[a][b]=1
    graph[b][a]=1

visited = [False]*(N+1)
visited[0] = True

dfs(graph, V, visited)
print()

visited = [False]*(N+1)
visited[0] = True

bfs(graph, V, visited)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python][알고리즘] 이코테 강의정리 - DFS & BFS]]></title>
            <link>https://velog.io/@donggle_22/Python%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%9D%B4%EC%BD%94%ED%85%8C-%EA%B0%95%EC%9D%98%EC%A0%95%EB%A6%AC-DFS-BFS</link>
            <guid>https://velog.io/@donggle_22/Python%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%9D%B4%EC%BD%94%ED%85%8C-%EA%B0%95%EC%9D%98%EC%A0%95%EB%A6%AC-DFS-BFS</guid>
            <pubDate>Tue, 30 Aug 2022 08:18:00 GMT</pubDate>
            <description><![CDATA[<h2 id="스택과-큐-자료구조">스택과 큐 자료구조</h2>
<h3 id="--스택-구현-예제">- 스택 구현 예제</h3>
<pre><code class="language-python">stack = []

stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()

print(stack[::-1])  # 최상단 원소부터 출력([1,3,2,5])
print(stack)    # 최하단 원소부터 출력([5,2,3,1])</code></pre>
<h3 id="--큐-구현-예제">- 큐 구현 예제</h3>
<p>: 이것도 리스트를 이용해서 짤 수도 있지만 시간복잡도가 더 증가 =&gt; deque 라이브러리 이용하기!</p>
<pre><code class="language-python">from collections import deque

# 큐(Queue) 구현을 위해 deque 라이브러리 사용
queue = deque()

queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()

print(queue) # 먼저 들어온 순서대로 출력([3,7,1,4])
queue.reverse() # 역순으로 바꾸기
print(queue) # 나중에 들어온 원소부터 출력([4,1,7,3])</code></pre>
<br/>

<h2 id="재귀-함수">재귀 함수</h2>
<p>: DFS를 간결하고 짧은 코드로 작성하기 위해 사용(스택 라이브러리 대신 재귀 함수를 이용하는 경우)</p>
<h3 id="--간단-예시">- 간단 예시</h3>
<pre><code class="language-python">def recursive_function():
    print(&#39;재귀 함수를 호출합니다.&#39;)
    recursive_function()

recursive_function()    # 무한 루프</code></pre>
<h3 id="--팩토리얼-구현-예제">- 팩토리얼 구현 예제</h3>
<pre><code class="language-python"># 반복적으로 구현한 n!
def factorial_iterative(n):
    result=1
    for i in range(1, n+1):
        result*=i
    return result

# 재귀적으로 구현한 n!
def factorial_recursive(n):
    if n&lt;=1:
        return 1
    return n * factorial_recursive(n-1)

print(&#39;반복적으로 구현:&#39;, factorial_iterative(5))   # 반복적으로 구현: 120
print(&#39;재귀적으로 구현:&#39;, factorial_recursive(5))   # 재귀적으로 구현: 120</code></pre>
<h3 id="--최대공약수-계산-유클리드-호제법-예제">- 최대공약수 계산 (유클리드 호제법) 예제</h3>
<p><img src="https://velog.velcdn.com/images/donggle_22/post/d5914899-778f-432f-9807-992ea78a37c3/image.png" alt=""></p>
<pre><code class="language-python">def gcd(a,b):
    if a%b==0:
        return b
    else:
        return gcd(b,a%b)

print(gcd(192,162))</code></pre>
<br/>

<h2 id="dfsdepth-first-search">DFS(Depth-First Search)</h2>
<ul>
<li>깊이 우선 탐색</li>
<li>스택 자료구조(혹은 재귀함수)를 이용<h3 id="--dfs-동작-예시">- DFS 동작 예시</h3>
<img src="https://velog.velcdn.com/images/donggle_22/post/763eb991-9bec-4098-96a4-8d450c33f079/image.png" alt=""><pre><code class="language-python">def dfs(graph, v, visited):
  visited[v] = True
  print(v, end = &#39; &#39;)
  for i in graph[v]:
      if not visited[i]:
          dfs(graph, i, visited)
</code></pre>
</li>
</ul>
<p>graph = [
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]
]</p>
<p>visited = [False]*9</p>
<p>dfs(graph, 1, visited)    # 실행결과 : 1 2 7 6 8 3 4 5</p>
<pre><code>
&lt;br/&gt;

## BFS(Breadth-First Search)
- 너비 우선 탐색 / 가까운 노드부터 우선적으로 탐색하는 알고리즘
- 큐 자료구조 이용
- 각 간선의 비용이 모두 동일한 상황에서 최단거리 문제를 해결하기 위한 목적으로 사용
### - BFS 동작 예시
![](https://velog.velcdn.com/images/donggle_22/post/2383fa23-8eab-4efa-b825-96a8abe6bc48/image.png)
```python
from collections import deque

def bfs(graph, start, visited):
    queue = deque([start])
    visited[start] = True
    while queue:
        v = queue.popleft()
        print(v, end = &#39; &#39;)
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

graph = [
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7]
]

visited = [False] * 9

bfs(graph, 1, visited)    # 실행 결과 : 1 2 3 8 7 4 5 6</code></pre><br/>

<h2 id="기초-문제-예제">기초 문제 예제</h2>
<h3 id="--음료수-얼려-먹기-문제dfs-or-bfs">- 음료수 얼려 먹기 문제(DFS or BFS)</h3>
<p><img src="https://velog.velcdn.com/images/donggle_22/post/b8a04174-a2e2-4471-b73e-afdb6f20d1f2/image.png" alt="">
<img src="https://velog.velcdn.com/images/donggle_22/post/3bc5a956-ad33-4716-9b76-7ed350dce7c8/image.png" alt=""></p>
<pre><code class="language-python">def dfs(x, y):
    if x&lt;=-1 or x&gt;=n or y&lt;=-1 or y&gt;=m:
        return False
    if graph[x][y]==0:
        graph[x][y]=1
        dfs(x-1,y)
        dfs(x,y-1)
        dfs(x+1,y)
        dfs(x,y+1)
        return True
    return False

n, m = map(int, input().split())

graph=[]
for i in range(n):
    graph.append(list(map(int, input())))

result = 0
for i in range(n):
    for j in range(m):
        if dfs(i,j)==True:
            result+=1

print(result) </code></pre>
<h3 id="--미로-탈출-문제bfs">- 미로 탈출 문제(BFS)</h3>
<p><img src="https://velog.velcdn.com/images/donggle_22/post/6d75575d-4c79-4864-869c-6b8cf0e1ab5b/image.png" alt="">
<img src="https://velog.velcdn.com/images/donggle_22/post/310daa30-6997-4aed-a3f4-fc5ad5d32188/image.png" alt=""></p>
<pre><code class="language-python">def bfs(x, y):
    queue = deque()
    queue.append((x, y))
    while queue:
        x, y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx &lt; 0 or nx &gt;= n or ny &lt; 0 or ny &gt;= m:
                continue
            if graph[nx][ny]==0:
                continue
            if graph[nx][ny]==1:
                graph[nx][ny]=graph[x][y]+1
                queue.append((nx, ny))

    return graph[n-1][m-1]


from collections import deque

n, m = map(int, input().split())

graph = []
for i in range(n):
    graph.append(list(map(int, input())))

# 이동할 네 가지 방향 정의(상, 하, 좌, 우)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

print(bfs(0,0))</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring/개발] - http response 구성]]></title>
            <link>https://velog.io/@donggle_22/Spring%EA%B0%9C%EB%B0%9C-http-response-%EA%B5%AC%EC%84%B1</link>
            <guid>https://velog.io/@donggle_22/Spring%EA%B0%9C%EB%B0%9C-http-response-%EA%B5%AC%EC%84%B1</guid>
            <pubDate>Wed, 24 Aug 2022 14:38:56 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>controller 작성 시 return 하는 ResponseEntity의 구성을 알고 사용하는 것이 좋다고 생각하여 http response 구성에 대하여 정리해 보았다.</p>
</li>
<li><p>ex) ResponseEntity의 body에 넣어주고 처리한다</p>
<pre><code class="language-java">  @PostMapping(&quot;/travels&quot;)
  public ResponseEntity saveTravel(@RequestBody Travel travel) {
      CustomResponseBody&lt;Travel&gt; responseBody = new CustomResponseBody&lt;&gt;(&quot;여행지 저장 성공&quot;);
      try{
          travelService.saveTravel(travel);

      } catch (RuntimeException re){
          responseBody.setResultCode(-1);
          responseBody.setResultMsg(re.getMessage());
          return ResponseEntity.badRequest().body(responseBody);
      } catch (Exception e){
          responseBody.setResultCode(-2);
          responseBody.setResultMsg(e.getMessage());
          return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseBody);
      }

      return ResponseEntity.ok().body(responseBody);
  }</code></pre>
</li>
<li><p>참고 : <a href="https://velog.io/@teddybearjung/HTTP-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%86%8C">https://velog.io/@teddybearjung/HTTP-%EA%B5%AC%EC%A1%B0-%EB%B0%8F-%ED%95%B5%EC%8B%AC-%EC%9A%94%EC%86%8C</a></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring/개발] - TMI(4)]]></title>
            <link>https://velog.io/@donggle_22/Spring%EA%B0%9C%EB%B0%9C-TMI4</link>
            <guid>https://velog.io/@donggle_22/Spring%EA%B0%9C%EB%B0%9C-TMI4</guid>
            <pubDate>Wed, 24 Aug 2022 14:36:03 GMT</pubDate>
            <description><![CDATA[<h3 id="네이티브-sql">네이티브 SQL</h3>
<ul>
<li>랜덤 추출을 위한 쿼리는 jpql은 지원하지 않는다고 하였다.</li>
<li>하여 jpa native query를 이용하여야 한다고 하였다.</li>
<li>참고: <a href="https://data-make.tistory.com/616">https://data-make.tistory.com/616</a></li>
<li>ex)<pre><code class="language-java">  /**
   * 랜덤 여행지 정보 가져오기
   *
   * @return 랜덤 여행지 리스트
   */
  public List&lt;Travel&gt; findRandom() {
      return em.createNativeQuery(&quot;select * from travel order by rand() limit 20&quot;, Travel.class)
              .getResultList();       //native sql
  }</code></pre>
</li>
</ul>
<h3 id="컨트롤러-매개변수에서-쓰이는-어노테이션-정리">컨트롤러 매개변수에서 쓰이는 어노테이션 정리</h3>
<ul>
<li>@RequestBody :   <ul>
<li>클라이언트가 body에 application/json 형태로 값(보통 객체)을 담아 전송하면, body의 내용을 다시 Java Object(객체)로 변환해주는 역할을 수행합니다.</li>
</ul>
</li>
<li>@PathVariable : url에 id 값 넣어서 받아오는 경우
ex) &quot;travels/{travelId}/detail&quot;</li>
<li>@RequestParam : 파라미터 하나하나 씩 받아 올때<ul>
<li>HTTP 요청 parameter를 @RequestParam이 쓰이는 메소드의 변수로 Mapping 해주는 역할입니다.</li>
</ul>
</li>
<li>@ModelAttribute : form 만들어서 한번에 받아올때<ul>
<li>클라이언트가 전송하는 HTTP parameter(URL 끝에 추가하는 파라미터), HTTP Body 내용을 Setter 함수를 통해 1:1로 객체에 데이터를 바인딩합니다. (Setter 필수!)<ul>
<li>※ 참고
<a href="https://maivve.tistory.com/298">https://maivve.tistory.com/298</a>, <a href="https://galid1.tistory.com/769">https://galid1.tistory.com/769</a></li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algorithm/Python][프로그래머스] 시저 암호]]></title>
            <link>https://velog.io/@donggle_22/AlgorithmPython%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%8B%9C%EC%A0%80-%EC%95%94%ED%98%B8</link>
            <guid>https://velog.io/@donggle_22/AlgorithmPython%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%8B%9C%EC%A0%80-%EC%95%94%ED%98%B8</guid>
            <pubDate>Mon, 15 Aug 2022 13:33:44 GMT</pubDate>
            <description><![CDATA[<h2 id="프로그래머스-시저-암호">[프로그래머스] 시저 암호</h2>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/12926">https://school.programmers.co.kr/learn/courses/30/lessons/12926</a></p>
<h3 id="--문제-접근">- 문제 접근</h3>
<ul>
<li>ord() : 문자를 아스키 코드(숫자)로!</li>
<li>chr() : 아스키 코드를 문자로!</li>
<li>세상엔 기발한 클린 코드하는 방법이 참 많다..!(아래 수정한 코드 참고)</li>
</ul>
<h3 id="--처음-코드">- 처음 코드</h3>
<pre><code class="language-python">def solution(s, n):
    result=&quot;&quot;
    for i in s:
        if i==&quot; &quot;:
            result+=&quot; &quot;
            continue
        i=ord(i)
        for j in range(n):
            if i==90:
                i=65
            elif i==122:
                i=97
            else:
                i+=1          
        result+=chr(i)
    return result</code></pre>
<h3 id="--수정한-코드">- 수정한 코드</h3>
<pre><code class="language-python">def caesar(s, n):
    s = list(s)
    for i in range(len(s)):
        if s[i].isupper():
            s[i]=chr((ord(s[i])-ord(&#39;A&#39;)+ n)%26+ord(&#39;A&#39;))
        elif s[i].islower():
            s[i]=chr((ord(s[i])-ord(&#39;a&#39;)+ n)%26+ord(&#39;a&#39;))

    return &quot;&quot;.join(s)</code></pre>
<br>

<h1 id="✔-한-일-점검">✔ 한 일 점검</h1>
<br>

<h1 id="✔-내일-목표">✔ 내일 목표</h1>
<ul>
<li>백준 or 프로그래머스 - 2문제 이상</li>
<li>스프링 - 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 끝내기</li>
<li>파이썬 - 이코테 강의2</li>
<li>창액 프로젝트 crud</li>
<li>졸작 회의</li>
<li>튜터링 면접..?</li>
<li>운전면허 받으러 가기</li>
<li>캐리비안 숙소 알아보기</li>
</ul>
<br>

<h1 id="✔-주저리">✔ 주저리</h1>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring/개발] - TMI(3)]]></title>
            <link>https://velog.io/@donggle_22/Spring%EA%B0%9C%EB%B0%9C-TMI3</link>
            <guid>https://velog.io/@donggle_22/Spring%EA%B0%9C%EB%B0%9C-TMI3</guid>
            <pubDate>Mon, 15 Aug 2022 12:13:44 GMT</pubDate>
            <description><![CDATA[<h3 id="default-값-설정해주는-방법">default 값 설정해주는 방법</h3>
<h4 id="첫번째-방법">첫번째 방법</h4>
<ul>
<li>프로젝트를 등록할 때 유저에게 입력받지 않고 자동으로 저장되는 값들을 정해주려고했다.</li>
<li>service로 가서 등록하는 함수(register)에서 save 함수를 호출하기 전에 값을 넣어준다.
※ enum은 <pre><code class="language-java">project.setStatus(ProjectStatus.INSPECTION);</code></pre>
이런식으로 enum을 저장해준 클래스를 호출하여 거기중 하나의 값을 가져와서 저장해준다!</li>
</ul>
<h4 id="두번째-방법">두번째 방법</h4>
<ul>
<li><p>이 방법을 늦게 알게 되어 추가로 쓴다.</p>
<pre><code class="language-java">@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder // 빌더 패턴
//ORM -&gt; Java(다른언어) Object -&gt; 테이블로 매핑해주는 기술
@Entity // User 클래스가 MySQL에 테이블이 생성이 된다. 이게 클레스에 가까이 있는 것이 좋다
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)// auto_increment
    private int id;

    @Column(nullable = false, length = 100)
    private String title;

    @Lob // 대용량 데이터
    private String content; // 섬머노트 라이브러리 &lt;html&gt;태그가 섞여서 디자인이 됨.

    @ColumnDefault(&quot;0&quot;)
    private int count; // 조회수

    @ManyToOne // Many = Board, User = One 한명의 유저는 여러개의 게시글을 쓸 수 있다.
    @JoinColumn(name=&quot;userId&quot;) // foreign key (userId) references User (id)
    private User user; // DB는 오브젝트를 저장할 수 없다. FK, 자바는 오브젝트를 저장할 수 있다. //참조 할 테이블

    @CreationTimestamp //값이 입력될때 혹은 업데이트될때 자동으로 시간이 들어간다.
    private Timestamp createDate;

}</code></pre>
<p>이런식으로 @ColumnDefault(), @CreationTimestampe 등을 이용!
근데 Enum은 안먹어서 첫번째 방법으로 하였다..</p>
</li>
</ul>
<h3 id="fk-값-설정해주는-방법">FK 값 설정해주는 방법</h3>
<ul>
<li><p>컨트롤러에서 project를 등록할 때 return 값으로 projectId를 주게 되는데 그 값을 받아서 해당 id 값을 FK로 사용할 service에 매개변수로 넣어준다.</p>
</li>
<li><p>예시) 컨트롤러</p>
<pre><code class="language-java">  @PostMapping(&quot;/projects&quot;)
  public ResponseEntity register (@RequestBody ProjectCreateDTO model){
      CustomResponseBody&lt;ProjectCreateDTO&gt; responseBody = new CustomResponseBody&lt;&gt;(&quot;프로젝트 등록 성공2&quot;);
      try {
          Long projectId = projectService.register(model.getProject());
          projectSkillService.register(model.getProjectSkill(),projectId);
          recruitInfoService.register(model.getRecruitInfo(),projectId);

      } 
      //...생략

      return ResponseEntity.ok().body(responseBody);
  }</code></pre>
</li>
<li><p>해당 projectId를 받아 오려면 project의 ProjectRepository를 import 해주어 projectId로 findOne(id를 이용하여 해당 클래스를 반환해 주는 함수) 을 이용하여 받아 올 수 있게 해준다!</p>
</li>
<li><p>코드 참고:
<a href="https://github.com/JJOWIN/jjowin_back/commit/e2daa96799068c7f816fd1343c8810fd81aae466">https://github.com/JJOWIN/jjowin_back/commit/e2daa96799068c7f816fd1343c8810fd81aae466</a></p>
</li>
</ul>
<h3 id="feature8프로젝트-생성-남은-이슈">Feature#8(프로젝트 생성) 남은 이슈</h3>
<ul>
<li>leader 까지 해서 나중에 테스트</li>
<li>project 엔티티에 이미지 추가
=&gt; 이미지는 url로 받을 예정으로 String으로 저장</li>
<li><del>project 엔티티 저장할때 자동적으로</del> 
  <del>1. status, like_count =&gt; default 검수, 0 으로 저장되게</del>
  <del>2. start_date, end_date =&gt; 현재시각으로</del></li>
</ul>
<ul>
<li><p>~~recruit_info 엔티티 저장할때 자동적으로 complet_count =&gt; 0으로 저장되게 </p>
</li>
<li><blockquote>
<p>아무것도 안넣어주면 걍 자동으로 0으로 저장됨!~~</p>
</blockquote>
</li>
<li><p><del>FK 값 가져오는 방법 고민</del></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring/개발] - TMI(2)]]></title>
            <link>https://velog.io/@donggle_22/Spring%EA%B0%9C%EB%B0%9C-TMI2</link>
            <guid>https://velog.io/@donggle_22/Spring%EA%B0%9C%EB%B0%9C-TMI2</guid>
            <pubDate>Sun, 14 Aug 2022 07:19:29 GMT</pubDate>
            <description><![CDATA[<h3 id="포스트맨에서-배열로-받은-data-하나씩-db에-저장하기">포스트맨에서 배열로 받은 data 하나씩 db에 저장하기</h3>
<ul>
<li>requestbody 한번에 받아서 여러 db에 나누어 저장하는 방법을 해내고(TMI(1)참고) 프로젝트 생성하기는 다했다~하고 신나하고 있는데 뭐가 또 잘 안되었다..</li>
<li>RDBMS로 만들어 테이블을 쪼개어 배열로 들어오는 data는 다른 테이블에 저장되는 방식으로 개발을 하였다.</li>
<li>하여 배열로 들어오게 되는 data를 쪼개어 다른 db에 하나씩 저장해 주어야했다.</li>
<li>예를 들어, <img src="https://velog.velcdn.com/images/donggle_22/post/5cd0c584-a858-456c-998d-82a05d81c067/image.png" alt="">
해당 json을 저장하려고 했는데 recruitInfo 부분이 저장되지 않았다</li>
</ul>
<h3 id="해결-방법">해결 방법</h3>
<ul>
<li><p>먼저 ProjectCreateDTO에서 RecruitInfo를 배열로 선언해 주었다</p>
<pre><code class="language-java">@Getter @Setter
public class ProjectCreateDTO {
  private Project project;
  private ProjectSkill projectSkill;
  private RecruitInfo[] recruitInfo;
}</code></pre>
</li>
<li><p>다음으로 RecruitInfoService로 가서 for문을 돌려 하나씩 저장할 수 있게 해주면 끝</p>
<pre><code class="language-java">public class RecruitInfoService {
  private final RecruitInfoRepository recruitInfoRepository;

  @Transactional
  public Long register(RecruitInfo[] recruitInfo){
      for (int i=0; i&lt;recruitInfo.length;i++){
          recruitInfoRepository.save(recruitInfo[i]);
      }
      return recruitInfo[0].getId();
  }
</code></pre>
</li>
</ul>
<p>}</p>
<p>```</p>
<ul>
<li>컨트롤러랑, 리퍼지토리는 건들이지 않았다!</li>
</ul>
<h3 id="느낀점">느낀점</h3>
<ul>
<li>이것저것 찾아봤었는데 결국 생각보다 간다한게 풀렸다. 전문가들은 한방에 찾아서 슉샥 고쳤겠지.. 경험치를 올려서 나도 딱보면 똭 해결하도록 더 열심히 코딩을 하여야겠다!</li>
</ul>
<h3 id="feature8프로젝트-생성-남은-이슈">Feature#8(프로젝트 생성) 남은 이슈</h3>
<ul>
<li>leader 까지 해서 나중에 테스트</li>
<li>project 엔티티에 이미지 추가</li>
<li>project 엔티티 저장할때 자동적으로 <ol>
<li>status, like_count =&gt; default 검수, 0 으로 저장되게</li>
<li>start_date, end_date =&gt; 현재시각으로</li>
</ol>
</li>
</ul>
<ul>
<li><p>recruit_info 엔티티 저장할때 자동적으로 complet_count =&gt; 0으로 저장되게</p>
</li>
<li><p>FK 값 가져오는 방법 고민</p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>