<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>HJ</title>
    <link>https://0902.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 12 Apr 2026 21:25:41 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>H JAY</managingEditor>
    <item>
      <title>백준 / 17135 / 캐슬 디펜스 / 파이썬, python, pypy</title>
      <link>https://0902.tistory.com/74</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2360&quot; data-origin-height=&quot;1864&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xQ3Ny/btrN3nU34Rw/384gKuSf12eS5Ag4uXtYU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xQ3Ny/btrN3nU34Rw/384gKuSf12eS5Ag4uXtYU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xQ3Ny/btrN3nU34Rw/384gKuSf12eS5Ag4uXtYU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxQ3Ny%2FbtrN3nU34Rw%2F384gKuSf12eS5Ag4uXtYU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2360&quot; height=&quot;1864&quot; data-origin-width=&quot;2360&quot; data-origin-height=&quot;1864&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2360&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6mxwD/btrN3ofmkxD/mKKrZIE59auOgK18MC0GCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6mxwD/btrN3ofmkxD/mKKrZIE59auOgK18MC0GCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6mxwD/btrN3ofmkxD/mKKrZIE59auOgK18MC0GCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6mxwD%2FbtrN3ofmkxD%2FmKKrZIE59auOgK18MC0GCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2360&quot; height=&quot;286&quot; data-origin-width=&quot;2360&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1665140195450&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;17135번: 캐슬 디펜스&quot; data-og-description=&quot;첫째 줄에 격자판&amp;nbsp;행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가&amp;nbsp;주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/17135&quot; data-og-url=&quot;https://www.acmicpc.net/problem/17135&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bg83TU/hyP3xT8DmQ/8hjACMbchbd4h0B9RI7Xuk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17135&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/17135&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bg83TU/hyP3xT8DmQ/8hjACMbchbd4h0B9RI7Xuk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;17135번: 캐슬 디펜스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 격자판&amp;nbsp;행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가&amp;nbsp;주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 읽고 적이 아래로 한칸 이동한다를 &quot;궁수가 한칸씩 위로 이동한다&quot; 라고 생각하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(board 자체를 수정하지 않고, 궁수 배열을 따로 관리하며 row를 바꾸는것이 더 간단하다고 생각하였기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로직은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 궁수 3명의 index(column)를 정하여 archer 배열로 선언한다 (조합)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. archer의 row를 N+1부터 1까지 (역순으로) 변경하며 가장 가까운 적을 제거한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-1. archer의 좌표가 (r, c)라면 (r-1, c)부터 좌, 우, 상 방향으로 이동하며 distance를 1씩 증가시키며 bfs를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-2. 가장 가까운 적의 좌표를 current enemy set에 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-3. 3명의 archer 모두 탐색한 뒤 current enemy set에 있는 좌표를 통해 board를 변경한다 (board[x][y] = 1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-4. current enemy set을 enemy set과 합친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-4. r을 하나 감소시키고 (궁수를 한칸 전진 시키고) 2-1부터 다시 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. enemy set에 있는 좌표를 통해 board를 변경한다. (board[x][y] = 0, 죽은 적을 되살린다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. enemy set의 길이를 return한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;24&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;25&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;26&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;27&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;28&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;29&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;30&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;31&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;32&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;33&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;34&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;35&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;36&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;37&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;38&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;39&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;40&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;41&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;42&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;43&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;44&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;45&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;46&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;47&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;48&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;49&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;50&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;51&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;52&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;53&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;54&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;55&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;56&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;57&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;58&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;59&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;60&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;61&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;62&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;63&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;64&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;65&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;66&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;67&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;68&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;69&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;70&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;71&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;72&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;73&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;74&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;75&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;76&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;77&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;import&lt;/span&gt;&amp;nbsp;sys&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;from&lt;/span&gt;&amp;nbsp;collections&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;import&lt;/span&gt;&amp;nbsp;deque&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;direction&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;((&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;),&amp;nbsp;(&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;),&amp;nbsp;(&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;bfs(r,&amp;nbsp;c):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queue&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;deque([(&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;r&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;c)])&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;visit&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;set()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;visit.add((r&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;c))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_distance&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;float(&lt;span style=&quot;color: #ffd500;&quot;&gt;'inf'&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_x,&amp;nbsp;min_y&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;while&lt;/span&gt;&amp;nbsp;queue:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d,&amp;nbsp;x,&amp;nbsp;y&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;queue.popleft()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;min_distance&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;d:&amp;nbsp;break&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;board[x][y]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;min_distance&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;float(&lt;span style=&quot;color: #ffd500;&quot;&gt;'inf'&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_distance&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;d&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_x,&amp;nbsp;min_y&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;x,&amp;nbsp;y&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;else&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;min_y&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;y:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min_x,&amp;nbsp;min_y&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;x,&amp;nbsp;y&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;d&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;D:&amp;nbsp;continue&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;dx,&amp;nbsp;dy&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;direction:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nx,&amp;nbsp;ny&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;x&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&amp;nbsp;dx,&amp;nbsp;y&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&amp;nbsp;dy&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;not&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;nx&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;N&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;and&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;ny&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;M):&amp;nbsp;continue&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;(nx,&amp;nbsp;ny)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;visit:&amp;nbsp;continue&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;queue.append((d&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;nx,&amp;nbsp;ny))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;visit.add((nx,&amp;nbsp;ny))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;(min_x,&amp;nbsp;min_y)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;attack_simulation(archer):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dead_enemy&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;set()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;archer_row&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(N,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur_dead_enemy&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;set()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;archer_col&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;archer:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;near_enemy&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;bfs(archer_row,&amp;nbsp;archer_col)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;near_enemy&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;):&amp;nbsp;continue&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur_dead_enemy.add(near_enemy)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;x,&amp;nbsp;y&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;cur_dead_enemy:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;board[x][y]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dead_enemy&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;cur_dead_enemy&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cnt_dead_enemy&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;len&lt;/span&gt;(dead_enemy)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;x,&amp;nbsp;y&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;dead_enemy:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;board[x][y]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;cnt_dead_enemy&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;solve():&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archer&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;a&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(M):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archer.append(a)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;b&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(a&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;M):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archer.append(b)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;c&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(b&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;M):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archer.append(c)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;max(answer,&amp;nbsp;attack_simulation(archer))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archer.pop()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archer.pop()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;archer.pop()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;answer&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;N,&amp;nbsp;M,&amp;nbsp;D&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;map(&lt;span style=&quot;color: #4be6fa;&quot;&gt;int&lt;/span&gt;,&amp;nbsp;sys.stdin.readline().split())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;board&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[list(map(&lt;span style=&quot;color: #4be6fa;&quot;&gt;int&lt;/span&gt;,&amp;nbsp;sys.stdin.readline().split()))&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;_&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(N)]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(solve())&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;문제 자체는 어렵지 않았지만, bruteforce 방식으로 simulation하다보니 코드의 길이가 길어졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;조합을 직접 구현하기보다 combinations 패키지를 사용한다면 조금 더 깔끔하게 구현이 가능할 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>알고리즘</category>
      <category>17135</category>
      <category>PyPy</category>
      <category>Python</category>
      <category>백준</category>
      <category>캐슬디펜스</category>
      <category>파이썬</category>
      <author>H JAY</author>
      <guid isPermaLink="true">https://0902.tistory.com/74</guid>
      <comments>https://0902.tistory.com/74#entry74comment</comments>
      <pubDate>Fri, 7 Oct 2022 20:08:06 +0900</pubDate>
    </item>
    <item>
      <title>백준 / 1520 / 내리막 길 / 파이썬, python, pypy</title>
      <link>https://0902.tistory.com/72</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;1329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kXolr/btrMPlCBGGN/iRdEoKJP2YVgyWLwKtAONk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kXolr/btrMPlCBGGN/iRdEoKJP2YVgyWLwKtAONk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kXolr/btrMPlCBGGN/iRdEoKJP2YVgyWLwKtAONk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkXolr%2FbtrMPlCBGGN%2FiRdEoKJP2YVgyWLwKtAONk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1217&quot; height=&quot;1329&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;1329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1663844742844&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1520번: 내리막 길&quot; data-og-description=&quot;여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1520&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1520&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4BjGF/hyPS20ChbX/7V9RZl5ODKM6ccWnoioYI0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/bIiqUn/hyPSVApgNP/QHVKTpMiYNidMmxlnCnuA0/img.jpg?width=302&amp;amp;height=246&amp;amp;face=0_0_302_246,https://scrap.kakaocdn.net/dn/m8V8u/hyPSS4NIuz/ufokGjCfBc1TaCq8KewMa1/img.jpg?width=302&amp;amp;height=244&amp;amp;face=0_0_302_244&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1520&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1520&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4BjGF/hyPS20ChbX/7V9RZl5ODKM6ccWnoioYI0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/bIiqUn/hyPSVApgNP/QHVKTpMiYNidMmxlnCnuA0/img.jpg?width=302&amp;amp;height=246&amp;amp;face=0_0_302_246,https://scrap.kakaocdn.net/dn/m8V8u/hyPSS4NIuz/ufokGjCfBc1TaCq8KewMa1/img.jpg?width=302&amp;amp;height=244&amp;amp;face=0_0_302_244');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1520번: 내리막 길&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 문제를 보자마자 dfs를 생각했고, 아무 생각없이 문제를 풀었더니 시간초과가 발생하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 다시보니 아래 또는 오른쪽으로만 이동 가능한게 아니라 돌아서 오는 경우를 생각해야했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp를 사용해야한다 생각해서 dfs(x, y)는 x, y에서 출발하여 N-1, M-1까지 가는 경로의 수로 정의하고 dp 배열에 값을 저장하는 식으로 풀이하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;24&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;import&lt;/span&gt;&amp;nbsp;sys&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;sys.setrecursionlimit(&lt;span style=&quot;color: #c10aff;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;9&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;direction&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;((&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;),&amp;nbsp;(&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;),&amp;nbsp;(&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;),&amp;nbsp;(&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;dfs(x,&amp;nbsp;y)&amp;nbsp;-&amp;gt;&amp;nbsp;(x,&amp;nbsp;y)에서&amp;nbsp;출발하여&amp;nbsp;(N-1,&amp;nbsp;M-1)까지&amp;nbsp;가는&amp;nbsp;경우의&amp;nbsp;수&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;dfs(x,&amp;nbsp;y):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;x&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;N&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;and&lt;/span&gt;&amp;nbsp;y&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;M&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;dp[x][y]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;:&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;dp[x][y]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dp[x][y]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;dx,&amp;nbsp;dy&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;direction:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nx,&amp;nbsp;ny&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;x&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&amp;nbsp;dx,&amp;nbsp;y&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&amp;nbsp;dy&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;not&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;nx&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;N&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;and&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;ny&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;M)&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;or&lt;/span&gt;&amp;nbsp;board[x][y]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;board[nx][ny]:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dp[x][y]&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;dfs(nx,&amp;nbsp;ny)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;dp[x][y]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;N,&amp;nbsp;M&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;map(&lt;span style=&quot;color: #4be6fa;&quot;&gt;int&lt;/span&gt;,&amp;nbsp;sys.stdin.readline().split())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;board&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[list(map(&lt;span style=&quot;color: #4be6fa;&quot;&gt;int&lt;/span&gt;,&amp;nbsp;sys.stdin.readline().split()))&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;_&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(N)]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;dp&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[[&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;]&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;M&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;_&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(N)]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(dfs(&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;))&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>알고리즘</category>
      <author>H JAY</author>
      <guid isPermaLink="true">https://0902.tistory.com/72</guid>
      <comments>https://0902.tistory.com/72#entry72comment</comments>
      <pubDate>Thu, 22 Sep 2022 20:16:54 +0900</pubDate>
    </item>
    <item>
      <title>두들잇(Doodle it) AS 후기 - 두들 플러그</title>
      <link>https://0902.tistory.com/71</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;얼마 전 가방에서 맥북 충전기를 꺼냈는데, 플러그의 플라스틱이 떨어져 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_4156.jpg&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;1186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcNpbr/btrLgSjodKp/IRrWBOEFjrkMhdbtsRed3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcNpbr/btrLgSjodKp/IRrWBOEFjrkMhdbtsRed3K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcNpbr/btrLgSjodKp/IRrWBOEFjrkMhdbtsRed3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcNpbr%2FbtrLgSjodKp%2FIRrWBOEFjrkMhdbtsRed3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;1186&quot; data-filename=&quot;IMG_4156.jpg&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;1186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_4155.jpg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ipfcz/btrLhfLZPRf/bpKQEl15YRWKJ1x3WQMIu0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ipfcz/btrLhfLZPRf/bpKQEl15YRWKJ1x3WQMIu0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ipfcz/btrLhfLZPRf/bpKQEl15YRWKJ1x3WQMIu0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIpfcz%2FbtrLhfLZPRf%2FbpKQEl15YRWKJ1x3WQMIu0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;1477&quot; data-filename=&quot;IMG_4155.jpg&quot; data-origin-width=&quot;1125&quot; data-origin-height=&quot;1477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가방에 넣어놨다 꺼냈는데 플라스틱이 벌어져있었고, 약 2만 원 정도의 제품으로 또 사야 하나?라는 생각을 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접지가 되지 않는 애플 충전기의 특성상 대체품은 두들 플러그밖에 없기에 주문을 하다가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;충전은 정상적으로 되는 상황인데, AS가 가능하지 않을까?라는 생각을 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 연락했더니, &lt;b&gt;구매 후 1년이 지나지 않아 AS가 가능하다&lt;/b&gt;는 답변을 받았고 위험하니 사용하지 말고 폐기 처분하라는 친절한 답변을 받았습니다 ㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그날 바로 택배를 통해서 두들 플러그를 발송해주셨고, 다음날 새 제품을 받을 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_IMG_4154.JPG&quot; data-origin-width=&quot;2609&quot; data-origin-height=&quot;1525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEW3Fh/btrLg69zgIo/xKmZOmV1aw5ezzONdWtAdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEW3Fh/btrLg69zgIo/xKmZOmV1aw5ezzONdWtAdk/img.png&quot; data-alt=&quot;(좌) 두들 충전기 케이스, 새로 받은 두들 플러그, (우) 망가진 두들 플러그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEW3Fh/btrLg69zgIo/xKmZOmV1aw5ezzONdWtAdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEW3Fh%2FbtrLg69zgIo%2FxKmZOmV1aw5ezzONdWtAdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2609&quot; height=&quot;1525&quot; data-filename=&quot;edited_IMG_4154.JPG&quot; data-origin-width=&quot;2609&quot; data-origin-height=&quot;1525&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;(좌) 두들 충전기 케이스, 새로 받은 두들 플러그, (우) 망가진 두들 플러그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 충전기, 케이블 등 다양한 제품들을 사면서 망가지면 버려야지 라는 생각을 많이 했는데, 두들은 AS 정책이 제대로 이루어진다는 것이 놀랍네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문의 전 구글링을 했을 때, AS에 관련된 글을 찾을 수 없었기에&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 글을 쓰게 되었습니다. 구매 또는 AS에 도움이 되었으면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 맥북 접지를 위해 플러그를 고민하고 계시다면, 두들 제품을 추천합니다 ㅎㅎ&lt;/p&gt;</description>
      <category>리뷰/전자제품</category>
      <category>as</category>
      <category>두들</category>
      <category>두들 플러그</category>
      <category>맥북 접지</category>
      <category>맥북 충전기</category>
      <category>수리</category>
      <author>H JAY</author>
      <guid isPermaLink="true">https://0902.tistory.com/71</guid>
      <comments>https://0902.tistory.com/71#entry71comment</comments>
      <pubDate>Sat, 3 Sep 2022 18:31:43 +0900</pubDate>
    </item>
    <item>
      <title>OAuth 2.0 이란?</title>
      <link>https://0902.tistory.com/70</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;========================================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OAuth 2.0을 통해서 로그인 기능을 구현하였지만, 실제로 OAuth를 이해하고 했다기보다 구글링을 통해 다양한 예제와 간단한 flow만 보고 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 개념을 다시 정리하고 이해하기 위해서 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;========================================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;OAuth란 무엇인가?&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-27 오후 10.15.16.png&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nVoft/btrFWxJyRZQ/AWWSYkeDnAuObApjM13gck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nVoft/btrFWxJyRZQ/AWWSYkeDnAuObApjM13gck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nVoft/btrFWxJyRZQ/AWWSYkeDnAuObApjM13gck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnVoft%2FbtrFWxJyRZQ%2FAWWSYkeDnAuObApjM13gck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;305&quot; height=&quot;368&quot; data-filename=&quot;스크린샷 2022-06-27 오후 10.15.16.png&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 사이트에서 로그인 시 Google, Facebook등의 소셜 계정을 기반으로 쉽게 회원가입 및 로그인 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼 클릭 한번으로 회원가입 및 로그인이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Google, Facebook, Twitter에서 정보를 가져와 회원가입 정보로 사용하거나, 쉽게 로그인을 할 수 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;OAuth의 정의&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는 접근 위임을 위한 개방형 표준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 OAuth 2.0은 1.0에서 알려진 보안 문제 등을 개선한 버전이다.&lt;/p&gt;</description>
      <category>Backend</category>
      <author>H JAY</author>
      <guid isPermaLink="true">https://0902.tistory.com/70</guid>
      <comments>https://0902.tistory.com/70#entry70comment</comments>
      <pubDate>Mon, 27 Jun 2022 22:23:01 +0900</pubDate>
    </item>
    <item>
      <title>MLOps - Feature Store 기초 실습 (using Feast)</title>
      <link>https://0902.tistory.com/69</link>
      <description>&lt;article id=&quot;976ae602-9db0-4ca1-98b0-b029bcc9fadb&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;p id=&quot;1134964d-a2b7-4c18-b80a-6d540b0a22b1&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;93f78a6e-2864-471d-83a0-10cd2ee99744&quot;&gt;&lt;a class=&quot;bookmark source&quot; href=&quot;https://docs.feast.dev/getting-started/quickstart&quot;&gt;
&lt;div class=&quot;bookmark-info&quot;&gt;
&lt;div class=&quot;bookmark-text&quot;&gt;
&lt;div class=&quot;bookmark-title&quot;&gt;Quickstart&lt;/div&gt;
&lt;div class=&quot;bookmark-description&quot;&gt;Feature reusability and model versioning: Different teams within an organization are often unable to reuse features across projects, resulting in duplicate feature creation logic. Models have data dependencies that need to be versioned, for example when running A/B tests on model versions.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;bookmark-href&quot;&gt;&lt;img class=&quot;icon bookmark-icon&quot; src=&quot;https://firebasestorage.googleapis.com/v0/b/gitbook-28427.appspot.com/o/spaces%2F-LqPPgcuCulk4PnaI4Ob%2Favatar-1590217188819.png?generation=1590217189444336&amp;amp;alt=media&quot; /&gt;https://docs.feast.dev/getting-started/quickstart&lt;/div&gt;
&lt;/div&gt;
&lt;img class=&quot;bookmark-image&quot; src=&quot;https://app.gitbook.com/share/space/thumbnail/yVldV2laSML2GcPMnSTL.png?color=%230033DB&amp;amp;logo=https%3A%2F%2Ffirebasestorage.googleapis.com%2Fv0%2Fb%2Fgitbook-28427.appspot.com%2Fo%2Fspaces%252F-LqPPgcuCulk4PnaI4Ob%252Favatar-rectangle-1590217195988.png%3Fgeneration%3D1590217197437042%26alt%3Dmedia&amp;amp;theme=none&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;p id=&quot;16a1e9cd-5fe0-43c0-8452-7098ee445eef&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이 실습은 위의 자료를 참고하여 작성하였습니다. 실습은 colab에서 진행하였습니다.&lt;/p&gt;
&lt;p id=&quot;5bacb1a3-4b8c-4d19-a17d-8222e0247557&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;b9ed4343-fa5f-4c4a-9d3e-e4c25b78b1bd&quot; class=&quot;&quot;&gt;Feast Tutorial&lt;/h1&gt;
&lt;p id=&quot;1758e265-2168-4615-b52d-e0894077b2ce&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;0278f95b-9cab-46a8-9697-f814baea2a22&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Common Issues&lt;/h3&gt;
&lt;ol id=&quot;a4b261b5-f77d-431c-91fe-7ed5ebced154&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Training-serving skew &amp;amp; complex data joins&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;9f9b8416-22e7-43f2-b7dd-57751b48c9ba&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Online feature availability&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;66a2740c-e4b5-42a2-9f2c-d2fad2b8bdd2&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;3&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Feature resuability &amp;amp; model versioning&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;139af260-9a23-4938-9406-071582f427a0&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rArr; Feast를 이용하여 해결할 수 있다!!&lt;/p&gt;
&lt;h2 id=&quot;0d805196-b76d-43fe-9c93-299d8489ef17&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;Step 1 : Install Feast&lt;/h2&gt;
&lt;p id=&quot;7f65db4b-7fa8-48ae-9629-f6c7b1640933&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;pip 를 이용해서 Feast를 설치한다.&lt;/p&gt;
&lt;pre id=&quot;bc1e07e9-7339-4fd0-87e3-6a2f46addd15&quot; class=&quot;code erlang-repl&quot;&gt;&lt;code&gt;%%sh pip install feast -U -q pip install Pygments -q echo &quot;Please restart your runtime now (Runtime -&amp;gt; Restart runtime). This ensures that the correct dependencies are loaded.&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;25807cdf-be46-4652-a7f6-35b70fcb908f&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;설치하고 나서 runtime을 꼭 restart 해주어야 한다.&lt;/p&gt;
&lt;p id=&quot;b147e1a0-c374-4d14-aea0-dc3505fc6863&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;e2a7f0ee-2f37-41ed-b508-4a9f786ec78e&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;Step 2 : &lt;b&gt;Create a feature repository&lt;/b&gt;&lt;/h2&gt;
&lt;p id=&quot;afaca8d0-77dd-42c8-a362-afe75152c7ad&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;feature repository 는 feature store에 담을 feature들을 생성하는 코드가 모여있는 곳이다.&lt;/p&gt;
&lt;p id=&quot;1d28b23f-7a1d-476f-aae8-8dad4ccb8bce&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;fa29bd40-5167-42bf-b741-1a5b8b2fab72&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 &lt;code&gt;feature_repo&lt;/code&gt; 라는 이름으로 feature repository를 생성한다.&lt;/p&gt;
&lt;pre id=&quot;259a0a2e-cfed-49c1-84f1-ca9a7594b8a2&quot; class=&quot;code diff&quot;&gt;&lt;code&gt;!feast init feature_repo&lt;/code&gt;&lt;/pre&gt;
&lt;figure id=&quot;6863b422-4c80-4de7-bf8c-f074fccb5e00&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot;&gt;&lt;img style=&quot;width: 280px;&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;p id=&quot;e6de515f-6285-4f4f-b9ca-8fc3262bd8e3&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 위와 같이 feature_repo가 생성되며 안에 기본 샘플 파일들이 생성된 것을 볼 수가 있다.&lt;/p&gt;
&lt;p id=&quot;a93ec1e1-18cc-4cca-a266-8fcd7b8fbcac&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;feature repository의 구성 :&lt;/p&gt;
&lt;ul id=&quot;50697451-06bf-4136-98c2-299c8432661c&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;data/driver_stats.parquet&lt;/code&gt; : parquet으로 저장되어 있는 raw data&lt;/li&gt;
&lt;/ul&gt;
&lt;div id=&quot;f5e01a32-f0d3-42cd-af62-7661f767d18b&quot; class=&quot;collection-content&quot;&gt;
&lt;h4 class=&quot;collection-title&quot; data-ke-size=&quot;size20&quot;&gt;driver_stats.parquet&lt;/h4&gt;
&lt;table class=&quot;collection-content&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;span class=&quot;icon property-icon&quot;&gt;&lt;/span&gt;index&lt;/th&gt;
&lt;th&gt;&lt;span class=&quot;icon property-icon&quot;&gt;&lt;/span&gt;event_timestamp&lt;/th&gt;
&lt;th&gt;&lt;span class=&quot;icon property-icon&quot;&gt;&lt;/span&gt;driver_id&lt;/th&gt;
&lt;th&gt;&lt;span class=&quot;icon property-icon&quot;&gt;&lt;/span&gt;conv_rate&lt;/th&gt;
&lt;th&gt;&lt;span class=&quot;icon property-icon&quot;&gt;&lt;/span&gt;acc_rate&lt;/th&gt;
&lt;th&gt;&lt;span class=&quot;icon property-icon&quot;&gt;&lt;/span&gt;avg_daily_trips&lt;/th&gt;
&lt;th&gt;&lt;span class=&quot;icon property-icon&quot;&gt;&lt;/span&gt;created&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr id=&quot;d0fdd6c8-28ba-4c18-a02f-57d24b9619b9&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/0-d0fdd6c828ba4c18a02f57d24b9619b9&quot;&gt;0&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 12:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.9725654721260071&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.3631921708583832&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;410&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;171a261c-17c3-4a24-9399-edd28e933fa7&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/1-171a261c17c34a249399edd28e933fa7&quot;&gt;1&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 1:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.04274604469537735&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.2000729739665985&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;856&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;dc1cb33c-f45f-46e0-bb1b-e56eb44f3ece&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/2-dc1cb33cf45f46e0bb1be56eb44f3ece&quot;&gt;2&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 2:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.9639862179756165&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.7615727186203003&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;691&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;bef87197-bcd7-4e5f-bc96-79c1e4e9da29&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/3-bef87197bcd74e5fbc9679c1e4e9da29&quot;&gt;3&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 3:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.9086549878120422&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.7580361366271973&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;142&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;64e21aa0-f28d-424d-9f89-7c435f91f0fb&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/4-64e21aa0f28d424d9f897c435f91f0fb&quot;&gt;4&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 4:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.433357298374176&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.9592541456222534&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;828&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;821fd470-fc86-4046-af9f-0930df7619df&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/5-821fd470fc864046af9f0930df7619df&quot;&gt;5&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 5:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.8010686635971069&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.4016995131969452&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;697&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;5aaad4ef-a2d4-4911-8837-e6cf01652651&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/6-5aaad4efa2d449118837e6cf01652651&quot;&gt;6&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 6:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.4435613453388214&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.8471459150314331&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;987&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;e062df3a-2533-42b0-92c5-19252290a036&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/7-e062df3a253342b092c519252290a036&quot;&gt;7&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 7:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.4307439923286438&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.5900391340255737&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;520&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3af89a18-3e91-409d-ab30-28fb6615f82d&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/8-3af89a183e91409dab3028fb6615f82d&quot;&gt;8&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 8:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.4524332880973816&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.6440556645393372&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;716&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3f54d8e6-83cc-41a8-8632-4bd5cc78896a&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/9-3f54d8e683cc41a886324bd5cc78896a&quot;&gt;9&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 9:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.7183521389961243&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.16217832267284393&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;985&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;f28b0884-419c-4625-8d8f-08e17687dad5&quot;&gt;
&lt;td class=&quot;cell-title&quot;&gt;&lt;a href=&quot;https://www.notion.so/10-f28b0884419c46258d8f08e17687dad5&quot;&gt;10&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;cell-lqo&amp;#96;&quot;&gt;&lt;time&gt;@2022년 1월 31일 오전 10:00&lt;/time&gt;&lt;/td&gt;
&lt;td class=&quot;cell-obDr&quot;&gt;1005&lt;/td&gt;
&lt;td class=&quot;cell-drml&quot;&gt;0.48318737745285034&lt;/td&gt;
&lt;td class=&quot;cell-qtR&amp;lt;&quot;&gt;0.215327188372612&lt;/td&gt;
&lt;td class=&quot;cell-v[jw&quot;&gt;831&lt;/td&gt;
&lt;td class=&quot;cell-i&amp;lt;\?&quot;&gt;&lt;time&gt;@2022년 2월 14일 오후 3:33&lt;/time&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p id=&quot;c0060298-19c3-4dd9-9044-7fa9fb17e6fe&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul id=&quot;c59dd12c-d2b9-4bb4-b906-19e40b46e227&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;feature_store.yaml&lt;/code&gt; : featire repo가 어떻게 실행될 지 등의 설정 값이 작성된 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;44fe29f7-c4b2-4b81-84ee-a1b7a9d1e1ab&quot; class=&quot;code less&quot;&gt;&lt;code&gt;project: feature_repo registry: data/registry.db provider: local online_store:     path: data/online_store.db&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;2f110035-1aa5-4670-9b74-7b5ab77557b1&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul id=&quot;86ff1cc1-adfd-4a31-84ee-1904e9fec981&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;example.py&lt;/code&gt; feature가 정의 되어있는 Python file&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;5504d02f-ff5c-4c38-b2d1-c893701a8060&quot; class=&quot;code pgsql&quot;&gt;&lt;code&gt;# This is an example feature definition file  from google.protobuf.duration_pb2 import Duration  from feast import Entity, Feature, FeatureView, FileSource, ValueType  # Read data from parquet files. Parquet is convenient for local development mode. For # production, you can use your favorite DWH, such as BigQuery. See Feast documentation # for more info. driver_hourly_stats = FileSource(     path=&quot;/content/feature_repo/data/driver_stats.parquet&quot;,     event_timestamp_column=&quot;event_timestamp&quot;,     created_timestamp_column=&quot;created&quot;, )  # Define an entity for the driver. You can think of entity as a primary key used to # fetch features. driver = Entity(name=&quot;driver_id&quot;, value_type=ValueType.INT64, description=&quot;driver id&quot;,)  # Our parquet files contain sample data that includes a driver_id column, timestamps and # three feature column. Here we define a Feature View that will allow us to serve this # data to our model online. driver_hourly_stats_view = FeatureView(     name=&quot;driver_hourly_stats&quot;,     entities=[&quot;driver_id&quot;],     ttl=Duration(seconds=86400 * 1),     features=[         Feature(name=&quot;conv_rate&quot;, dtype=ValueType.FLOAT),         Feature(name=&quot;acc_rate&quot;, dtype=ValueType.FLOAT),         Feature(name=&quot;avg_daily_trips&quot;, dtype=ValueType.INT64),     ],     online=True,     batch_source=driver_hourly_stats,     tags={}, )&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;11136143-d15e-40b2-a2f4-b097215d1a21&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;위의 예제는 3개의 feature를 정의하였다. ( &lt;code&gt;conv_rate&lt;/code&gt; &lt;code&gt;acc_rate&lt;/code&gt; &lt;code&gt;avg_daily_trips&lt;/code&gt; )&lt;/p&gt;
&lt;h2 id=&quot;103f08a1-9f31-4980-b171-5c0aabbb887a&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Step 3: &lt;/b&gt;D&lt;b&gt;eploy your feature store&lt;/b&gt;&lt;/h2&gt;
&lt;p id=&quot;47099c00-5d08-4613-a426-699769c362eb&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://example.py&quot;&gt;&lt;code&gt;example.py&lt;/code&gt;&lt;/a&gt; 에서 정의한 feature store를 배포하는 코드는 아래와 같다&lt;/p&gt;
&lt;pre id=&quot;d43af3ef-29db-489f-ba4d-37ffbfd0c625&quot; class=&quot;code coq&quot;&gt;&lt;code&gt;!feast apply&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;41feb3bd-e02d-4474-beda-a868f2a7bea4&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 실행하고 나면&amp;nbsp;&lt;code&gt;feture_store.yaml&lt;/code&gt;&amp;nbsp;에 설정된 값에 따라 다음처럼 추가적인 파일이 생긴다.&lt;/p&gt;
&lt;p id=&quot;2e124c8c-c872-4f6b-9c87-00c10596eca2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;data/&lt;/code&gt;&amp;nbsp;내에&amp;nbsp;&lt;code&gt;online_store.db&lt;/code&gt;,&amp;nbsp;&lt;code&gt;registry.db&lt;/code&gt;&amp;nbsp;파일이 생긴 것을 알 수 있다. (이는 우리가&amp;nbsp;&lt;code&gt;provider: local&lt;/code&gt;&amp;nbsp;로 설정해서 그렇다.)&lt;/p&gt;
&lt;figure id=&quot;50e8d451-a5f6-459a-9209-86d27f2b545c&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot;&gt;&lt;img style=&quot;width: 267px;&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;p id=&quot;874643ff-c4ad-4206-a240-02347b9cc4d6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;ff9a78bf-91e9-4b87-82b9-9af186e99fe6&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Step 4: Generate training data&lt;/b&gt;&lt;/h2&gt;
&lt;p id=&quot;166a3709-2296-41ed-bd42-fd4b037e9f5c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;b6930464-f5c1-4479-9f13-4d77a8c22451&quot; class=&quot;code pgsql&quot;&gt;&lt;code&gt;from datetime import datetime, timedelta import pandas as pd  # The entity dataframe is the dataframe we want to enrich with feature values entity_df = pd.DataFrame.from_dict(     {         &quot;driver_id&quot;: [1001, 1002, 1003],         &quot;label_driver_reported_satisfaction&quot;: [1, 5, 3],          &quot;event_timestamp&quot;: [             datetime.now() - timedelta(minutes=11),             datetime.now() - timedelta(minutes=36),             datetime.now() - timedelta(minutes=73),         ],     } ) &lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;4c499a80-a6af-450f-bfd3-59c6420d1905&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;feature store에서 feature를 불러와 위에 정의한 데이터 프레임에 추가를 한다.&lt;/p&gt;
&lt;pre id=&quot;5103fe17-65e6-428e-8642-3f8f2bb2710b&quot; class=&quot;code reasonml&quot;&gt;&lt;code&gt;from feast import FeatureStore  store = FeatureStore(repo_path=&quot;.&quot;)  training_df = store.get_historical_features(     entity_df=entity_df,  # 위에서 만든 데이터프레임을 넘겨준다.     feature_refs = [         'driver_hourly_stats:conv_rate',         'driver_hourly_stats:acc_rate',         'driver_hourly_stats:avg_daily_trips'     ],  # 불러올 feature를 적는다. ).to_df()  training_df.head()&lt;/code&gt;&lt;/pre&gt;
&lt;figure id=&quot;6f7f7528-e22e-4a99-b617-5a8f4399a17d&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot;&gt;&lt;img style=&quot;width: 602px;&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;91e16c9b-bf8d-4806-afef-0e9ecc959eab&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot;&gt;&lt;img style=&quot;width: 946px;&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;p id=&quot;362bafd8-9504-4d95-8153-6310be20fe29&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;위에서 정의한 3개의 feature, &lt;code&gt;conv_rate&lt;/code&gt; , &lt;code&gt;acc_rate&lt;/code&gt; , &lt;code&gt;avg_daily_trips&lt;/code&gt; 가 join된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p id=&quot;d5881e83-33b8-449d-9547-6a9b8129a910&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;fd15bb23-ed94-4394-aa8b-fefb9b527e72&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Step 5: Load features into your online store&lt;/b&gt;&lt;/h2&gt;
&lt;p id=&quot;2ad10d28-e189-427b-a7cd-ed11d19a224b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 feature store에서 가장 최근 등록된 값들만 불러오자.&lt;/p&gt;
&lt;h3 id=&quot;12301c1d-7480-4b60-9045-723ce09981f3&quot; class=&quot;&quot; data-ke-size=&quot;size23&quot;&gt;Using &lt;code&gt;&lt;b&gt;feast materialize-incremental&lt;/b&gt;&lt;/code&gt;&lt;b&gt; &lt;/b&gt;&lt;/h3&gt;
&lt;p id=&quot;1e701164-89b9-405c-929e-87a11a7d5211&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;materialize-incremental&lt;/code&gt; serializes all new features since the last&amp;nbsp;&lt;code&gt;materialize&lt;/code&gt; &amp;nbsp;call&lt;/p&gt;
&lt;pre id=&quot;307730b6-77d1-4a25-ab24-d618bf3fb79e&quot; class=&quot;code elm&quot;&gt;&lt;code&gt;from datetime import datetime !feast materialize-incremental {datetime.now().isoformat()}&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;4b7c4e97-38f1-4f10-9d9b-d245695c7ced&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;materialize&lt;/code&gt; 를 실행하면 데이터가 &lt;code&gt;online_store.db&lt;/code&gt;&amp;nbsp; 와 &lt;code&gt;registry.db&lt;/code&gt; 에 저장된다(?)&lt;/p&gt;
&lt;p id=&quot;d408a909-7235-4e62-8356-2e6c6c769afa&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;f879d4ef-515b-4a73-8acf-68bcf99af7ee&quot; class=&quot;code vim&quot;&gt;&lt;code&gt;print(&quot;--- Data directory ---&quot;) !ls data  import sqlite3 import pandas as pd con = sqlite3.connect(&quot;data/online_store.db&quot;) print(&quot;\n--- Schema of online store ---&quot;) print(     pd.read_sql_query(         &quot;SELECT * FROM feature_repo_driver_hourly_stats&quot;, con).columns.tolist()) con.close()&lt;/code&gt;&lt;/pre&gt;
&lt;figure id=&quot;317e1c99-b062-443c-a00b-4198362aee1e&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot;&gt;&lt;img style=&quot;width: 522px;&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;h2 id=&quot;acaa9617-e70f-4bd7-8379-e682e493b4f0&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Step 6: Fetching feature vectors for inference&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;6756e4f9-95b1-4992-9f2c-afc4374df31b&quot; class=&quot;code reasonml&quot;&gt;&lt;code&gt;from pprint import pprint from feast import FeatureStore  store = FeatureStore(repo_path=&quot;.&quot;)  feature_vector = store.get_online_features(     features=[         &quot;driver_hourly_stats:conv_rate&quot;,         &quot;driver_hourly_stats:acc_rate&quot;,         &quot;driver_hourly_stats:avg_daily_trips&quot;,     ],     entity_rows=[         {&quot;driver_id&quot;: 1004},         {&quot;driver_id&quot;: 1005},     ], ).to_dict()  pprint(feature_vector)&lt;/code&gt;&lt;/pre&gt;
&lt;figure id=&quot;b30e1f8d-9246-4155-b3ee-1725d6d11286&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot;&gt;&lt;img style=&quot;width: 447px;&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/img?original&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;p id=&quot;80f7bf62-3a10-4a66-9787-ab65a35f7b6a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;feature store에 최근에 등록된 feature를 잘 가져온 것을 볼 수 있다.&lt;/p&gt;
&lt;p id=&quot;cf3fde71-6334-4f18-8650-5755e5a47417&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;f2cfcbbc-3abe-4b86-8e17-0a36dc3e17ae&quot; class=&quot;&quot; data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;ul id=&quot;aed14902-ea44-493b-a76b-37ec9d3a878a&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;이 레포 안에서&amp;nbsp;&lt;code&gt;feast&lt;/code&gt;&amp;nbsp;SDK와 파이썬을 이용하여 feature를 정의할 수 있다. 구체적으론 코드에서 다음을 정의한다.
&lt;ul id=&quot;8bb84fd5-371a-41fa-a027-edbed532bc76&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;&lt;code&gt;feast init &amp;lt;repo_name&amp;gt;&lt;/code&gt;&amp;nbsp;으로 사용할 feature store repository를 만들 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;7aac55b2-fef5-47a3-bac7-e38f006f0888&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;&lt;code&gt;DataSource&lt;/code&gt;
&lt;ul id=&quot;a2ede99e-6038-4427-8066-e30d28b5edd9&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: square;&quot;&gt;데이터를 가져올 데이터 소스를 지정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;4ba41198-d838-45a3-b7c7-4528ce252071&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: square;&quot;&gt;File, BigQuery 등이 되겠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;5a1c7db5-3f1a-494b-a30f-4ff3f1ef9242&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;&lt;code&gt;Entity&lt;/code&gt;
&lt;ul id=&quot;2baca1b4-1a83-4404-949a-8b99138dee56&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: square;&quot;&gt;Feature 그룹의 대표 ID를 지정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;d5374bed-a4bd-4d9f-ae03-3a2e7f5f297a&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;&lt;code&gt;FeatureView&lt;/code&gt;
&lt;ul id=&quot;293a3953-3a3f-41bf-b408-554b88ac6de4&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: square;&quot;&gt;위에서 지정한&amp;nbsp;&lt;code&gt;DataSource&lt;/code&gt;,&amp;nbsp;&lt;code&gt;Entity&lt;/code&gt;&amp;nbsp;를 가지고 Feature Store에 저장할 Feature 그룹을 지정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;6ee47bc6-f500-4941-86d7-608c3ebaeb52&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;코드를 작성한 후&amp;nbsp;&lt;code&gt;feast apply&lt;/code&gt;&amp;nbsp;로 feature store를 생성 및 업데이트할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;7d61b5a9-6599-486a-9316-ec94ea6e17a8&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;code&gt;feast materialize&lt;/code&gt;&amp;nbsp;로 최신 feature 값들을 저장 및 버전 관리할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;9fee3690-c675-4466-84bd-79628d5b6ab3&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;머신러닝 코드에서&amp;nbsp;&lt;code&gt;feast&lt;/code&gt;&amp;nbsp;SDK로 위 feature store에 정의한 feature 들을 가져올 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;13484202-95b6-4c62-a442-0c17a7ab1f61&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;e52a749b-b690-4e73-8f41-14bdec6d0bd8&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;c07a401d-20e6-4960-a90f-58c63794ab05&quot;&gt;&lt;a class=&quot;bookmark source&quot; href=&quot;https://dailyheumsi.tistory.com/265&quot;&gt;
&lt;div class=&quot;bookmark-info&quot;&gt;
&lt;div class=&quot;bookmark-text&quot;&gt;
&lt;div class=&quot;bookmark-title&quot;&gt;Feast - Quick Review&lt;/div&gt;
&lt;div class=&quot;bookmark-description&quot;&gt;일반적인 정형 데이터 머신러닝 코드에는 데이터를 불러오고 필요한 feature를 뽑아 가공하는 부분이 있다. 보통 데이터 웨어하우스나 아니면 원천 데이터 소스에서 데이터를 불러올텐데, 이렇게 직접 데이터 소스에 붙지 않고 머신러닝에 필요한 데이터 스토어를 별도로 만들어 둘 수 있다. 그리고 여기에 필요한 feature들을 미리 가공하여 저장할 수 있고, 데이터 버전 관리도 도입해볼 수 있다.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;bookmark-href&quot;&gt;&lt;img class=&quot;icon bookmark-icon&quot; src=&quot;https://dailyheumsi.tistory.com/favicon.ico&quot; /&gt;https://dailyheumsi.tistory.com/265&lt;/div&gt;
&lt;/div&gt;
&lt;img class=&quot;bookmark-image&quot; src=&quot;https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjFaGf%2Fbtq4YkglUTL%2F7uphxzOPK33B5kfNaslI2k%2Fimg.png&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;p id=&quot;c6e31fa7-ad1b-4bb2-8baa-8e2fdafe252a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;위의 블로그가 정리가 잘되어 있어서 참고를 많이 했습니다!&lt;/p&gt;
&lt;p id=&quot;51a87aee-c9ef-4279-b069-c75639ced4d6&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;n2t_comment&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;block-color-gray&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://boltlessengineer.github.io/Notion2Tistory&quot;&gt;Uploaded by Notion2Tistory v1.1.0&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/article&gt;</description>
      <category>MLOps</category>
      <author>H JAY</author>
      <guid isPermaLink="true">https://0902.tistory.com/69</guid>
      <comments>https://0902.tistory.com/69#entry69comment</comments>
      <pubDate>Tue, 15 Mar 2022 19:49:49 +0900</pubDate>
    </item>
    <item>
      <title>MLOps - Data Management(DVC)</title>
      <link>https://0902.tistory.com/67</link>
      <description>&lt;article id=&quot;cbed19e8-8e46-4c67-a132-a4481b3df0c0&quot; class=&quot;page sans Notion_P&quot;&gt;
&lt;div class=&quot;page-body&quot;&gt;
&lt;h3 id=&quot;e1bf2ee4-0ee0-4da9-91c2-508c0ee3cf5e&quot; class=&quot;block-color-blue_background&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h3&gt;
&lt;ol id=&quot;086314e3-53ca-4136-a635-f9202d9fccbe&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Data Versioning&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;0da3fda7-a295-4cf3-bb63-cf50013fd806&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Data Versioning Tool&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;a8595ac3-ae23-4f72-83e2-02eb71840d25&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;3&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DVC
&lt;ol id=&quot;4c083361-5f28-4111-9e13-ce6b189ba361&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;1&quot; type=&quot;a&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DVC란?&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;200e841d-267d-4fea-80db-61e36a6e3c38&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; type=&quot;a&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DVC를 사용하는 이유&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;62da3fbc-d4b4-434c-a5c8-632a94022214&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;3b58468e-9748-4f61-be5c-06ac3a7377f6&quot; class=&quot;block-color-gray_background&quot;&gt;&lt;mark class=&quot;highlight-gray_background&quot;&gt;Data Versioning&lt;/mark&gt;&lt;/h1&gt;
&lt;ul id=&quot;3b8dc868-5644-421b-9a5d-d42aa0f0f55f&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;(Computer) Science적 가치를 갖기위해서는 reproducibility(재현성)이 보장되어야한다.
&lt;ul id=&quot;2ce8a303-45fa-4250-8c22-5dbe1bdcce69&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;reproducibility : 측정한 결과가 다시 나타나는 성질&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;bfa48ba6-3a49-43ac-b417-6b42529a9b7d&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;ex) 같은 데이터로 ML 모델을 Train하고 Validation하면 같은 결과값이 나옴(Seed가 같을 때)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;229f2824-99ed-4b47-af5e-78bf1d509253&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;그러나 현실 데이터는 계속해서 변화한다.
&lt;ul id=&quot;79670ce6-6b40-41d6-aab3-29fe4639997d&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;데이터 추가, 삭제, 기준 변경 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;d965dc20-ca39-4497-b1ce-a40a0261e985&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;그러므로 reproducibility를 위해 data versioning이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;ab38035a-0c68-40d0-ada7-b704717ed3bf&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul id=&quot;1c984500-f5b4-418b-9869-5bba69772450&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;ML 프로젝트에서도 소프트웨어 개발 프로세스를 적용하여 SW versioning 처럼 관리하기 시작
&lt;ul id=&quot;353b9c72-f9dd-48e5-8fc6-81497ecc3f6d&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;소스코드에 해당하는 데이터를 고유한 버전 번호를 오름차순으로 할당하여 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;80552ead-ccbf-400d-a33c-47d05001fa64&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;51d043a9-d422-49c4-a11b-001108902f06&quot; class=&quot;block-color-gray_background&quot;&gt;Data Versioning Tool&lt;/h1&gt;
&lt;p id=&quot;3628ba65-1970-476f-86dc-6111bebff70c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;따로 Tool을 사용하여 Data Versioning을 하지 않더라도, 단순하게 변경되는 데이터를 저장하여 날짜별로 파티셔닝하여 저장하고 사용할 수 있다.&lt;/p&gt;
&lt;p id=&quot;d974b6ab-3e0d-425e-8d89-676f11336cb0&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;b031039b-4f74-42d8-927d-10706910c20d&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 이러한 방법은 문제점이 존재한다.&lt;/p&gt;
&lt;div class=&quot;indented&quot;&gt;
&lt;ul id=&quot;3dbe1f28-b808-4bd5-bfbb-ff4a584c8290&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;데이터에 대한 immutability(불변성)을 보장하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;d0831607-6fe7-4b0a-90c5-f51000a9ef72&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;데이터를 버저닝하여 저장할 때 전체 데이터가 중복으로 저장 됨
&lt;ul id=&quot;6c23271d-6f99-4192-9d9b-418ff4c7b621&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: circle;&quot;&gt;ex) git을 사용하여 소스코드를 관리하면 변경된 부분만 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;0023d865-9d0f-4d9e-af8c-c43df4b18b6b&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;c385b492-1047-49af-b5c0-4da864ff6e7c&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;Data Versioning Tool은 이러한 문제점을 보완하고 편의성을 제공한다.&lt;/p&gt;
&lt;p id=&quot;3aa17205-4ba8-49cf-a4c1-5a79a9723d73&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로 DVC(Data Version Control), Neptune, Pachyderm, Git LFS, Modelstore, Hub, DAGsHub 등이 있다.&lt;/p&gt;
&lt;p id=&quot;31dbb980-9401-4aa8-972f-39224731661a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;b268096c-4ff1-4096-81d6-b0aef0ea57c8&quot; class=&quot;block-color-gray_background&quot;&gt;DVC (Data Version Control)&lt;/h1&gt;
&lt;p id=&quot;afc4c56e-8a8e-46e2-9fdd-c8c09fbe6698&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;36d8c204-d2c5-4e25-bdf6-92926ac70de3&quot; class=&quot;block-color-teal_background&quot; data-ke-size=&quot;size23&quot;&gt;DVC란?&lt;/h3&gt;
&lt;p id=&quot;9d5668f9-8bff-454f-aacb-bfe7be5aa783&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;머신러닝 프로젝트를 위한 Open Source Version Control System&lt;/p&gt;
&lt;p id=&quot;7c99c7ad-6922-482f-939e-0bd83f960414&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;4f926e25-4b1d-40c5-b126-9a4e183585b8&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;핵심 기능은 &lt;b&gt;데이터 파일과 디렉토리를 추적하고 버전을 관리&lt;/b&gt;&lt;/p&gt;
&lt;p id=&quot;dccd1307-0e2e-4c05-9fb3-c080e794092a&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;5e2abe5c-8bde-4690-ab7e-82eb252ec27e&quot; class=&quot;block-color-teal_background&quot; data-ke-size=&quot;size23&quot;&gt;DVC를 사용하는 이유&lt;/h3&gt;
&lt;ol id=&quot;ab77321d-4cc5-4b2a-b109-e5084bd65e62&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;1&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ML 모델이나 데이터 셋을 관리할 수 있음 - 재현성 증대
&lt;ul id=&quot;3521704e-7b51-419d-8c1b-e9135aabe178&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;데이터 사이언스 / 머신러닝 분야에서 주된 데이터 파일은 Git이 추적하기 힘든 이진 혹은 대용량 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;6315d79a-b1af-4941-a731-149064131c76&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;전처리/학습 코드와 configuration 뿐 아니라(Git으로도 가능), 대용량 데이터를 metafile(.dvc 파일)로 대체하여 versioning 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;8f977e86-0726-4b81-8c22-34cd7e64aef9&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;대용량 데이터는 원격 저장소(S3, GDrive)에 저장되고 storage 설정, push/pull 등을 DVC가 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;827bc535-e6ac-4bdc-9458-054d6d5aa6c9&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;2&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Data를 마치 Git 처럼 관리 - Versioning 용이
&lt;ul id=&quot;9f3e5a90-98a4-4f88-8693-30e131b3d067&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Git 인터페이스를 이용 (Git과 함께 실행)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;b57a992b-9fb0-4d8a-ad7b-3bc456b657ef&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;많은 사람들이 익숙하게 Git 인터페이스를 사용하므로, 처음 사용해도 쉽게 적응 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;b82d956c-b286-4f64-8240-2e65688559bf&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Git은 metafile(.dvc 파일)을 관리, DVC는 .dvc 파일을 사용하여 원격 저장소와 대용량 파일 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol id=&quot;c8bcff7f-84cf-4c45-af6b-8f459ac44b3c&quot; class=&quot;numbered-list&quot; style=&quot;list-style-type: disc;&quot; start=&quot;3&quot; type=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설정의 간편함
&lt;ul id=&quot;26a286bd-d644-4e1f-aaec-31cb95c21e24&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;그럼 익숙한 Git 기반의 Git LFS를 사용하면 안되나? 라고 생각하겠지만,&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;715e0038-35ac-424d-9e56-e8ff744647a4&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Git LFS는 파일 사이즈 제약이 크다&lt;/li&gt;
&lt;/ul&gt;
&lt;ul id=&quot;d71051e2-0f6f-4978-b3ba-049e91d08f85&quot; class=&quot;bulleted-list&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;그러나 DVC 의 경우 데이터를 저장하는 Storage 설정만 하면 쉽게 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;70325a9f-2b3a-4f73-8804-aaacc5752a15&quot; class=&quot;block-color-teal_background&quot; data-ke-size=&quot;size23&quot;&gt;DVC 동작 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;fcb16426-3711-496b-b752-6891cbf5b979&quot; class=&quot;image&quot;&gt;&lt;a href=&quot;https://dvc.org/img/flow.gif&quot;&gt;&lt;img src=&quot;https://dvc.org/img/flow.gif&quot; /&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;ul id=&quot;81b34b4c-83cd-44bd-bfcc-6cfc56403bf9&quot; class=&quot;toggle&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;details&gt;
&lt;summary&gt;링크&lt;/summary&gt;
&lt;p id=&quot;1c4c9bcc-3320-426f-a53b-84cf0442e520&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/iterative/dvc#how-dvc-works&quot;&gt;https://github.com/iterative/dvc#how-dvc-works&lt;/a&gt;&lt;/p&gt;
&lt;/details&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;664cc64d-ce3c-4e79-908b-0fc4d1253c83&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;b9e1028e-872e-455f-80e7-8a2f48dfa517&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;원격 저장소 설정이 완료되었다고 가정하고&lt;/p&gt;
&lt;p id=&quot;abd9f6d9-53b7-4124-b5c9-1b6ad4a3ea66&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;models/best-checkpoint.ckpt&lt;/code&gt;가 존재할때,&lt;code&gt;dvcfiles/trained_model.dvc&lt;/code&gt; 파일을 만듭니다.&lt;/p&gt;
&lt;p id=&quot;e23ce73d-68d5-4abd-ad5c-673d4a220d74&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;c3f0524a-ccf5-41c5-9cb2-a5da0ccdcfb2&quot; class=&quot;code pgsql&quot;&gt;&lt;code&gt;dvc add ../models/best-checkpoint.ckpt --file trained_model.dvc dvc push trained_model.dvc&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;70af6d16-d86a-41e0-ad17-acae20129bd5&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;b72b0b99-d730-471e-b3ac-371a874efb14&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;dvc 파일을 생성하고 push 헀으므로, 원본 데이터는 삭제가 가능합니다. dvc파일은 git으로 관리합니다.&lt;/p&gt;
&lt;pre id=&quot;5ce98588-bfa0-435b-b7da-0d6720e03e7e&quot; class=&quot;code pgsql&quot;&gt;&lt;code&gt;rm models/best-checkpoint.ckpt   git add dvcfiles/trained_model.dvc ../models/.gitignore  git commit -m &quot;Added trained model to google drive using dvc&quot;  git push&lt;/code&gt;&lt;/pre&gt;
&lt;p id=&quot;0800d540-c42f-4515-ae60-c89de7042ff5&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;20e12077-09ee-4afa-bb54-c20d916fdcf2&quot; class=&quot;&quot; data-ke-size=&quot;size16&quot;&gt;데이터를 로컬로 가져오려면 다음 커맨드를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;975cd2f0-3436-43d3-8afc-46526a98e8b1&quot; class=&quot;code gams&quot;&gt;&lt;code&gt;cd ../dvcfiles dvc pull trained_model.dvc&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;n2t_comment&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/article&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/etAG8O/btrtq9Vr5cq/kesQWC4B8gBJjHNYp0I99K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/etAG8O/btrtq9Vr5cq/kesQWC4B8gBJjHNYp0I99K/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/etAG8O/btrtq9Vr5cq/kesQWC4B8gBJjHNYp0I99K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/etAG8O/btrtq9Vr5cq/kesQWC4B8gBJjHNYp0I99K/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;10&quot; height=&quot;4&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>MLOps</category>
      <category>data management</category>
      <category>Data Version Control</category>
      <category>DVC</category>
      <category>mlops</category>
      <author>H JAY</author>
      <guid isPermaLink="true">https://0902.tistory.com/67</guid>
      <comments>https://0902.tistory.com/67#entry67comment</comments>
      <pubDate>Tue, 15 Feb 2022 18:35:29 +0900</pubDate>
    </item>
    <item>
      <title>백준 / 24040 / B 예쁜 케이크 / Good Bye, BOJ 2021! / 파이썬, python, pypy</title>
      <link>https://0902.tistory.com/64</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8pKBm/btrptgly6vz/UV49O79T1WAdZunsW5sn90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8pKBm/btrptgly6vz/UV49O79T1WAdZunsW5sn90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8pKBm/btrptgly6vz/UV49O79T1WAdZunsW5sn90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8pKBm%2Fbtrptgly6vz%2FUV49O79T1WAdZunsW5sn90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1160&quot; height=&quot;874&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;874&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ds1UMF/btrpjx8V4D5/B8lsF237OrNqHfbytkGrsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ds1UMF/btrpjx8V4D5/B8lsF237OrNqHfbytkGrsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ds1UMF/btrpjx8V4D5/B8lsF237OrNqHfbytkGrsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fds1UMF%2Fbtrpjx8V4D5%2FB8lsF237OrNqHfbytkGrsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1179&quot; height=&quot;681&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1641118271731&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;24040번: 예쁜 케이크&quot; data-og-description=&quot;Good Bye BOJ, 2021!이 열리는 오늘, 12월 31일은 종서의 생일이다. $N$ 명의 친구들은 종서에게 생일 선물로 예쁜 케이크를 만들어주려 한다. 여기에서,&amp;nbsp;예쁜 케이크는&amp;nbsp;다음과 같은 조건을 만족하는 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/24040&quot; data-og-url=&quot;https://www.acmicpc.net/problem/24040&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/h17aD/hyMWpdodao/UvUCkftode20vV0tgCnjG0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/24040&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/24040&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/h17aD/hyMWpdodao/UvUCkftode20vV0tgCnjG0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;24040번: 예쁜 케이크&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Good Bye BOJ, 2021!이 열리는 오늘, 12월 31일은 종서의 생일이다. $N$ 명의 친구들은 종서에게 생일 선물로 예쁜 케이크를 만들어주려 한다. 여기에서,&amp;nbsp;예쁜 케이크는&amp;nbsp;다음과 같은 조건을 만족하는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2021년 12월 31일 백준 대회엔 Good Bye, BOJ 2021!에 참가했다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A부터 G까지의 문제가 난이도 순으로 정렬되어, 앞 부분은 쉬운 문제일 것이라 생각했는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 문제는 간단하게 해결했지만, 2번 문제인 예쁜 케이크에서 많은 시간을 사용했다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 1~N까지의 모든 경우를 체크하면서 &quot;i+(N-i) % 3 == 0&quot;을 체크했는데, 시간초과가 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 다시 살펴보니, T가 1000까지고, N이 10**18이였으니 당연한 TLE...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한참 생각해도 브루트포스 방식말고 떠오르지 않아서, 그냥 일단 가능한 모든 경우를 나열해보니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패턴을 찾을 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(찾고보니 1분 컷 가능했을듯...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 접근법은 모든 숫자를 3의 배수로? 표현해서 수학적으로 접근했어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 모든 가로, 세로의 길이는 3n, 3n+1, 3n+2로 표현이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럴경우, 두 변의 길이의 합이 3의 배수가 될 수 있는 경우는 2가지 경우밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1. 3n + 3n = 3n&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2. 3n+1 + 3n+2 = 3n + 3 = 3n&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합이 3의 배수일 때, 곱을 구해보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1. 9n^2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2. 9n^2 + 9n + 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번의 경우는 모두 9의 배수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번의 경우는 3으로 나누었을 때 2가 남는 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 입력 N이 주어졌을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9의 배수이거나, 3으로 나누었을 때 2가 남는지를 확인하면 바로 확인이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 O(1)*T이므로 시간을 만족하면서 정답을 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;import&lt;/span&gt;&amp;nbsp;sys&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;_&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;int&lt;/span&gt;(sys.stdin.readline())):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;int&lt;/span&gt;(sys.stdin.readline())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;N&amp;nbsp;%&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;9&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;or&lt;/span&gt;&amp;nbsp;N&amp;nbsp;%&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;3&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;2&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'TAK'&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;else&lt;/span&gt;:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;'NIE'&lt;/span&gt;)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <author>H JAY</author>
      <guid isPermaLink="true">https://0902.tistory.com/64</guid>
      <comments>https://0902.tistory.com/64#entry64comment</comments>
      <pubDate>Sun, 2 Jan 2022 19:21:14 +0900</pubDate>
    </item>
    <item>
      <title>백준 / 1393 / 음하철도 구구팔 / 파이썬, python, pypy</title>
      <link>https://0902.tistory.com/63</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2324&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/seOij/btrlIc61pWD/KCDXTaQzaouZ5fod2Xsy40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/seOij/btrlIc61pWD/KCDXTaQzaouZ5fod2Xsy40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/seOij/btrlIc61pWD/KCDXTaQzaouZ5fod2Xsy40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FseOij%2FbtrlIc61pWD%2FKCDXTaQzaouZ5fod2Xsy40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2324&quot; height=&quot;1780&quot; data-origin-width=&quot;2324&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1637485949772&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;1393번: 음하철도 구구팔&quot; data-og-description=&quot;첫번째 줄에는 xs와 ys가 주어진다. 이는 정류장의 위치가 (xs, ys)임을 의미한다. 두번째 줄에는 xe, ye, dx, dy가 주어진다. 이는 현재 열차 위치가 (xe, ye)이고, 열차가 1초마다 x가 증가하는 방향으로 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1393&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1393&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dSC5xt/hyMqXIkIaR/w9XBR87baIWrBWRvkHjqr1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1393&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1393&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dSC5xt/hyMqXIkIaR/w9XBR87baIWrBWRvkHjqr1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1393번: 음하철도 구구팔&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫번째 줄에는 xs와 ys가 주어진다. 이는 정류장의 위치가 (xs, ys)임을 의미한다. 두번째 줄에는 xe, ye, dx, dy가 주어진다. 이는 현재 열차 위치가 (xe, ye)이고, 열차가 1초마다 x가 증가하는 방향으로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 문제를 보고 한 점(xs, ys)에서 선분(xe, ye와 xe+dx, ye+dy를 지나는)까지의 최단거리를 구하려했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 골드 5 난이도보단 높은 듯 하여, 브루트포스 방법을 생각하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;distance(curx, cury) &amp;lt; distance(curx+dx, cury+dy)일때 계속 curx, cury에 dx, dy를 더해주면서 반복하면서 구하려 하였는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 예제를 보면 3, 3이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 1초 단위로 움직이는게 아니라 연속적인 이동 중에 체크를 해야하는데, dx, dy는 항상 정수라는 힌트가 주어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 dx, dy의 최대공약수(GCD)를 구한 뒤 dx //= gcd(dx, dy), dy //= gcd(dx, dy)를 한 뒤,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복문에 조건을 같게 설정하면 쉽게 답을 구할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 골드 5 치고 브루트포스로 하면 쉽게 풀수있다고 생각해서 골드문제가 맞나? 라는 생각을 하였는데, 한가지 트릭을 넣어서 난이도를 높힌듯하다... (그러나 그래도 실버1,2 정도 수준이지 않나.. 라고 생각된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 코드 중 get_gcd()의 경우 math.gcd()를 사용해도 되지만, 원리를 아는게 중요하여 한번 더 복습을 위해 추가하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, math.sqrt를 **0.5로 사용해도 같으므로, import math도 제거하면 더 깔끔한 코드를 얻을 수 있다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0px; padding: 0px; border: none; background-color: #272727; border-radius: 4px; height: 452px;&quot; width=&quot;941&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f; width: 29.3281px;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0px; text-align: left; width: 894.953px;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;import&lt;/span&gt;&amp;nbsp;sys&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;import&lt;/span&gt;&amp;nbsp;math&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;get_gcd(a,&amp;nbsp;b):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;while&lt;/span&gt;&amp;nbsp;b:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a,&amp;nbsp;b&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;b,&amp;nbsp;a%b&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;a&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;check_distance(x,&amp;nbsp;y):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;math.sqrt((x&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&amp;nbsp;xs)&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;2&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&amp;nbsp;(y&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&amp;nbsp;ys)&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;2&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;xs,&amp;nbsp;ys&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;map(&lt;span style=&quot;color: #4be6fa;&quot;&gt;int&lt;/span&gt;,&amp;nbsp;sys.stdin.readline().split())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;xe,&amp;nbsp;ye,&amp;nbsp;dx,&amp;nbsp;dy&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;map(&lt;span style=&quot;color: #4be6fa;&quot;&gt;int&lt;/span&gt;,&amp;nbsp;sys.stdin.readline().split())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;d_gcd&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;get_gcd(dx,&amp;nbsp;dy)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;dx,&amp;nbsp;dy&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;dx&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;/&lt;/span&gt;d_gcd,&amp;nbsp;dy&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;/&lt;/span&gt;d_gcd&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;curx,&amp;nbsp;cury&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;xe,&amp;nbsp;ye&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;while&lt;/span&gt;&amp;nbsp;check_distance(curx,&amp;nbsp;cury)&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;check_distance(curx&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&amp;nbsp;dx,&amp;nbsp;cury&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&amp;nbsp;dy):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curx&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;dx&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cury&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;dy&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(curx,&amp;nbsp;cury)&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0px 2px 4px 0px; width: 0.71875px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <category>1393</category>
      <category>GCD</category>
      <category>백준</category>
      <category>음하철도 구구팔</category>
      <category>최대공약수</category>
      <author>H JAY</author>
      <guid isPermaLink="true">https://0902.tistory.com/63</guid>
      <comments>https://0902.tistory.com/63#entry63comment</comments>
      <pubDate>Sun, 21 Nov 2021 18:20:05 +0900</pubDate>
    </item>
    <item>
      <title>맥 마이그레이션 타임머신 오류 (Error of Migration using Time Machine)</title>
      <link>https://0902.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;OS 업그레이드 과정에서 많은 사람들이 이와 같은 증상이나 경험을 할 수 있다고 생각하였고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제대로 대처하지 않는 애플은 빅서 게이트때나 지금이나 너무하다고 생각하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제대로 된 해결책 제시 또는 매뉴얼을 보유하였다면 쉽게 해결할 수 있음에도 많은 시간을 소모하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실제 오류의 원인은 몬테레이(OS)의 문제로,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;외장하드에 있는 빅서 타임머신 이미지를 몬테레이에서 마이그레이션 기능으로 복원할 수 없습니다. (일부 맥에서만 발생할 수 있음)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그러나 버전을 빅서로 다운그레이드 시 바로 기능이 정상적으로 작동합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(다운그레이드 및 마이그레이션 방법은 다른 블로그 또는 공식 문서에 잘 정리되어 있으므로 따로 적진않겠습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;========================================================================================&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(여기부터는 제가 겪은 상황으로 문제의 해결법과는 상관 없습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얼마 전 맥북 프로 나비식 키보드 교체 프로그램으로 키보드를 수리 받으며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플의 대응과 수리 방식에 대해 안좋은 감정을 가지게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번의 수리 이후 시스템 오류로 인해 약 2일간 20시간 이상 컴퓨터를 복원하려하였고, 직접 구글링을 하며 해결할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 수리 과정에서 매우 불쾌한 경험을 겪게 되었고, 다른 피해자분들은 시간을 낭비하지 않도록 내용을 정리하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 나비식 키보드 2회 수리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 캡스락이 10회에 1,2번 인식되지 않아 애플 가로수길 방문 및 수리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 수리된 키보드는 100번중 90번 이상 캡스락이 눌리지 않아 재 수리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; &lt;b&gt;지니어스분 말로는 나비식 키보드의 특징으로, 한국 키보드는 캡스락이 문제가 많다고 함. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 영문 자판의 경우 커맨드나 스페이스의 문제가 많고, 재 수리하여도 똑같은 증상이 있을 확률이 높다고 함. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 캡스락이 일반 키캡보다 길어 끝이나 살살 눌렀을때 인식이 제대로 되지 않는게 이유라고 하였지만, &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 더 길이가 긴 스페이스, 쉬프트,리턴 키등은 더 살살 모서리를 눌러도 정확하게 인식 됨&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 말도 안되는 정보를 알려주고, 처음부터 포맷을 하려고 한듯한 느낌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - &lt;b&gt;수리를 위해 맥북의 '나의 찾기' 기능을 꺼달라고 요청 (첫번째 수리에서는 나의 찾기를 꺼달라는 요청도 하지 않음)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 첫번째 수리를 맡길 때, 현재 OS 버전을 물어봤고, 혹시 모르는 일이지만 포맷될 확률은 1프로정도밖에 안된다고 하였음.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 그러나 두번째 수리에서는 OS 버전을 물어보지도 않고, 실제로 수리 후 몬테레이로 설치되어 있었음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 시스템 문제로 마이그레이션으로 타임머신 복원 기능을 사용할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 마이그레이션 -&amp;gt; 타임머신으로 복원 -&amp;gt; 타임머신 이미지 선택 -&amp;gt; 계속 버튼을 눌러도 진행되지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 애플 지원을 통해 수차례 상담을 받으며 해결하려 하였지만, 실제로 원인을 모르며 해결되지 않는 방법들만 제시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - &lt;b&gt;OS 문제로 의심되어 다운그레이드를 요청하였는데, 약 4만원 이상의 요금이 발생할 수 있다고 함.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; (실제로 네이버 맥쓰사 카페를 찾아보면 같은 증상으로 센터를 방문하여 OS 설치 비용을 지불한분이 계심)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 구글링 및 다양한 방법을 시도하고, 애플과 상관없이 해결할 수 있었음&lt;/p&gt;</description>
      <category>리뷰/기타</category>
      <category>bigsur</category>
      <category>migration</category>
      <category>Monterey</category>
      <category>Time Machine</category>
      <category>마이그레이션</category>
      <category>맥</category>
      <category>몬테레이</category>
      <category>빅서</category>
      <category>오류</category>
      <category>타임머신</category>
      <author>H JAY</author>
      <guid isPermaLink="true">https://0902.tistory.com/62</guid>
      <comments>https://0902.tistory.com/62#entry62comment</comments>
      <pubDate>Mon, 15 Nov 2021 20:13:22 +0900</pubDate>
    </item>
    <item>
      <title>백준 / 2150 / Strongly Connected Component / 파이썬, python, pypy</title>
      <link>https://0902.tistory.com/61</link>
      <description>&lt;figure id=&quot;og_1633779164676&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;2150번: Strongly Connected Component&quot; data-og-description=&quot;첫째 줄에 두 정수 V(1 &amp;le; V &amp;le; 10,000), E(1 &amp;le; E &amp;le; 100,000)가 주어진다. 이는 그래프가 V개의 정점과 E개의 간선으로 이루어져 있다는 의미이다. 다음 E개의 줄에는 간선에 대한 정보를 나타내는 두 정&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2150&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2150&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eCqgo/hyLUvZhJI8/XW7U2VhKgPKlHOrDEK5Yy1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2150&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2150&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eCqgo/hyLUvZhJI8/XW7U2VhKgPKlHOrDEK5Yy1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2150번: Strongly Connected Component&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 두 정수 V(1 &amp;le; V &amp;le; 10,000), E(1 &amp;le; E &amp;le; 100,000)가 주어진다. 이는 그래프가 V개의 정점과 E개의 간선으로 이루어져 있다는 의미이다. 다음 E개의 줄에는 간선에 대한 정보를 나타내는 두 정&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Strongly Connected Component(SCC)에 대한 개념이 부족하여 찾아보았는데,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SCC는 결국 시작지점으로 돌아올 수 있는 노드집합 == 사이클 여부로 이해하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SCC 알고리즘은 크게 Kosaraju 알고리즘과 Tarjan 알고리즘이 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두개의 알고리즘을 이해하려 하였을 때, Kosaraju 알고리즘이 더 이해하기 쉽고, 구현도 쉬울 것 같아서 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Kosaraju 알고리즘 동작 방식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kosaraju 알고리즘을 사용하려면 순방향 그래프와 역방향 그래프가필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 정방향 그래프를 사용하여 모든 노드에서 dfs를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 이때 dfs가 끝나는 순서대로 stack에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. stack에서 pop을 하면서 역방향 그래프를 사용하여 dfs를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - pop된 노드가 이미 방문된 노드라면 실행할 필요 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 이때는 순서 상관없이 dfs를 통해 사용되는 모든 노드를 같은 SCC로 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. stack에 있는 모든 노드를 체크하면 모든 SCC를 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;찾아보던 중 그림으로 잘 표현된 블로그가 있어 참고하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #444444;&quot;&gt;(&lt;/span&gt;&lt;a href=&quot;https://ca.ramel.be/166?category=935131&quot;&gt;https://ca.ramel.be/166?category=935131)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedshHG%2Fbtq9gRmHQyc%2Fc7kzrXVfIHYDUIZbNeKiL0%2Fimg.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;336&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VtkbM/btrhgjPV7A0/5xCfqCsAERD4yE6RMttJ61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VtkbM/btrhgjPV7A0/5xCfqCsAERD4yE6RMttJ61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VtkbM/btrhgjPV7A0/5xCfqCsAERD4yE6RMttJ61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedshHG%2Fbtq9gRmHQyc%2Fc7kzrXVfIHYDUIZbNeKiL0%2Fimg.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;336&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 노드에서 부터 시작하여 dfs 알고리즘으로 탐색해나간다면 가장 먼저 5에서 진행할 수 있는 노드가 없어 dfs 가 종료되게 된다. 따라서 5와 4의 순서대로 스택에 쌓이게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGZV71%2Fbtq9fWB49Lb%2FGhZ1WuVEvIiIkJfa87bAFk%2Fimg.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;336&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9qwJj/btrhh8m6xy5/Rzbp1rKunTLowIt7h2tYSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9qwJj/btrhh8m6xy5/Rzbp1rKunTLowIt7h2tYSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9qwJj/btrhh8m6xy5/Rzbp1rKunTLowIt7h2tYSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGZV71%2Fbtq9fWB49Lb%2FGhZ1WuVEvIiIkJfa87bAFk%2Fimg.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;336&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 dfs 탐색을 계속해나아간다면 아래와 같은 stack을 구할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQyGU%2Fbtq9fligDgv%2FTYjiJQ0ZeISTMDqHfyNGEk%2Fimg.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;336&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yATeW/btrhfy7D3oS/cAJilViIsgNcpptlen08dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yATeW/btrhfy7D3oS/cAJilViIsgNcpptlen08dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yATeW/btrhfy7D3oS/cAJilViIsgNcpptlen08dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQyGU%2Fbtq9fligDgv%2FTYjiJQ0ZeISTMDqHfyNGEk%2Fimg.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;336&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 역방향 그래프를 이용하여 stack 에서 pop 되는 요소 순서대로 역방향 dfs 를 진행하게 된다. 아래 그림과 같이 stack 에서 가장 먼저 1번 노드가 pop 되게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqRUuS%2Fbtq9jvpVXbc%2FOJHj8V0ctjd8pkkLVe7b6k%2Fimg.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;336&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZYDyN/btrhc1Q0K3n/xENrn2u9Z6y7jq0xWA3U3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZYDyN/btrhc1Q0K3n/xENrn2u9Z6y7jq0xWA3U3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZYDyN/btrhc1Q0K3n/xENrn2u9Z6y7jq0xWA3U3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqRUuS%2Fbtq9jvpVXbc%2FOJHj8V0ctjd8pkkLVe7b6k%2Fimg.png&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;336&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 노드에서 역방향 dfs 를 진행하면 5를 통해 4로 진행하여 1, 5, 4 가 한개의 SCC 로 묶임을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceAJUn%2Fbtq9e5GJ7gL%2F8YRLl73kK3nsqKylMUK09K%2Fimg.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uzx0L/btrhe0ciqlF/LkMtat0wZsOH8xo3J9zWJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uzx0L/btrhe0ciqlF/LkMtat0wZsOH8xo3J9zWJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uzx0L/btrhe0ciqlF/LkMtat0wZsOH8xo3J9zWJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceAJUn%2Fbtq9e5GJ7gL%2F8YRLl73kK3nsqKylMUK09K%2Fimg.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 pop 되는 6번 노드에서는 진행할 수 있는 노드가 없으므로 한개의 노드가 SCC 를 이루게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrMoTA%2Fbtq9fwXUBw2%2F3gAKN7z08WnS8dmRkwc0sk%2Fimg.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K9DjA/btrhd7vT4ig/eqatM1DKy1KLgTupJiCjik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K9DjA/btrhd7vT4ig/eqatM1DKy1KLgTupJiCjik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K9DjA/btrhd7vT4ig/eqatM1DKy1KLgTupJiCjik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrMoTA%2Fbtq9fwXUBw2%2F3gAKN7z08WnS8dmRkwc0sk%2Fimg.png&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 7에서 시작하는 역방향 dfs를 통해 7, 2, 3이 한개의 SCC로 묶이게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlFOhy%2Fbtq9gYsQgjp%2Fr7Y9wXiq2DkKkPlpYeagv0%2Fimg.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zOTIo/btrhhSEt42c/kVN9BKBKmwfM9TMhOYOtiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zOTIo/btrhhSEt42c/kVN9BKBKmwfM9TMhOYOtiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zOTIo/btrhhSEt42c/kVN9BKBKmwfM9TMhOYOtiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlFOhy%2Fbtq9gYsQgjp%2Fr7Y9wXiq2DkKkPlpYeagv0%2Fimg.png&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lFOhy/btq9gYsQgjp/r7Y9wXiq2DkKkPlpYeagv0/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;위 그림과 같은 방식으로 동작하며, 백준에서 원하는 출력은 각 SCC가 오름차순, 그리고 SCC 그룹의 시작도 오름차순으로 정렬하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;11&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;12&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;13&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;14&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;15&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;16&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;17&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;18&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;19&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;20&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;21&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;22&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;23&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;24&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;25&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;26&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;27&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;28&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;29&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;30&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;31&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;32&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;33&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;34&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;35&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;36&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;37&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;38&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;39&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;40&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;41&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;42&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;43&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;44&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;45&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;46&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;47&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;48&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;49&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;50&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;51&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;52&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;53&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;54&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;55&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;56&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0; text-align: left;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;import&lt;/span&gt;&amp;nbsp;sys&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;from&lt;/span&gt;&amp;nbsp;collections&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;import&lt;/span&gt;&amp;nbsp;defaultdict,&amp;nbsp;deque&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;sys.setrecursionlimit(&lt;span style=&quot;color: #c10aff;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;6&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;dfs(cur):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;visited.add(cur)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;next&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;forwardGraph[cur]:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;next&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;not&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;visited:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dfs(&lt;span style=&quot;color: #ff3399;&quot;&gt;next&lt;/span&gt;)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stack.append(cur)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;reverseDfs(cur,&amp;nbsp;scc):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;visited.add(cur)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scc.append(cur)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;next&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;reverseGraph[cur]:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;next&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;not&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;visited:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scc&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;reverseDfs(&lt;span style=&quot;color: #ff3399;&quot;&gt;next&lt;/span&gt;,&amp;nbsp;scc)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;scc&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;def&lt;/span&gt;&amp;nbsp;kosaraju():&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;global&amp;nbsp;visited&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #999999;&quot;&gt;#&amp;nbsp;정방향&amp;nbsp;그래프를&amp;nbsp;돌면서&amp;nbsp;dfs&amp;nbsp;실행&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;V&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;not&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;visited:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dfs(i)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;visited&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;set()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;while&lt;/span&gt;&amp;nbsp;stack:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scc&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cur&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;stack.pop()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;if&lt;/span&gt;&amp;nbsp;cur&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;visited:&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer.append(sorted(reverseDfs(cur,&amp;nbsp;scc)))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;return&lt;/span&gt;&amp;nbsp;answer&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;V,&amp;nbsp;E&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;map(&lt;span style=&quot;color: #4be6fa;&quot;&gt;int&lt;/span&gt;,&amp;nbsp;sys.stdin.readline().split())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;forwardGraph&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;defaultdict(list)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;reverseGraph&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;defaultdict(list)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;_&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;range&lt;/span&gt;(E):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;A,&amp;nbsp;B&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;map(&lt;span style=&quot;color: #4be6fa;&quot;&gt;int&lt;/span&gt;,&amp;nbsp;sys.stdin.readline().split())&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;forwardGraph[A].append(B)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reverseGraph[B].append(A)&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;stack&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;[]&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;visited&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;set()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;answer&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;kosaraju()&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #4be6fa;&quot;&gt;len&lt;/span&gt;(answer))&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;for&lt;/span&gt;&amp;nbsp;line&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;in&lt;/span&gt;&amp;nbsp;sorted(answer):&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;print&lt;/span&gt;(&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;line,&amp;nbsp;sep&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'&amp;nbsp;'&lt;/span&gt;,&amp;nbsp;end&amp;nbsp;&lt;span style=&quot;color: #0086b3;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ffd500;&quot;&gt;'&amp;nbsp;-1\n'&lt;/span&gt;)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>2150</category>
      <category>Kosaraju</category>
      <category>scc</category>
      <category>Strongly Connected Component</category>
      <category>백준</category>
      <author>H JAY</author>
      <guid isPermaLink="true">https://0902.tistory.com/61</guid>
      <comments>https://0902.tistory.com/61#entry61comment</comments>
      <pubDate>Sat, 9 Oct 2021 20:43:15 +0900</pubDate>
    </item>
  </channel>
</rss>