<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ALiNew</title>
    <link>https://alinew.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 19 Aug 2026 18:11:13 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ALiNew</managingEditor>
    <item>
      <title>[Algo Rhythm ] 프로그래머스 - 기지국 설치</title>
      <link>https://alinew.tistory.com/111</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아파트의 개수를 $n\ (1 \le n \le 2 \times 10^8)$, 현재 기지국이 설치된 아파트의 번호가 담긴 1차원 배열을 $S\ (1 \lt \left\vert S \right\vert \lt 10^4,\ S는\ 오름차순\ 정렬)$, $S$에 속하는 각 기지국을 $s_i\ (1 \le s_i \le n,\ 1 \le i \le \left\vert S \right\vert )$, 전파의 도달 거리를 $w(1 \le w \le 10^4)$, 한 기지국이 전파를 전달할 수 있는 기지국들의 최개 개수를 $d\ (=2 \times w + 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;현재 설치된 기지국 $s_i$의 전파 전달 범위를 $rcvd_i$라고 할 때, $rcvd_i$는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\begin{matrix} rcvd_i &amp;amp;=&amp;amp; \left[\ left_i,right_i\ \right] \\ &amp;amp;=&amp;amp; \left[\ \max(1, s_i - w),\min(n, s_i + w)\ \right] \end{matrix}$&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;우린 $rcvd_i$를 통해 기지국이 설치되지 않고 연속된 아파트들의 개수 $L_j$를 알 수 있는데 그것은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$L_j = pos - left_i\ (pos : 연속된\ 아파트\ 중\ 첫\ 아파트의\ 번호,\ 0\le j \le i + 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;또한 우린 $L_j$을 통해 연속된 모든 아파트에 전파를 전달하기 위해 증설해야 하는 기지국 개수의 최솟값인 $N_{stn_j}$를 알 수 있는데 그것은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$N_{stn_j} = \begin{cases} 1 &amp;amp;if\ 0 \lt L_j \lt d\ \\\ulcorner {L_j \over d} \urcorner&amp;amp;else\end{cases}​$&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 아파트에 전파를 전달하기 위해 증설해야 할 기지국 개수의 최솟값 $ans$는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ans = \sum N_{stn_j}$&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;$rcvd_i$를 하나씩 순회하며 $N_{stn_j}$를 구한 뒤 더하면 될 것 같지만 주의해야 할 점이 하나 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것은 바로 아래와 같이 마지막 $rcvd_i$의 $right_i$가 $n$보다 작은 경우이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1872&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pJPwE/btrMU5mMOVw/RAYEsU4mJrVU5hCLFUSKR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pJPwE/btrMU5mMOVw/RAYEsU4mJrVU5hCLFUSKR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pJPwE/btrMU5mMOVw/RAYEsU4mJrVU5hCLFUSKR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpJPwE%2FbtrMU5mMOVw%2FRAYEsU4mJrVU5hCLFUSKR0%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;1872&quot; height=&quot;382&quot; data-origin-width=&quot;1872&quot; data-origin-height=&quot;382&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;이 경우 마지막 $N_{stn_j}$를 구할 수 없기 때문에 $rcvd$에 $\left[\ n+1,n+1\ \right]$라는 가상의 전파 전달 범위를 추가한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨복잡도 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$S$와 $rcvd$의 크기를 $n\ (1 \lt n \lt 10^4)$, 이라고 할 때, 시간 복잡도와 공간 복잡도는 다음과 같다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏰시간 복잡도 : $O(n)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$rcvd$ 구하기 : $O(n)$&lt;/li&gt;
&lt;li&gt;$\sum N_{stn_j}$ 계산 : $O(n)$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 공간 복잡도 : $O(n)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$S,\ rcvd$ 저장 : $O(n)$&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 코드&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/2266a518e90bb1ed3afdb33e5f873398.js&quot;&gt;&lt;/script&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12979&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12979&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algo Rhythm /Programmers</category>
      <category>Algo Rhythm</category>
      <category>implementation</category>
      <category>programmers</category>
      <category>기지국 설치</category>
      <category>알고리즘</category>
      <category>프로그래머스</category>
      <author>ALiNew</author>
      <guid isPermaLink="true">https://alinew.tistory.com/111</guid>
      <comments>https://alinew.tistory.com/111#entry111comment</comments>
      <pubDate>Sat, 24 Sep 2022 16:51:25 +0900</pubDate>
    </item>
    <item>
      <title>[Algo Rhythm ] 프로그래머스 - 숫자 게임</title>
      <link>https://alinew.tistory.com/110</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A 팀원들이 부여받은 수가 출전 순서대로 나열되어있는 배열을&amp;nbsp;$A$, i번째 원소가 B팀의 i번 팀원이 부여받은 수를 의미하는 배열을 $B$라고 하자.&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;이때 두 배열의 원소 $a_i, b_i$, 배열의 크기 $L$은 아래와 같이 정의할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$1 \le L = \left\vert A \right\vert = \left\vert B \right\vert \le 10^5$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$1 \le a_i, b_i \le 10^9 (a_i \in A, b_i \in B, i \in \left[ 1, L \right])$&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;A팀은 출전 순서가 이미 고정되어 있다. 따라서 B팀이 최대 승점을 얻기 위해서는 각 $a_i$를 패배할 수 있는 즉, $a_i &amp;lt; b_i$ 조건을 만족하는 가장 작은 $b_i$와 매칭하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 분석에서 언급했듯이 우리는 각 $a_i$를 $a_i \lt b_i$를 만족하는 가장 작은 $b_i$와 매칭해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 간단하게 모든 $b_i$를 일일이 살펴보는 방법도 가능하다. 하지만 $B$를 정렬한 뒤 binary search를 이용하면 더 빠르게 매칭할 수 있다.&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;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$B$를 오름차순으로 정렬&lt;/li&gt;
&lt;li&gt;모든 $a_i$에 대하여 다음 과정 실행
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;binary search를 통해 $a_i \lt b_i$를 만족하는 가장 작은 $b_i$ 찾기&lt;/li&gt;
&lt;li&gt;찾으면 승점에 1점을 추가하고 해당 $b_i$를 다음 과정에서 제외&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨복잡도 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 배열 $A, B$의 크기를 $n$이라고 하자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏰시간 복잡도 : $O(n\log n)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$B$ 정렬 : $O(n \log n)$&lt;/li&gt;
&lt;li&gt;모든 $a_i$에 대하여 binary search로 $a_i \lt b_i$를 만족하는 가장 작은 $b_i$ 찾기 : $O(n \log n)$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 공간 복잡도 : $O(n)$&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 코드&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/59a1f7107a430c127e727ca2bcfde78c.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12987&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/12987&lt;/a&gt;&lt;/p&gt;</description>
      <category>Algo Rhythm /Programmers</category>
      <category>Algorithm</category>
      <category>binary search</category>
      <category>programmers</category>
      <category>숫자게임</category>
      <category>알고리즘</category>
      <category>이분탐색</category>
      <category>프로그래머스</category>
      <author>ALiNew</author>
      <guid isPermaLink="true">https://alinew.tistory.com/110</guid>
      <comments>https://alinew.tistory.com/110#entry110comment</comments>
      <pubDate>Sat, 24 Sep 2022 00:59:32 +0900</pubDate>
    </item>
    <item>
      <title>[Algo Rhythm ] BOJ 16926 - 배열 돌리기 1</title>
      <link>https://alinew.tistory.com/109</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기가 $n \times m\ (2 \le n, m \le 300)$ 인 배열 $A$를 반시계 방향으로 $r\ (1 \le r \le 1,000)$번 회전한 결과를 출력하기 위해 먼저 $A$를 관찰해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$A$를 관찰하면 가장 바깥 층부터 가장 안 층까지 아래 그림과 같이 재귀적인 관계가 있음을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;1440&quot; width=&quot;354&quot; height=&quot;405&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FgzxP/btrb5nq5RWd/34Zz7Gv8RKHKkhSz1orcwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FgzxP/btrb5nq5RWd/34Zz7Gv8RKHKkhSz1orcwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FgzxP/btrb5nq5RWd/34Zz7Gv8RKHKkhSz1orcwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFgzxP%2Fbtrb5nq5RWd%2F34Zz7Gv8RKHKkhSz1orcwK%2Fimg.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;1440&quot; width=&quot;354&quot; height=&quot;405&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번 회전할 때 $(1, 1)$에 있는 값을 시작으로 값을 아래로 옮기는 것을 $(n - 1)$번, 오른쪽으로 옮기는 것을 $(m-1)$번 , 위로 옮기는 것을 $(n-1)$번, 왼쪽으로 옮기는 것을 $(m-1)$번 반복해야 한다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기가 $n \times m$인 배열 $A$를 반시계 방향으로 1회 회전하는 함수 $rotate$는 다음과 같다.&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;$rotate(n, m, start_x, start_y)= \begin{cases} nothing &amp;amp; if\ n = 0\ or\ m = 0\\ rotate(n - 2, m - 2, start_x + 1, start_y + 1) &amp;amp; else \end{cases}$&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;또한 $rotate$ 실행시 $(start_x, start_y)$에 있는 값을 시작으로 값을 아래로 옮기는 것을 $(n-1)$번, 오른쪽으로 옮기는 것을 $(m - 1)$번, 위로 옮기는 것을 $(n - 1)$번, 왼쪽으로 옮기는 것을 $(m - 1)$번 반복해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨복잡도 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기가 $n \times m$인 배열 $A$를 반시계 방향으로 $r$번 회전할 때 시간 복잡도와 공간 복잡도는 각각 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏰시간 복잡도 : $O(nmr)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$A$를 저장하는데 $O(nm)$이 소요됨.&lt;/li&gt;
&lt;li&gt;$A$를 반시계 방향으로 회전하면 $O(nm)$이 소요됨.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 과정을 $r$번 반복하면 $O(nmr)$이 소요됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$r$번 회전한 $A$를 출력하는데 $O(nm)$이 소요됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 공간 복잡도 : $O(nm)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A를 저장하는데 $O(nm)$이 소요됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 코드&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/ac1a578bbe528da7c1cc69c192b23119.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/16926&quot;&gt;https://www.acmicpc.net/problem/16926&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1628943085197&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;16926번: 배열 돌리기 1&quot; data-og-description=&quot;크기가 N&amp;times;M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] &amp;larr; A[1][2] &amp;larr; A[1][3] &amp;larr; A[1][4] &amp;larr; A[1][5] &amp;darr; &amp;uarr; A[2][1] A[2][2] &amp;larr; A[2][3] &amp;larr; A[2][4] A[2][5] &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/16926&quot; data-og-url=&quot;https://www.acmicpc.net/problem/16926&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JyfWc/hyLerLapHY/o7wSG5kQhJ5JrdfpeFroRK/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/16926&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/16926&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JyfWc/hyLerLapHY/o7wSG5kQhJ5JrdfpeFroRK/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;16926번: 배열 돌리기 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;크기가 N&amp;times;M인 배열이 있을 때, 배열을 돌려보려고 한다. 배열은 다음과 같이 반시계 방향으로 돌려야 한다. A[1][1] &amp;larr; A[1][2] &amp;larr; A[1][3] &amp;larr; A[1][4] &amp;larr; A[1][5] &amp;darr; &amp;uarr; A[2][1] A[2][2] &amp;larr; A[2][3] &amp;larr; A[2][4] A[2][5]&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;</description>
      <category>Algo Rhythm /BOJ</category>
      <category>BOJ16926</category>
      <category>구현</category>
      <category>배열돌리기1</category>
      <category>백준</category>
      <category>알고리즘</category>
      <author>ALiNew</author>
      <guid isPermaLink="true">https://alinew.tistory.com/109</guid>
      <comments>https://alinew.tistory.com/109#entry109comment</comments>
      <pubDate>Sat, 14 Aug 2021 21:12:35 +0900</pubDate>
    </item>
    <item>
      <title>[Algo Rhythm ] BOJ 2225 - 합분해</title>
      <link>https://alinew.tistory.com/108</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력으로 주어지는 두 정수를 각각 $N,K\ (1\le N,K \le 200)$라고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 0부터 N까지의 정수 K개를 더해서 그 합이 N이 되는 경우의 수를 $f(N,K)$라고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 N을 만들기 위해 더해지는 K개의 정수들을 순서대로 $I_1, I_2, ..., I_K$라고 하자.&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;$f(N,K)$의 규칙을 파악하기 위해 $f(2, 3)$를 구하는 과정을 분석해보자. $f(2, 3)$은 아래와 같이 6이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 $I_1$과 나머지 $I_2, I_3$의 관계를 파악해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$I_1 = 0$ 일때 $I_2, I_3$를 구하는 것은 $f(2, 2)$을 구하는 것과 같다. (1이 적힌 파란 원으로 표시함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$I_1 = 1$ 일때 $I_2, I_3$를 구하는 것은 $f(1,2)$를 구하는 것과 같다. (2가 적힌 파란 원으로 표시함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$I_1 = 2$ 일때 $I_2, I_3$를 구하는 것은 $f(0, 2)$를 구하는 것과 같다. (3이 적힌 파란 원으로 표시함)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;1280&quot; data-filename=&quot;KakaoTalk_Photo_2021-07-22-21-55-31.jpeg&quot; width=&quot;425&quot; height=&quot;662&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ7dke/btraiwB2dmf/Ua9MpQSxiOrRKE99TwXSi0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ7dke/btraiwB2dmf/Ua9MpQSxiOrRKE99TwXSi0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ7dke/btraiwB2dmf/Ua9MpQSxiOrRKE99TwXSi0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ7dke%2FbtraiwB2dmf%2FUa9MpQSxiOrRKE99TwXSi0%2Fimg.jpg&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;1280&quot; data-filename=&quot;KakaoTalk_Photo_2021-07-22-21-55-31.jpeg&quot; width=&quot;425&quot; height=&quot;662&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뿐만 아니라 다른 경우들을 분석하면 $N = 0$이거나 $K = 1$ 일때 $f(N, K) = 1$ 임을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 종합하면 $f(N, K)$는 다음과 같다는 사실을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f(N, K)= \begin{cases} 1 &amp;amp; if\ N = 0\ or\ K = 1\\ \sum_{i=0}^N f(N - i, K - 1) \mod 10^9 &amp;amp; else \end{cases}$&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f(n, k)\ (1 \le n \le N,\ 1 \le k \le K)$를 저장하는 배열을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 bottom-up 방식으로 $f(n,k)$를 구하는데 그 때 쓰이는 점화식은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f(N, K)= \begin{cases} 1 &amp;amp; if\ N = 0\ or\ K = 1\\ \sum_{i=0}^N f(N - i, K - 1) \mod 10^9 &amp;amp; else \end{cases}$&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨복잡도 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력으로 두 정수 $N,K\ (1\le N,K \le 200)$이 주어질 때, 시간 복잡도와 공간 복잡도는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏰시간 복잡도 : $O(N^2K)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bottom-up 방식으로 $f(N, K)$를 구하는데 $O(NK)$가 소모됨.&lt;/li&gt;
&lt;li&gt;solve 함수 실행시 $O(N)$이 소모됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 공간 복잡도 : $O(NK)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$f(N, K)$를 저장하기 위해 $O(NK)$가 소모됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt; &lt;/span&gt;코드&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/099ea8438c2f2d13eb9e8dccdf52c696.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2225&quot;&gt;https://www.acmicpc.net/problem/2225&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626959684049&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;2225번: 합분해&quot; data-og-description=&quot;첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2225&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2225&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bF3XuS/hyKZcl5Plq/Tph0ukrcfq5GsTfLfmPIs0/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/2225&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2225&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bF3XuS/hyKZcl5Plq/Tph0ukrcfq5GsTfLfmPIs0/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;2225번: 합분해&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 답을 1,000,000,000으로 나눈 나머지를 출력한다.&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;</description>
      <category>Algo Rhythm /BOJ</category>
      <category>boj2225</category>
      <category>cpp</category>
      <category>DP</category>
      <category>Dynamic Programming</category>
      <category>백준</category>
      <category>백준 2225</category>
      <category>합분해</category>
      <author>ALiNew</author>
      <guid isPermaLink="true">https://alinew.tistory.com/108</guid>
      <comments>https://alinew.tistory.com/108#entry108comment</comments>
      <pubDate>Thu, 22 Jul 2021 22:15:22 +0900</pubDate>
    </item>
    <item>
      <title>[Algo Rhythm ] BOJ 1463 - 1로 만들기</title>
      <link>https://alinew.tistory.com/107</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 $n\ (1 \le n \le 10^6)$에 대하여 사용가능한 연산들은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$op_1 : n \equiv 0 \pmod{3}이면,\ n = n \div 3$&lt;/li&gt;
&lt;li&gt;$op_2 : n \equiv 0 \pmod{2}이면,\ n = n \div 2$&lt;/li&gt;
&lt;li&gt;$op_3 : n = n - 1$&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 $n$을 1로 만들기 위해 사용하는 연산의 최소 횟수를 $f(n)$이라고 하자.&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$에 대하여 $op_1,\ op_2,\ op_3$을 모두 사용할 수 있을 때 $n$을 1로 만들기 위해 사용하는 연산의 최소 횟수를 각각 $f_1,\ f_2,\ f_3$라고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 $n \equiv 0 \pmod{3}$이면 $op_1$을 사용하여 $n$을 $n \div 3$으로 줄일 수 있기 때문에 $f_1 = f(n \div 3) + 1$이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 $n \equiv 0 \pmod{2}$이면 $op_2$를 사용하여 $n$을 $n \div 2$로 줄일 수 있기 때문에 $f_2 = f(n \div 2 ) + 1$이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 모든 $n$은 $op_3$를 사용하여 $n$을 $n - 1$로 줄일 수 있기 때문에 $f_3 = f(n - 1) + 1$이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, $f(n) = \min(f_1,\ f_2,\ f_3)$이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f(n)$을 점화식으로 표현하면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f(n)= \begin{cases} 0 &amp;amp; if\ n = 1\\ \min(f_1,f_2,f_3) &amp;amp; else \end{cases}$&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨복잡도 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 $n\ (1 \le n \le 10^6)$에 대하여 시간 복잡도와 공간 복잡도는 각각 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏰시간 복잡도 : $O(n)$&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f(i)\ (1 \le i \le n)$을 모두 계산해야 하기 때문에 $O(n)$이 소요됨.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 공간 복잡도 : $O(n)$&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$f(i)\ (1 \le i \le n)$을 저장할 공간이 필요하기 때문에 $O(n)$이 소요됨.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 코드&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/3d33ed67dd3f2f91a825fdd186841e4e.js&quot;&gt;&lt;/script&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;h2 data-ke-size=&quot;size26&quot;&gt; 문제 출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1463&quot;&gt;https://www.acmicpc.net/problem/1463&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1626879661376&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;1463번: 1로 만들기&quot; data-og-description=&quot;첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1463&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1463&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/OhKat/hyKXRXwN1z/v7V9ddXkKH687XAxGtXnG1/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/1463&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1463&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/OhKat/hyKXRXwN1z/v7V9ddXkKH687XAxGtXnG1/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;1463번: 1로 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.&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;</description>
      <category>Algo Rhythm /BOJ</category>
      <category>1로 만들기</category>
      <category>algorhythm</category>
      <category>BOJ</category>
      <category>boj1463</category>
      <category>cpp</category>
      <category>백준</category>
      <category>알고리즘</category>
      <author>ALiNew</author>
      <guid isPermaLink="true">https://alinew.tistory.com/107</guid>
      <comments>https://alinew.tistory.com/107#entry107comment</comments>
      <pubDate>Thu, 22 Jul 2021 00:00:41 +0900</pubDate>
    </item>
    <item>
      <title>[Algo Rhythm ] BOJ 10971 - 외판원 순회 2</title>
      <link>https://alinew.tistory.com/106</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도시들의 수를 $n$, 각 도시를 $C_i\ (1 \le i \le n)$, 그리고 $C_a$에서 $C_b$로 이동하는데 드는 비용을 $W_{a, b}$라고 하자. 이때 $W_{a, b} \ne W_{b, a}$일 수도 있고 $W_{a,b} = 0$ 이면 $C_a$에서 $C_b$로 이동할 수 없다.&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;b&gt;'원순열'&lt;/b&gt;의 형태를 띄기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;966&quot; width=&quot;659&quot; height=&quot;442&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEve4A/btq9goSkjFu/K3bVBVLk7Fd2Euqd6qecC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEve4A/btq9goSkjFu/K3bVBVLk7Fd2Euqd6qecC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEve4A/btq9goSkjFu/K3bVBVLk7Fd2Euqd6qecC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEve4A%2Fbtq9goSkjFu%2FK3bVBVLk7Fd2Euqd6qecC0%2Fimg.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;966&quot; width=&quot;659&quot; height=&quot;442&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 이 문제는 최소 비용을 가진 원순열을 찾는 문제로 이해할 수 있다. 기본적으로 순열을 찾는 문제이기 때문에 backtracking을 사용하여 해결할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 분석에서 언급했듯이 이 문제는 최소 비용을 가진 원순열을 찾는 문제이기 때문에 어떤 도시에서 출발하는가는 중요하지 않다. 따라서, 임의로 출발 도시를 $C_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;그리고나서 나머지 도시들에 대해 backtracking을 실행하는데 다음 depth로 갈 수 있는 기준은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;방문한 적이 없다.&lt;/li&gt;
&lt;li&gt;$W_{src, dest} \ne 0$&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 불필요한 계산을 줄이기 위해 누적 비용이 이미 계산된 최소 비용보다 클 경우 backtracking 실행을 중단했다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨복잡도 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도시들의 수를 $n$이라고 할 때, 시간 복잡도와 공간 복잡도는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏰시간 복잡도 : $O(n!)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최악의 경우 $x\ (1 \le x \le n)$의 도시를 방문한 뒤 $(n - x)$개의 도시들에 대해 backtracking을 실행해야 하기 때문에 $O(n!)$가 소요됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 공간 복잡도 : $O(n^2)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$W_{i, j}\ (1 \le i, j \le n)$을 저장하기 위해 $O(n^2)$가 소요됨.&lt;/li&gt;
&lt;li&gt;$C_i\ (1 \le i \le n)$의 방문여부를 저장하기 위해 $O(n)$이 소요됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 코드&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/20f90422655d4cb064050908cfa770e9.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10971&quot;&gt;https://www.acmicpc.net/problem/10971&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1625847726631&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;10971번: 외판원 순회 2&quot; data-og-description=&quot;첫째 줄에 도시의 수 N이 주어진다. (2 &amp;le; N &amp;le; 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/10971&quot; data-og-url=&quot;https://www.acmicpc.net/problem/10971&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bFOzvr/hyKPqmjhhv/yzt6TjIdSWJr71edu44N00/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/10971&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/10971&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bFOzvr/hyKPqmjhhv/yzt6TjIdSWJr71edu44N00/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;10971번: 외판원 순회 2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 도시의 수 N이 주어진다. (2 &amp;le; N &amp;le; 10) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j&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;</description>
      <category>Algo Rhythm /BOJ</category>
      <category>algorhythm</category>
      <category>backtracking</category>
      <category>BOJ</category>
      <category>boj10971</category>
      <category>TSP</category>
      <category>백트래킹</category>
      <category>알고리즘</category>
      <category>외판원 순회 2</category>
      <category>원순열</category>
      <author>ALiNew</author>
      <guid isPermaLink="true">https://alinew.tistory.com/106</guid>
      <comments>https://alinew.tistory.com/106#entry106comment</comments>
      <pubDate>Sat, 10 Jul 2021 01:22:56 +0900</pubDate>
    </item>
    <item>
      <title>[Algo Rhythm ] BOJ 2529 - 부등호</title>
      <link>https://alinew.tistory.com/105</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 종류의 부등호 기호 &amp;lsquo;&amp;lt;&amp;rsquo;와 &amp;lsquo;&amp;gt;&amp;rsquo;가 $k$개 나열된 순서열을 $A$라고 하자. 그리고 $A$의 $i$번째 순서에 있는 부등호를 $A[i]\ (1 \le i \le k)$, 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자가 들어갈 자리를 $a_i\ (i \in \{x\ |\ 1 \le x \le (k + 1), \ x \in N\})$라고 하자. 예를 들어, 아래와 같은 $A$에 대하여 $A[i]$들과 $a_i$들은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;643&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YzPM8/btq85eJfMC1/O6SnBeKXxoOeWyCTjAKKlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YzPM8/btq85eJfMC1/O6SnBeKXxoOeWyCTjAKKlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YzPM8/btq85eJfMC1/O6SnBeKXxoOeWyCTjAKKlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYzPM8%2Fbtq85eJfMC1%2FO6SnBeKXxoOeWyCTjAKKlK%2Fimg.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;643&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 $a_i$는 다음과 같은 네가지 조건이 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$i \ne j$일 때, $a_i \ne a_j$&lt;/li&gt;
&lt;li&gt;$a_i \in \{x\ |\ 0\le x \le 9, x \in N\}$&lt;/li&gt;
&lt;li&gt;$A[i]$가 '&amp;gt;'이면, $a_i \gt a_{i + 1}$ 이다.&lt;/li&gt;
&lt;li&gt;$A[i]$가 '&amp;lt;'이면, $a_i \lt a_{i + 1}$ 이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 $\min(a_1a_2...a_{k+1})$와 $\max(a_1a_2...a_{k+1})$를 출력할 것을 요구하는데 이를 위해 가능한 모든 $a_1a_2...a_{k+1}$을 확인해야 한다. 따라서, 이 문제는 backtracking을 구현하는 문제로 이해할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\min(a_1a_2...a_{k+1})$와 $\max(a_1a_2...a_{k+1})$을 구하는 함수를 $f(a_1a_2...a_{k+1}, depth)$라고 하자.&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;$f$는 다음과 같다. 이때 $i \ne j$일 때, $a_i \ne a_j$라는 조건을 만족하기 위해 방문 여부를 조회해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;129&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwlWEl/btq84LtNYCN/wI3Rdq83IDm74N0DsK6nrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwlWEl/btq84LtNYCN/wI3Rdq83IDm74N0DsK6nrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwlWEl/btq84LtNYCN/wI3Rdq83IDm74N0DsK6nrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwlWEl%2Fbtq84LtNYCN%2FwI3Rdq83IDm74N0DsK6nrK%2Fimg.png&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;129&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-reactroot=&quot;&quot;&gt;$f(Xa_2...a_{k + 1}, 1)\ (X \in [0, 9])$&lt;/span&gt;를 실행한 뒤 $\min(a_1a_2...a_{k+1})$와 $\max(a_1a_2...a_{k+1})$를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨복잡도 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서열 $A$의 길이를 $k$, $a_i$가 될 수 있는 값들의 개수를 $m$이라고 할 때, 시간 복잡도와 공간 복잡도는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏰시간 복잡도 : $O(m!)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최악의 경우 즉, $A$를 구성하는 모든 부등호들이 같을 경우 $a_{i+1}$를 찾기 위해 재귀 함수를 $m - i$번를 실행하기 때문에 $O(m!)$가 소요됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 공간 복잡도 : $O(k)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$A$를 저장하기 위해 $O(k)$가 소요됨&lt;/li&gt;
&lt;li&gt;$a_i$의 방문여부를 저장하기 위해 $O(k)$가 소요됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt; &lt;/span&gt;코드&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/d68f5c8e47c788f7b2f4390cf9209c27.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2529&quot;&gt;https://www.acmicpc.net/problem/2529&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1625664115721&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;2529번: 부등호&quot; data-og-description=&quot;두 종류의 부등호 기호 &amp;lsquo;&amp;lt;&amp;rsquo;와 &amp;lsquo;&amp;gt;&amp;rsquo;가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2529&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2529&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4FwmJ/hyKNYJY2VN/JtiOhEOAwF7KmPke8OlUFk/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/2529&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2529&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4FwmJ/hyKNYJY2VN/JtiOhEOAwF7KmPke8OlUFk/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;2529번: 부등호&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;두 종류의 부등호 기호 &amp;lsquo;&amp;lt;&amp;rsquo;와 &amp;lsquo;&amp;gt;&amp;rsquo;가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시&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;</description>
      <category>Algo Rhythm </category>
      <category>Algo Rhythm</category>
      <category>Algorithm</category>
      <category>backtracking</category>
      <category>boj2529</category>
      <category>백준 부등호</category>
      <category>알고리즘</category>
      <author>ALiNew</author>
      <guid isPermaLink="true">https://alinew.tistory.com/105</guid>
      <comments>https://alinew.tistory.com/105#entry105comment</comments>
      <pubDate>Wed, 7 Jul 2021 22:23:34 +0900</pubDate>
    </item>
    <item>
      <title>유클리드 알고리즘 - 두 수의 최대공약수는? </title>
      <link>https://alinew.tistory.com/104</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; Intro&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;치맥의 고장인 맥치마을에서는 매년 치맥축제 를 엽니다. 올해는 축제를 위해 치킨 4,500마리 와 맥주 7,500잔 을 준비했습니다. 이것들을 최대한 많은 사람들에게 남김없이 똑같이 나누어 주려고 할 때, 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️⃣번 문제의 답은 4,500과 7,500의 &lt;b&gt;'최대 공약수(Greatest Common Divisor)'&lt;/b&gt;인 150명입니다. 또한 2️⃣번 문제의 답은 치킨 4,500마리와 맥주 7,500잔을 최대 공약수인 150으로 나눈 3마리와 5잔입니다. (한 사람당 치킨 세 마리 와 맥주 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;그렇다면 만약 n년 후 치맥축제 가 전세계적으로 대박이 나면서 치킨 9,876,543마리 와 맥주 3,456,789잔 를 준비한다고 할 때, 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;아마 바로 답을 구하긴 어려우실 것 같은데요. 컴퓨터가 대신 구해보게 하는 것 어떨까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 최대 공약수 구하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 정수 $a,\ b\ (a \gt b)$의 최대 공약수를 $\gcd(a, b)$라고 합시다. $\gcd(a, b)$를 컴퓨터로 어떻게 구할 수 있을까요?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Brute-force  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 먼저 무식하게 구하는 방법이 있습니다. $\gcd(a, b)$는 1부터 $b$ 중 $a,\ b$ 모두와 나누어 떨어지는 가장 큰 수입니다. 따라서 1부터 $b$까지 차례로 증가하며 $a,\ b$ 모두와 나누어 떨어지는지 확인하면 됩니다.&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(b)$입니다.&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/6a86dbecae59308bffa3123cc9d74c1d.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 공약수의 성질 이용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 우아하게 수학 을 이용해볼까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공약수의 성질 중 하나는 &lt;b&gt;'두 정수 $a,\ b\ (a \gt b)$의 공약수의 집합은 $a - b$와 $b$의 공약수 집합과 같다'&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;$pf.\\ a,\ b의 공약수\ g가\ 있다고\ 하자.\\그렇다면\ a = a'g, \ b = b'g라고\ 할\ 수\ 있다.\\\ \\이때,\ a-b = (a'-b')g\ 이므로\\ a,\ b의\ 공약수의\ 집합은\ a - b와\ b의\ 공약수의\ 집합과\ 같다.$&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;script src=&quot;https://gist.github.com/SukJinKim/5ce4082c88de111b02780e83fe6a349f.js&quot;&gt;&lt;/script&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 = a + b$라고 할 때, $O(n)$입니다. 왜냐하면 $\gcd(a, b)$는 최대 $a+b$번 반복하기 때문인데 다음과 같이 증명할 수 있습니다. 간단하게는 최악의 경우 즉, $gcd(a, 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;$pf.\\두 \ 정수 \ a,\ b(a\gt b)에\ 대하여\\\gcd(a, b) = \gcd(a-b, b) = \gcd(a', b')라고\ 하자.\\\ \\이때\ 다음와\ 같은\ 관계가\ 성립한다.\\\begin{cases} a' = a-b\\ b' = b \end{cases}\\\ \\그리고\ a'+b' = a \lt a+b\ 이다.\\따라서\ \gcd(a, b)는\ 최대\ a+b번\ 반복한다.$&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;h2 data-ke-size=&quot;size26&quot;&gt; 유클리드 알고리즘&lt;/h2&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;$두\ 정수\ a,\ b\ (a\gt b)에\ 대하여\ \gcd(a,\ b) = \gcd(b,\ a \mod b)이다.$&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;$pf.\\r = a\mod b,\ a = b \times t + r\ (t \in Z)라고 \ 하자.\\\ \\Case\ 1.\ d = \gcd(a, b)일때,\ d \mid (b \times t + r)이고\ d \mid b이다.\\따라서,\ d \mid r이다.\ 그러므로,\ \gcd(a, b) = \gcd(b, r)이다.\\\ \\Case\ 2.\ c = \gcd(b, r)일때,\ c \mid b이고\ c \mid r이다.\\따라서,\ c \mid a이다.\ 그러므로,\ \gcd(b, r) = \gcd(a, b)이다.\\\ \\따라서, \gcd(a, b) = \gcd(b, r)이다.$&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;script src=&quot;https://gist.github.com/SukJinKim/7420e4bfdaa0548a671f87f85b52f6fc.js&quot;&gt;&lt;/script&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&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⏰복잡도 분석&lt;/h2&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;유클리드 알고리즘은 두 정수 $a,\ b\ (a \gt b)$에 대하여 $b$가 0이 될 때까지 반복적으로 함수를 호출합니다.&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;$\gcd(a, b) = \gcd(a', b') = \gcd(b, a \mod b)라고\ 할\ 때\\\ \\Case\ 1\ :\ b\ (=a') \gt \frac{a}{2}\\\ \\a \mod b(=b') = a - b \lt \frac{a}{2}\\\ \\Case\ 2\ :\ b(=a') \le \frac{a}{2}\\\ \\a \mod b(=b') \lt b \le \frac{a}{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;경우를 나눠보니 $a \mod b \lt \frac{a}{2}$인 것이 분명해졌습니다. 그러므로 매 실행마다 자료의 크기가 절반 이상 줄어든다는 사실을 알 수 있습니다. 따라서, ⏰시간 복잡도는 $O(\log(\min(a, b))$입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Let's do PS &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 오늘 공부한 내용들로 문제를 해결해볼까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 해결할 문제는 &lt;a href=&quot;https://www.acmicpc.net/problem/2609&quot;&gt;BOJ 2609 - 최대공약수와 최소공배수&lt;/a&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 스스로 해결해보시고 도움이 필요하시면 아래 코드를 참고하세요.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/f21004b8aef56ac6ba8c60cc7a6777df.js&quot;&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Further Thinking &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\gcd(a, b) = d$ 라고 할 때 $d = ax + dy\ (x, y \in Z)$로 정의할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 $d$는 $a, b$의 최대 공약수이기 때문입니다. 그렇다면 이때 $x$와 $y$의 값은 어떻게 알 수 있을까요?&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;zwj; &amp;zwj; &amp;zwj; &lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 참고&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/유클리드_호제법&quot;&gt;https://ko.wikipedia.org/wiki/유클리드_호제법&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://book.algospot.com/&quot;&gt;https://book.algospot.com/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codility.com/media/train/10-Gcd.pdf&quot;&gt;https://codility.com/media/train/10-Gcd.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ALicademy  &amp;zwj; &amp;zwj; /알고리즘</category>
      <category>alicademy</category>
      <category>BOJ2609</category>
      <category>알고리즘</category>
      <category>유클리드 알고리즘</category>
      <category>유클리드 호제법</category>
      <category>최대 공약수</category>
      <author>ALiNew</author>
      <guid isPermaLink="true">https://alinew.tistory.com/104</guid>
      <comments>https://alinew.tistory.com/104#entry104comment</comments>
      <pubDate>Sun, 4 Jul 2021 23:55:24 +0900</pubDate>
    </item>
    <item>
      <title>[Algo Rhythm ] BOJ 1759 -  암호 만들기</title>
      <link>https://alinew.tistory.com/103</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호가 구성되는 서로 다른 알파벳 소문자의 개수를 $l$, 암호로 사용했을 법한 문자의 개수를 $c\ (3 \le l \le c \le 15)$라고 하자. 암호를 이루기 위해서는 다음과 같은 두 조건을 만족해야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최소한 한 개 이상의 모음(a, e, i, o, u)로 이루어져 있다.&lt;/li&gt;
&lt;li&gt;최소한 두 개 이상의 자음들로 이루어져 있다.&lt;/li&gt;
&lt;li&gt;암호를 이루는 알파벳들은 증가하는 순서로 배열되어 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호로 사용했을 법한 문자들을 하나의 vertex로 보자. 그렇다면 이 문제는 $c$개의 vertex들 중 앞서 언급한 조건들을 만족하여 $l$개의 vertex들을 선택하는 backtracking 문제로 이해할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 암호로 사용했을 법한 문자들을 저장한 배열 $alphabets$을 오름차순으로 정렬한다. 왜냐하면 암호에서 알파벳들은 증가하는 순서로 배열되었기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 암호를 저장하는 배열 $cipher$을 완성한 뒤 출력하는 함수 $f$를 실행하는데 $f$는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;291&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3QNb4/btq8v9oHDh8/KbfxuwF3JmdqBagG2sTQk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3QNb4/btq8v9oHDh8/KbfxuwF3JmdqBagG2sTQk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3QNb4/btq8v9oHDh8/KbfxuwF3JmdqBagG2sTQk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3QNb4%2Fbtq8v9oHDh8%2FKbfxuwF3JmdqBagG2sTQk0%2Fimg.png&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;291&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨복잡도 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호가 구성되는 서로 다른 알파벳 소문자의 개수를 $l$, 암호로 사용했을 법한 문자의 개수를 $c\ (3 \le l \le c \le 15)$라고 할 때, 시간 복잡도와 공간 복잡도는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏰시간 복잡도 : $O(c^l)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$alphabets$를 오름차순으로 정렬하는데 $O(clogc)$가 소요됨&lt;/li&gt;
&lt;li&gt;$cipher$를 완성하기 위해 $f$를 recursive case마다 $c - idx (1 \le idx \le c)$번 호출하는데 이를 $l$번 반복한다. 따라서 $O(c^l)$이 소요됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 공간 복잡도 : $O(c)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$alphabets$을 저장하기 위해 $O(c)$가 소요됨&lt;/li&gt;
&lt;li&gt;$cipher$를 저장하기 위해 $O(c)$가 소요됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt; &lt;/span&gt;코드&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/29b90f25c344875ba9175ddf64605fa8.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1759&quot;&gt;https://www.acmicpc.net/problem/1759&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1625050323727&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;1759번: 암호 만들기&quot; data-og-description=&quot;첫째 줄에 두 정수 L, C가 주어진다. (3 &amp;le; L &amp;le; C&amp;nbsp;&amp;le; 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1759&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1759&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dF4fjL/hyKI8F4XTB/5CKA7ipEmjI534FDqDl4E0/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/1759&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1759&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dF4fjL/hyKI8F4XTB/5CKA7ipEmjI534FDqDl4E0/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;1759번: 암호 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 두 정수 L, C가 주어진다. (3 &amp;le; L &amp;le; C&amp;nbsp;&amp;le; 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.&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;</description>
      <category>Algo Rhythm /BOJ</category>
      <category>backtracking</category>
      <category>boj1759</category>
      <category>Clean Code</category>
      <category>cpp</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>암호 만들기</category>
      <author>ALiNew</author>
      <guid isPermaLink="true">https://alinew.tistory.com/103</guid>
      <comments>https://alinew.tistory.com/103#entry103comment</comments>
      <pubDate>Wed, 30 Jun 2021 19:52:56 +0900</pubDate>
    </item>
    <item>
      <title>[Algo Rhythm ] BOJ 18290 - NM과 K(1)</title>
      <link>https://alinew.tistory.com/102</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기가 $n \times m\ (1 \le n,\ m \le 10)$인 격자판을 $g$라고 하자. $g$의 각 칸에는 정수가 하나씩 들어있는데 인접한 칸들을 제외하고 $k\ (1 \le k \le \min (4, n \times m))$개의 칸을 선택하여 각 칸에 들어있는 모든 수들을 더할 때 나올 수 있는 값들 중 최댓값을 구해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$g$의 각 칸을 하나의 vertex라고 생각해보자. 그렇다면 이 문제는 $n \times m$개의 vertex들 중에서 인접한 칸들을 제외하고 $k$개의 vertex를 선택할 때 얻을 수 있는 최댓값을 구하는 backtracking 문제로 이해할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$n \times m$개의 칸 중 $k$개의 칸을 선택할 때 한 가지 조건은 이미 선택된 칸들과 인접한 칸은 선택할 수 없다는 것이다. 이를 위해 각 칸의 방문 여부를 나타내는 $n \times m$ 크기의 정수형 배열 $v$를 생성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$v$는 그 값이 0이면 방문하지 않음을, 0보다 크면 방문함을 나타낸다. $bool$형 배열이 아니라 정수형을 사용한 이유는 선택한 칸들 중 인접한 칸이 중복될 수 있기 때문이다. 간단한 예시는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;1280&quot; width=&quot;460&quot; height=&quot;500&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4q4iv/btq8spfasvg/YPrTwc10HWpXW514KpGyzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4q4iv/btq8spfasvg/YPrTwc10HWpXW514KpGyzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4q4iv/btq8spfasvg/YPrTwc10HWpXW514KpGyzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4q4iv%2Fbtq8spfasvg%2FYPrTwc10HWpXW514KpGyzk%2Fimg.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;1280&quot; width=&quot;460&quot; height=&quot;500&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에서 요구하는 최댓값을 구하는 함수를 $f$라고 할 때, $f$는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;136&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euERiH/btq8vgauxwY/C2Pyf0qkX3j0pKpCeuZGW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euERiH/btq8vgauxwY/C2Pyf0qkX3j0pKpCeuZGW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euERiH/btq8vgauxwY/C2Pyf0qkX3j0pKpCeuZGW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeuERiH%2Fbtq8vgauxwY%2FC2Pyf0qkX3j0pKpCeuZGW0%2Fimg.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;136&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✨복잡도 분석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;격자판 $g$의 크기를 $n \times m\ (1 \le n,\ m \le 10)$라고 하고 선택해야 하는 칸의 수를 $k\ (1 \le k \le \min (4, n \times m))$라고 할 때 시간 복잡도와 공간 복잡도는 다음과 같다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏰시간 복잡도 : $O((nm)^k)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$g$를 만드는데 $O(nm)$이 소요됨&lt;/li&gt;
&lt;li&gt;최댓값을 구하는 함수 $f$는 recursive case마다 $O(nm)$이 소요되는데 depth가 k일 때까지 반복하기 때문에 $O((nm)^k)$가 소요됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 공간 복잡도 : $O(nm)$&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$g$를 저장하는데 $O(nm)$이 소요됨&lt;/li&gt;
&lt;li&gt;$v$를 저장하는데 $O(nm)$이 소요됨&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt; &lt;/span&gt;코드&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/SukJinKim/48cd4bfb5608e0eec3c1f5031fbc127c.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 문제 출처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18290&quot;&gt;https://www.acmicpc.net/problem/18290&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1625042422857&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;18290번: NM과 K (1)&quot; data-og-description=&quot;크기가 N&amp;times;M인 격자판의 각 칸에 정수가 하나씩 들어있다. 이 격자판에서 칸 K개를 선택할&amp;nbsp;것이고, 선택한 칸에 들어있는&amp;nbsp;수를 모두 더한 값의 최댓값을 구하려고 한다. 단, 선택한 두 칸이 인접&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/18290&quot; data-og-url=&quot;https://www.acmicpc.net/problem/18290&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hHNpi/hyKKE4no4W/naSCJNfzJb1BSqX3hEN5dK/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/18290&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/18290&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hHNpi/hyKKE4no4W/naSCJNfzJb1BSqX3hEN5dK/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;18290번: NM과 K (1)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;크기가 N&amp;times;M인 격자판의 각 칸에 정수가 하나씩 들어있다. 이 격자판에서 칸 K개를 선택할&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;</description>
      <category>Algo Rhythm /BOJ</category>
      <category>algorhythm</category>
      <category>backtracking</category>
      <category>BOJ18290</category>
      <category>NM과 K(1)</category>
      <category>백트래킹</category>
      <category>알고리즘</category>
      <author>ALiNew</author>
      <guid isPermaLink="true">https://alinew.tistory.com/102</guid>
      <comments>https://alinew.tistory.com/102#entry102comment</comments>
      <pubDate>Wed, 30 Jun 2021 17:41:34 +0900</pubDate>
    </item>
  </channel>
</rss>