<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>릴리즈</title>
    <link>https://crmrelease.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 24 Jul 2026 02:04:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개발자1344</managingEditor>
    <item>
      <title>[알고리즘] DFS</title>
      <link>https://crmrelease.tistory.com/225</link>
      <description>&lt;p&gt;DFS를 구현하는 것은 크게 의미가 없는 것 같으므로 간단히 설명하고 넘어가자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;306&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNYnVU/btq2plaHr3x/SBN2tdp4VVkiwkk5knOkzK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNYnVU/btq2plaHr3x/SBN2tdp4VVkiwkk5knOkzK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNYnVU/btq2plaHr3x/SBN2tdp4VVkiwkk5knOkzK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bNYnVU/btq2plaHr3x/SBN2tdp4VVkiwkk5knOkzK/img.gif&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;306&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;하나의 노드에 대해, 해당 노드가 가진 child node를 완전히 탐색하고 넘어가는 것을 DFS이라고 한다&lt;/p&gt;
&lt;p&gt;stack을 사용하여 노드의 순회를 컨트롤한다&lt;/p&gt;
&lt;p&gt;속도는 느리지만, 저장 공간의 수요가 적고 구현이 간단하다는 장점이 있다.&lt;/p&gt;
&lt;p&gt;특히 그래프를 search 할때는 root의 위치에 따라 preorder, inorder, postorder로 나뉜다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시1. &lt;span&gt;230&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Kth Smallest Element in a BST&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPzxlI/btq2tlA1uS1/62yhxmyobq75kEQCuFpniK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPzxlI/btq2tlA1uS1/62yhxmyobq75kEQCuFpniK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPzxlI/btq2tlA1uS1/62yhxmyobq75kEQCuFpniK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPzxlI%2Fbtq2tlA1uS1%2F62yhxmyobq75kEQCuFpniK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;다음과 같은 간단한 예시문제를 보자. 대표적인 그래프인 트리에 대한 문제이다.&lt;/p&gt;
&lt;p&gt;트리를 방문하되, 크기순대로 세웠을때 k번째에 있는 노드의 value를 리턴하라는 문제이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FIUDh/btq2iEPW9mN/bm3nnggNqMa55LlMXSL4Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FIUDh/btq2iEPW9mN/bm3nnggNqMa55LlMXSL4Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FIUDh/btq2iEPW9mN/bm3nnggNqMa55LlMXSL4Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFIUDh%2Fbtq2iEPW9mN%2Fbm3nnggNqMa55LlMXSL4Kk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;일종의 inorder traversal 문제가 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;노드를 내림차순으로 정렬해야 하기 때문에, left-&amp;gt;root-&amp;gt;right의 순서대로 노드를 순회하여 답을 구하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시2. &lt;span&gt;199&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Binary Tree Right Side View&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nKkyF/btq2qxa8S3n/ULQdNDw9mduKRTOrw43Oz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nKkyF/btq2qxa8S3n/ULQdNDw9mduKRTOrw43Oz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nKkyF/btq2qxa8S3n/ULQdNDw9mduKRTOrw43Oz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnKkyF%2Fbtq2qxa8S3n%2FULQdNDw9mduKRTOrw43Oz1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;이 문제는 가트리의 right side view만 다시 리턴하라는 문제이다.&lt;/p&gt;
&lt;p&gt;얘도 결국에 search문제인데, 결국 모든 노드를 순회하면서 조건에 맞는 처리를 해주는 방식으로 풀어내기 때문이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y6Qif/btq2tlA3nEJ/IwdaPpdcXmoMDskiaTihaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y6Qif/btq2tlA3nEJ/IwdaPpdcXmoMDskiaTihaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y6Qif/btq2tlA3nEJ/IwdaPpdcXmoMDskiaTihaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY6Qif%2Fbtq2tlA3nEJ%2FIwdaPpdcXmoMDskiaTihaK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;조금 더 생각할 부분은 depth에서 right side를 구성하는 노드는 단 한개라는 사실&lt;/p&gt;
&lt;p&gt;그리고 right노드가 없다면 left노드가 보인다는 사실 정도다&lt;/p&gt;
&lt;p&gt;결국 search의 순서를 recursion으로 풀어낸 것이 특징이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시3. &lt;span&gt;98&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Validate Binary Search Tree&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpmpJg/btq2iWwxi4R/Qanfi8vkQ3wk0AzAykjmgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpmpJg/btq2iWwxi4R/Qanfi8vkQ3wk0AzAykjmgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpmpJg/btq2iWwxi4R/Qanfi8vkQ3wk0AzAykjmgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpmpJg%2Fbtq2iWwxi4R%2FQanfi8vkQ3wk0AzAykjmgK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;왠지 DFS에서 Tree로 포커스가 어긋난 것 같지만 여기까지 해보자&lt;/p&gt;
&lt;p&gt;사실 트리의 node들을 탐색하는 문제들은 결국에 BFS아니면 DFS로 처리하는 문제가 될 것이다.&lt;/p&gt;
&lt;p&gt;트리의 노드들이 valid한지 여부를 판단하는 문제&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xBUl1/btq2ucw7vZz/K86ZRUSIRGmXXGFZASVHP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xBUl1/btq2ucw7vZz/K86ZRUSIRGmXXGFZASVHP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xBUl1/btq2ucw7vZz/K86ZRUSIRGmXXGFZASVHP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxBUl1%2Fbtq2ucw7vZz%2FK86ZRUSIRGmXXGFZASVHP1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;역시 재귀를 사용하며 최대,최솟값을 함께 넘긴다&lt;/p&gt;
&lt;p&gt;특정 노드를 기준으로 왼쪽은 root의 value가 최대가 되고, 오른쪽은 root의 value가 최소가 될 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시4. 437. Path Sum&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;III&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdAEZU/btq2iFnNXPT/NnlhpkmlgkvkLrTJMRQ1H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdAEZU/btq2iFnNXPT/NnlhpkmlgkvkLrTJMRQ1H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdAEZU/btq2iFnNXPT/NnlhpkmlgkvkLrTJMRQ1H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdAEZU%2Fbtq2iFnNXPT%2FNnlhpkmlgkvkLrTJMRQ1H1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;역시 트리를 탐색하면서 순회한 노드의 합이 주어진 targetSum의 값과 같은 경우의 수를 찾는 문제&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3vQ2y/btq2rxWmj9K/cnXn7mDfp5xlxhva8gQdL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3vQ2y/btq2rxWmj9K/cnXn7mDfp5xlxhva8gQdL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3vQ2y/btq2rxWmj9K/cnXn7mDfp5xlxhva8gQdL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3vQ2y%2Fbtq2rxWmj9K%2FcnXn7mDfp5xlxhva8gQdL1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;이 문제는 경우의 수 보다는 recursion의 케이스가 헷갈릴 수 있다는 주의때문에 넣어봤다&lt;/p&gt;
&lt;p&gt;DFS는 특정 node를 시작으로 DFS를 진행하며 모든 탐색을 마칠 수 있으나,&lt;/p&gt;
&lt;p&gt;문제는 모든 node가 시작 node로 될 수 있다는 것이다&lt;/p&gt;
&lt;p&gt;따라서 DFS 뿐 아닌 재귀를 한번 더 추가해주었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시5 114&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Flatten Binary Tree to Linked List&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCiWRg/btq2ucKGoPI/aFxtyotawAAQ5kMR2jrb01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCiWRg/btq2ucKGoPI/aFxtyotawAAQ5kMR2jrb01/img.png&quot; data-alt=&quot;.&amp;amp;amp;nbsp; Flatten Binary Tree to Linked List&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCiWRg/btq2ucKGoPI/aFxtyotawAAQ5kMR2jrb01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCiWRg%2Fbtq2ucKGoPI%2FaFxtyotawAAQ5kMR2jrb01%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;figcaption&gt;.&amp;nbsp; Flatten Binary Tree to Linked List&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이번엔 주어진 트리를 Linked List로 변환하는 문제다&lt;/p&gt;
&lt;p&gt;결국이는 preorder순회와 같다. root-&amp;gt;left-&amp;gt;right순으로 DFS를 진행해주면 된다.&lt;/p&gt;
&lt;p&gt;내림차순의 탐색, 즉 깊이 탐색 문제와 동일하기 때문이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJuUxM/btq2uWoPers/zOngraqN07a27dxJcxl9x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJuUxM/btq2uWoPers/zOngraqN07a27dxJcxl9x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJuUxM/btq2uWoPers/zOngraqN07a27dxJcxl9x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJuUxM%2Fbtq2uWoPers%2FzOngraqN07a27dxJcxl9x0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;DFS 함수는 node와 tail을 갖는데, 항상 특정 node를 기준으로 node의 left는 null이 된다&lt;/p&gt;
&lt;p&gt;또한 node.right는 left가 먼저 붙고 right가 붙은 형태로 되어있어 DFS를 이용하여 순서대로 붙여준 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시6 617&lt;span&gt;.&lt;span&gt; &lt;b&gt;Merge Two Binary Trees&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE4pfc/btq2zBKCSST/Xv5GxH6G904qxPgTac6Tg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE4pfc/btq2zBKCSST/Xv5GxH6G904qxPgTac6Tg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE4pfc/btq2zBKCSST/Xv5GxH6G904qxPgTac6Tg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE4pfc%2Fbtq2zBKCSST%2FXv5GxH6G904qxPgTac6Tg1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;&lt;span&gt;&lt;span&gt;traversal에 대한 문제를 하나만 더 풀어보겠다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;두개의 트리를 합치는 문제이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wls3Q/btq2zCisnfI/8kttR1lNqBytP28y22DdqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wls3Q/btq2zCisnfI/8kttR1lNqBytP28y22DdqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wls3Q/btq2zCisnfI/8kttR1lNqBytP28y22DdqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwls3Q%2Fbtq2zCisnfI%2F8kttR1lNqBytP28y22DdqK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;root-&amp;gt;left-&amp;gt;right순서로 순회한다는 점에서 pre-order traversal이라 할 수 있다&lt;/p&gt;
&lt;p&gt;기본적으로 트리는 이렇게 재귀를 적극적으로 사용한다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시7. &lt;span&gt;200&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Number of Islands&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqANaJ/btq2y4GgAqW/vawgt1sqWYSbkiLYIKQwwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqANaJ/btq2y4GgAqW/vawgt1sqWYSbkiLYIKQwwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqANaJ/btq2y4GgAqW/vawgt1sqWYSbkiLYIKQwwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqANaJ%2Fbtq2y4GgAqW%2Fvawgt1sqWYSbkiLYIKQwwK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;트리를 벗어난 문제를 풀어보겠다&lt;/p&gt;
&lt;p&gt;이번엔 2차원 adjacent한 1의 덩어리를 찾으라는 문제이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rCh1c/btq2uXgZhZJ/4om3UQujeGXJNt61gmUO31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rCh1c/btq2uXgZhZJ/4om3UQujeGXJNt61gmUO31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rCh1c/btq2uXgZhZJ/4om3UQujeGXJNt61gmUO31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrCh1c%2Fbtq2uXgZhZJ%2F4om3UQujeGXJNt61gmUO31%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;DFS함수에 조건을 넣어 만들었다&lt;/p&gt;
&lt;p&gt;1을 만났을때 0으로 노드를 바꾸고, 모든 1마다 카운팅을 하면서 루프를 돌게 만들었다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예시8. &lt;span&gt;79&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Word Search&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GrsuL/btq2AGdSJAt/c0kRprrWWP01Ln7xSNA70K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GrsuL/btq2AGdSJAt/c0kRprrWWP01Ln7xSNA70K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GrsuL/btq2AGdSJAt/c0kRprrWWP01Ln7xSNA70K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGrsuL%2Fbtq2AGdSJAt%2Fc0kRprrWWP01Ln7xSNA70K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;마지막으로 2차원 배열 문제를 하나 더 풀어보겠다&lt;/p&gt;
&lt;p&gt;이번에는 word라는 string이 주어질 때, 이 문자를 연속된 배열의 원소들로 만들수 있는지 여부를 리턴하는 문제이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;접근 방식을 먼저 정하는 것이 중요할듯 하다.&lt;/p&gt;
&lt;p&gt;내 경우에는, i , j, board, remain을 모두 input으로 받는 dfs로 문제를 풀어보려 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oQ3m5/btq2y4Gh8RW/Qw3fs1L1HK4Gr5JqhfHBAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oQ3m5/btq2y4Gh8RW/Qw3fs1L1HK4Gr5JqhfHBAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oQ3m5/btq2y4Gh8RW/Qw3fs1L1HK4Gr5JqhfHBAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoQ3m5%2Fbtq2y4Gh8RW%2FQw3fs1L1HK4Gr5JqhfHBAK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;실제 루프는 2중으로 돌려주고, dfs에서 문제가 없을때 true를 리턴하도록 한다&lt;/p&gt;
&lt;p&gt;이때 dfs 로직은 연속된 문자를 만들 수 있을때까지 진행되어야 한다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca1t2z/btq2ubfu7XB/7JR8OgVKEN1EkYGxygB1Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca1t2z/btq2ubfu7XB/7JR8OgVKEN1EkYGxygB1Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca1t2z/btq2ubfu7XB/7JR8OgVKEN1EkYGxygB1Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca1t2z%2Fbtq2ubfu7XB%2F7JR8OgVKEN1EkYGxygB1Xk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;dfs 로직은 다음과 같다&lt;/p&gt;
&lt;p&gt;하나의 단어를 검사할 차례가 되면, 해당 단어를 다시 체크하지 못하도록 -로 바꾸고 remain word를 하나씩 줄여가며 재귀로 비교한다&lt;/p&gt;</description>
      <category>프로그래밍-Science/LeetCode 문제 정리</category>
      <author>개발자1344</author>
      <guid isPermaLink="true">https://crmrelease.tistory.com/225</guid>
      <comments>https://crmrelease.tistory.com/225#entry225comment</comments>
      <pubDate>Wed, 14 Apr 2021 10:58:52 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] Binary Search</title>
      <link>https://crmrelease.tistory.com/224</link>
      <description>&lt;p&gt;Bianry Search는 오름차순(또는 내림차순)으로 정렬된 배열에서 특정 값을 찾는 방법이다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;428&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgiCGR/btq2noLCMNw/ln5fIAiYJbsVIx08gOatkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgiCGR/btq2noLCMNw/ln5fIAiYJbsVIx08gOatkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgiCGR/btq2noLCMNw/ln5fIAiYJbsVIx08gOatkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgiCGR%2Fbtq2noLCMNw%2Fln5fIAiYJbsVIx08gOatkK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;428&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;로직의 핵심은 middle point를 선정하는데 있다.&lt;/p&gt;
&lt;p&gt;특정 value A를 찾아야 되는 경우, middle을 찾고 value가 middle point보다 작거나 큰지 검사한다&lt;/p&gt;
&lt;p&gt;작다면 middle point 보다 큰 값들은 모두 대상에서 제외되는 것이다&lt;/p&gt;
&lt;p&gt;이러한 방식으로 매번 반절씩 후보군을 줄여나갈 수 있다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;465&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMRBMi/btq2ieQMG9Y/k2xbwSokFA6bp0PM83WzD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMRBMi/btq2ieQMG9Y/k2xbwSokFA6bp0PM83WzD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMRBMi/btq2ieQMG9Y/k2xbwSokFA6bp0PM83WzD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMRBMi%2Fbtq2ieQMG9Y%2Fk2xbwSokFA6bp0PM83WzD0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;465&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;기본적인 코드는 다음과 같다&lt;/p&gt;
&lt;p&gt;left, right를 정해주고 Loop안에서 middle point를 지속적으로 바꿔주며 target을 찾는다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시1. 33&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Search in Rotated Sorted Array&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBPbn/btq2oSlx3AS/QBzPBIwAmexTu0p0JaIBQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBPbn/btq2oSlx3AS/QBzPBIwAmexTu0p0JaIBQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBPbn/btq2oSlx3AS/QBzPBIwAmexTu0p0JaIBQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBPbn%2Fbtq2oSlx3AS%2FQBzPBIwAmexTu0p0JaIBQk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;nums배열은 원래 오름차순이었지만 특정 기준에 따라 rotate되어있는 상태이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmnuab/btq2lBxVkpr/mxjFFKKWLv5bDi9P2Kw7dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmnuab/btq2lBxVkpr/mxjFFKKWLv5bDi9P2Kw7dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmnuab/btq2lBxVkpr/mxjFFKKWLv5bDi9P2Kw7dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmnuab%2Fbtq2lBxVkpr%2FmxjFFKKWLv5bDi9P2Kw7dk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;기본적인 binary search 로직에 조건을 하나 더 추가한 것 뿐이다.&lt;/p&gt;
&lt;p&gt;sort가 일부 rotate 되어 있으므로, left와 middle의 값을 비교하여 오름차순인지 내림차순이지만 보는 것이다&lt;/p&gt;
&lt;p&gt;그리고 각 경우에 대해 로직을 반대로만 짜주면 된다.&lt;/p&gt;
&lt;p&gt;사실 이 문제는 indexOf 메소드를 이용해 한 줄로 처리할 수도 있지만, 굳이 binary search를 적용한다면 이렇다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시2. &lt;span&gt;34&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Find First and Last Position of Element in Sorted Array&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drHzlS/btq2h3PJpvo/yMcp33FCErVQkOFUN3h3BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drHzlS/btq2h3PJpvo/yMcp33FCErVQkOFUN3h3BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drHzlS/btq2h3PJpvo/yMcp33FCErVQkOFUN3h3BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrHzlS%2Fbtq2h3PJpvo%2FyMcp33FCErVQkOFUN3h3BK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;조금 꼬인 예시를 보자.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이번에는 target이 여러개 주어지고, 해당 타겟이 위치한 범위를 리턴하는 문제이다.&lt;/p&gt;
&lt;p&gt;기존 bianry search는 left, right, target이 같아지는 순간까지 Loop를 돌렸으나, 해당문제는 범위를 구하는 문제이므로 설정을 달리 해줘야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;681&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sZYjh/btq2h4ag6pn/Rux5sR9ZCNkwkfihjkKUQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sZYjh/btq2h4ag6pn/Rux5sR9ZCNkwkfihjkKUQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sZYjh/btq2h4ag6pn/Rux5sR9ZCNkwkfihjkKUQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsZYjh%2Fbtq2h4ag6pn%2FRux5sR9ZCNkwkfihjkKUQK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;681&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;기존에는 middle= target을 만족하면 리턴했다&lt;/p&gt;
&lt;p&gt;그러나 target이 범위인 경우, middle이 target을 만족한다고 하여도 그 주위의 원소들도 target과 같은 값을 가질것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SaqoW/btq2hCZbaNo/r7Yvq4cgv1ecvZbRsrEhq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SaqoW/btq2hCZbaNo/r7Yvq4cgv1ecvZbRsrEhq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SaqoW/btq2hCZbaNo/r7Yvq4cgv1ecvZbRsrEhq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSaqoW%2Fbtq2hCZbaNo%2Fr7Yvq4cgv1ecvZbRsrEhq0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;이런 경우에는 start target과 end target을 별개로 구한다&lt;/p&gt;
&lt;p&gt;위의 예시처럼 target이 middle을 만족하는 경우, 계속 앞으로 끌어당겨 루프를 돌려준다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmaeF9/btq2ryHhA0z/QmHuj0Q7a2vAIUa9XFAXi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmaeF9/btq2ryHhA0z/QmHuj0Q7a2vAIUa9XFAXi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmaeF9/btq2ryHhA0z/QmHuj0Q7a2vAIUa9XFAXi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmaeF9%2Fbtq2ryHhA0z%2FQmHuj0Q7a2vAIUa9XFAXi1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;결과적으로 target을 찾든, 찾지 않든간에 target이 nums[middle]의 값보다 클때만 left를 옮겨주고, 나머지는 right를 앞으로 끌어오면 된다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZZCvP/btq2niSGNit/Wh4cKbEKkJovpe5WnVWkQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZZCvP/btq2niSGNit/Wh4cKbEKkJovpe5WnVWkQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZZCvP/btq2niSGNit/Wh4cKbEKkJovpe5WnVWkQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZZCvP%2Fbtq2niSGNit%2FWh4cKbEKkJovpe5WnVWkQ1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;endTarget은 올림으로 찾아낸다. 이것 역시 targe이 middle보다 더 작은 값일때만 right를 옮겨주고 나머지 경우는 무조건 left를 늘려주는 것으로 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;570&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPwTTi/btq2kC5hszP/NUByPpKG44YHBcKQqZYkW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPwTTi/btq2kC5hszP/NUByPpKG44YHBcKQqZYkW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPwTTi/btq2kC5hszP/NUByPpKG44YHBcKQqZYkW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPwTTi%2Fbtq2kC5hszP%2FNUByPpKG44YHBcKQqZYkW0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;570&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;start target은 target을 찾아도 무조건 left를 앞으로, end target은 right를 뒤로 하는 로직을 짜주면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시3. &lt;span&gt;278&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;First Bad Version&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWzmw/btq2oSGkvdK/DKOKQBPPrIwsOvCN8KBJr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWzmw/btq2oSGkvdK/DKOKQBPPrIwsOvCN8KBJr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWzmw/btq2oSGkvdK/DKOKQBPPrIwsOvCN8KBJr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWzmw%2Fbtq2oSGkvdK%2FDKOKQBPPrIwsOvCN8KBJr0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;예시2와 유사하지만 이번에는 element가 true or false로 구성되어 있다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dC89oK/btq2hZzZAAO/WFfnsXKUjQx1Z4WBFTMCtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dC89oK/btq2hZzZAAO/WFfnsXKUjQx1Z4WBFTMCtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dC89oK/btq2hZzZAAO/WFfnsXKUjQx1Z4WBFTMCtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdC89oK%2Fbtq2hZzZAAO%2FWFfnsXKUjQx1Z4WBFTMCtK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;원리는 똑같다.&lt;/p&gt;
&lt;p&gt;이 경우도 [ F, F, F, F, .... T, T, T ] 같은 형태로 같은 숫자가 연달아 놓여있기 때문에, 특정 범위를 찾되 가장 앞의 인덱스를 찾는 문제와 동일하다&lt;/p&gt;
&lt;p&gt;따라서 특정 인덱스를 찾으면 계속해서 범위를 앞쪽으로 줄여준다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시4. &lt;span&gt;35&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Search Insert Position&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqDfAJ/btq2kq4HSrX/M4HfVMcH7uxvuLKjjs3ejK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqDfAJ/btq2kq4HSrX/M4HfVMcH7uxvuLKjjs3ejK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqDfAJ/btq2kq4HSrX/M4HfVMcH7uxvuLKjjs3ejK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqDfAJ%2Fbtq2kq4HSrX%2FM4HfVMcH7uxvuLKjjs3ejK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;기본문제 간단히 하나만 더 풀어보겠다&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbd0xh/btq2ttr1I7N/4eIWGkoeKyjHI8RxEl1yuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbd0xh/btq2ttr1I7N/4eIWGkoeKyjHI8RxEl1yuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbd0xh/btq2ttr1I7N/4eIWGkoeKyjHI8RxEl1yuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbd0xh%2Fbtq2ttr1I7N%2F4eIWGkoeKyjHI8RxEl1yuk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;설명은 생략&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시5 . 300 L&lt;span&gt;ongest Increasing Subsequence&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2UEo6/btq2lqpQV5b/sKnQbZIIk21DVMKh9keQ9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2UEo6/btq2lqpQV5b/sKnQbZIIk21DVMKh9keQ9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2UEo6/btq2lqpQV5b/sKnQbZIIk21DVMKh9keQ9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2UEo6%2Fbtq2lqpQV5b%2FsKnQbZIIk21DVMKh9keQ9k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;&lt;span&gt;이번 문제는 nums에 대해 오름차순으로 증가하는 원소들만 모은 부분배열의 길이를 구하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;복잡해보일수 있지만 dp나 binary search를 이용해 풀 수 있다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;일단 복습겸 dp를 이용해 풀어보자&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk4MpQ/btq2iEhWty2/9bNaXk78EgI49lcmUt2HqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk4MpQ/btq2iEhWty2/9bNaXk78EgI49lcmUt2HqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk4MpQ/btq2iEhWty2/9bNaXk78EgI49lcmUt2HqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk4MpQ%2Fbtq2iEhWty2%2F9bNaXk78EgI49lcmUt2HqK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;dp[ i ]는 i가 포함되는 최대 LIS이다.&lt;/p&gt;
&lt;p&gt;이 원소가 업데이트 되는 조건은 비교군 j에서 i로 진행할 때 값이 증가하는 경우다.&lt;/p&gt;
&lt;p&gt;하지만 이렇게 작성한 로직은 성능상의 문제를 갖게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQWVcv/btq2lpLkH63/Vi6XV3eq4A4GF7DjFcxOM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQWVcv/btq2lpLkH63/Vi6XV3eq4A4GF7DjFcxOM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQWVcv/btq2lpLkH63/Vi6XV3eq4A4GF7DjFcxOM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQWVcv%2Fbtq2lpLkH63%2FVi6XV3eq4A4GF7DjFcxOM1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;우선 bs 함수를 만든다.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;해당함수는 target을 찾아도 middle+1을 처리해준다. 즉, end target을 찾겠다는 뜻이다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bexsgq/btq2tr8U4P9/inO6aKrglrhLlw5YK4o3K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bexsgq/btq2tr8U4P9/inO6aKrglrhLlw5YK4o3K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bexsgq/btq2tr8U4P9/inO6aKrglrhLlw5YK4o3K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbexsgq%2Fbtq2tr8U4P9%2FinO6aKrglrhLlw5YK4o3K1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;이후 각 원소에 대해 bs를 수행해주는데, 이때 bs는 해당 원소보다 작은 위치를 찾아서 순서를 맞춰준다&lt;br /&gt;오름차순으로 정렬된 memo원소에 대해 마지막 원소보다 target의 인덱스가 작다면 알아서 오름차순으로 맞추도록 대체될 것이기 때문이다.&lt;/p&gt;
&lt;p&gt;이를 LIS라는데,자세한 풀이는 해당 문제 포스팅을 참고.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시6. &lt;span&gt;334&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Increasing Triplet Subsequence&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4n7Jy/btq2krvR2M8/sjvCKlyhbUENBkxeqh9gE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4n7Jy/btq2krvR2M8/sjvCKlyhbUENBkxeqh9gE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4n7Jy/btq2krvR2M8/sjvCKlyhbUENBkxeqh9gE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4n7Jy%2Fbtq2krvR2M8%2FsjvCKlyhbUENBkxeqh9gE0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;거의 유사한 문제다&lt;/p&gt;
&lt;p&gt;예시5와 같은 조건에 triplet임만 확인되면 true를 리턴하라는 문제&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5VxDn/btq2tstfpQg/sJeObg5g8ItBkW3oxZ85fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5VxDn/btq2tstfpQg/sJeObg5g8ItBkW3oxZ85fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5VxDn/btq2tstfpQg/sJeObg5g8ItBkW3oxZ85fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5VxDn%2Fbtq2tstfpQg%2FsJeObg5g8ItBkW3oxZ85fK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시7. &lt;span&gt;240&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Search a 2D Matrix II&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAemYo/btq2iWb2K4Q/KfyxOsHxjyfJzmrlkqAfm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAemYo/btq2iWb2K4Q/KfyxOsHxjyfJzmrlkqAfm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAemYo/btq2iWb2K4Q/KfyxOsHxjyfJzmrlkqAfm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAemYo%2Fbtq2iWb2K4Q%2FKfyxOsHxjyfJzmrlkqAfm1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;마지막으로 2차원 행렬에서 binary search까지 알아보자&lt;/p&gt;
&lt;p&gt;조건은 행렬이 각각 오름차순으로 정리되어있어야 한다는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fa7Kt/btq2pk3QV6N/5M6kng2L8AHSXrfsLcDNM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fa7Kt/btq2pk3QV6N/5M6kng2L8AHSXrfsLcDNM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fa7Kt/btq2pk3QV6N/5M6kng2L8AHSXrfsLcDNM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFa7Kt%2Fbtq2pk3QV6N%2F5M6kng2L8AHSXrfsLcDNM0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;순회의 시작을 i=0, j=최대 부터 하면 된다&lt;/p&gt;
&lt;p&gt;만약 target이 그보다 작다면 j를 내리고, target이 더 크다면 i를 높이며 찾는다&lt;/p&gt;</description>
      <category>프로그래밍-Science/LeetCode 문제 정리</category>
      <author>개발자1344</author>
      <guid isPermaLink="true">https://crmrelease.tistory.com/224</guid>
      <comments>https://crmrelease.tistory.com/224#entry224comment</comments>
      <pubDate>Mon, 12 Apr 2021 16:27:10 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] DP</title>
      <link>https://crmrelease.tistory.com/223</link>
      <description>&lt;p&gt;용어는 Dynamic Program이지만 사실 핵심은 메모제이션에 있다.&lt;/p&gt;
&lt;p&gt;DP관련 문제 풀이들은 이전에 계산한 내용을 '기억'해두고 다음 계산에 지속적으로 이용한다.&lt;/p&gt;
&lt;p&gt;일반적으로 풀이방식에 따라 bottem-up, top-down을 구분하는데 큰 의미는 없다고 생각한다.&lt;/p&gt;
&lt;p&gt;트리처럼 recursion을 이용한 풀이는 보통 top-down으로, 배열에 대해 index 0부터 차근차근 풀어나가는 방식을 bottom-up으로 생각하는 경우가 많다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1x5Nu/btq2aNMDykQ/ReMqdmuMPHhWvLpJzzIWK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1x5Nu/btq2aNMDykQ/ReMqdmuMPHhWvLpJzzIWK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1x5Nu/btq2aNMDykQ/ReMqdmuMPHhWvLpJzzIWK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1x5Nu%2Fbtq2aNMDykQ%2FReMqdmuMPHhWvLpJzzIWK0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;무튼 dp의 가장 간단한 예시는 피보나치 수열이다&lt;/p&gt;
&lt;p&gt;피보나치 수열의 경우 모든 항목을 일일이 계산하지 않는다.&lt;/p&gt;
&lt;p&gt;f(1)을 한번 계산해두면, f(2)를 구할때 계산했던 f(1)을 메모제이션 했다가 사용한다.&lt;/p&gt;
&lt;p&gt;결국은 일종의 점화식이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시1- 416. &lt;span&gt;Partition Equal Subset Sum&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZJHSb/btq2clWb9qP/Yi3HX2DldQY1k9Rlx8MQbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZJHSb/btq2clWb9qP/Yi3HX2DldQY1k9Rlx8MQbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZJHSb/btq2clWb9qP/Yi3HX2DldQY1k9Rlx8MQbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZJHSb%2Fbtq2clWb9qP%2FYi3HX2DldQY1k9Rlx8MQbk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;실제 문제를 풀며 이해해보겠다&lt;/p&gt;
&lt;p&gt;위의 문제는 &lt;span style=&quot;color: #666666;&quot;&gt;nums라는 배열에 대해 두개의 subset을 만들어 각 subset 원소의 합이 같은 subset을 만들 수 있는지 여부를 리턴하라는 문제다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;DP는 dp배열을 만들어 문제를 구해낸다.&lt;/p&gt;
&lt;p&gt;따라서 dp[ i ]에 대한 정의가 우선 뚜렷해야한다.&lt;/p&gt;
&lt;p&gt;DP문제는 결국 조건에 맞는 dp[ i ] 를 리턴하는 것이고 dp [ i ]를 dp [ i-n]의 연산을 통해 연쇄적으로 구해가는것이 핵심이기 때문이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;위 문제를 이해해보면 subset은 항상 같은 값 두개로 나뉜다.&lt;/p&gt;
&lt;p&gt;예를들어 위처럼 [1, 5, 11, 5] 라면, 각 배열 원소의 합이 22/2=11이 나와야 한다.&lt;/p&gt;
&lt;p&gt;합이 11이되기 전까지의 과정에서는 합이 1~10이 되는 과정이 포함되어 있을 것이다.&lt;/p&gt;
&lt;p&gt;그래서 우리가 구할 dp[ i ]는, 'i라는 합을 만드는게 가능한지 여부'가 되는 것이다&lt;/p&gt;
&lt;p&gt;또한 dp배열의 길이는 11일 것이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IgtzO/btq16RhXDnw/v7WJQlnROJlGkxh6W0KKG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IgtzO/btq16RhXDnw/v7WJQlnROJlGkxh6W0KKG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IgtzO/btq16RhXDnw/v7WJQlnROJlGkxh6W0KKG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIgtzO%2Fbtq16RhXDnw%2Fv7WJQlnROJlGkxh6W0KKG1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;일단 경곗값을 제거해준다.&lt;/p&gt;
&lt;p&gt;총합이 홀수거나 배열이 없는 경우는 당연히 false다.&lt;/p&gt;
&lt;p&gt;토탈은 reduce를 이용해 구해봤다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebpXQY/btq2dBEf6Mw/t56Ki9Udezo712iDzghawk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebpXQY/btq2dBEf6Mw/t56Ki9Udezo712iDzghawk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebpXQY/btq2dBEf6Mw/t56Ki9Udezo712iDzghawk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebpXQY%2Fbtq2dBEf6Mw%2Ft56Ki9Udezo712iDzghawk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;다음은 dp의 핵심인 배열생성과 초깃값이다&lt;/p&gt;
&lt;p&gt;i=11까지 만들것이므로 해당하는 길이의 배열을 생성하고, 0일떄는 [ ] , [ ] 으로 나뉘어져 true이므로 초깃값을 준다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOQ143/btq18EJeHFj/UmUlMCWNcDieaWZMg9x96k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOQ143/btq18EJeHFj/UmUlMCWNcDieaWZMg9x96k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOQ143/btq18EJeHFj/UmUlMCWNcDieaWZMg9x96k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOQ143%2Fbtq18EJeHFj%2FUmUlMCWNcDieaWZMg9x96k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;dp는 2중루프를 돌게 되는데, 일반적으로 input 배열의 각 원소에 대해 Loop를 돌게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;625&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/INawh/btq2eNdmgrK/tJwMbXKw4eeZoZD4KRhS3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/INawh/btq2eNdmgrK/tJwMbXKw4eeZoZD4KRhS3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/INawh/btq2eNdmgrK/tJwMbXKw4eeZoZD4KRhS3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FINawh%2Fbtq2eNdmgrK%2FtJwMbXKw4eeZoZD4KRhS3k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;625&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;dp 배열은 다음과 같은 형태로 구성하기 때문이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ANKxa/btq2aE29jGU/60DIR3b7Iisti7MSz3KflK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ANKxa/btq2aE29jGU/60DIR3b7Iisti7MSz3KflK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ANKxa/btq2aE29jGU/60DIR3b7Iisti7MSz3KflK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FANKxa%2Fbtq2aE29jGU%2F60DIR3b7Iisti7MSz3KflK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;해당문제는 input nums의 각 원소에 대해 dp[target]을 구할 것이다.&lt;/p&gt;
&lt;p&gt;그런데 생각해보면 특정 nums의 원소에 대해 dp[target-원소]가 true인지만 확인하면 된다.&lt;/p&gt;
&lt;p&gt;num=1을 예시로 들어보자&lt;/p&gt;
&lt;p&gt;num=1인 루프에서 dp[11]을 구하기 위해서는 dp[11-1]이 true인지만 보면 된다.&lt;/p&gt;
&lt;p&gt;dp[1]은 이미 true이기 때문이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;문제의 핵심을 요약하자면 다음과 같다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) dp의 정의를 제대로 내리고 초깃값을 잘 설정해주자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) input 원소 하나당 Loop를 돌려주자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) Loop 내부 조건은 문제마다 다르므로 잘 이해하자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시2 - 198. House Robber&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6sPOL/btq18oGk9VJ/nDqzqE5bSIIB2txpXXFM00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6sPOL/btq18oGk9VJ/nDqzqE5bSIIB2txpXXFM00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6sPOL/btq18oGk9VJ/nDqzqE5bSIIB2txpXXFM00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6sPOL%2Fbtq18oGk9VJ%2FnDqzqE5bSIIB2txpXXFM00%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;도둑이 집(배열의 각 인덱스)마다 돈(배열의 각 value)을 훔칠건데 연속으로 붙어있는 곳은 건들면 안된다고 한다&lt;/p&gt;
&lt;p&gt;이 문제는 비교적 간단한 dp 형태로 풀어낼 수 있다.&lt;/p&gt;
&lt;p&gt;dp[ i ]를 nums[ i ]까지의 배열에 대해 훔치기 가능한 최대 돈이라고 해보자&lt;/p&gt;
&lt;p&gt;dp[ i ] 를 훔치게되면, dp[i-1]은 훔치지 못하고&amp;nbsp; dp[i -2]+ nums[ i ]가 최대가 된다.&lt;/p&gt;
&lt;p&gt;그러나 dp [i -1]이 이보다 클 수도 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw6XNl/btq2gD9JOaS/TlGPBNk9pUzbUbFxEk4TD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw6XNl/btq2gD9JOaS/TlGPBNk9pUzbUbFxEk4TD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw6XNl/btq2gD9JOaS/TlGPBNk9pUzbUbFxEk4TD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw6XNl%2Fbtq2gD9JOaS%2FTlGPBNk9pUzbUbFxEk4TD1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;따라서 각 nums별로 loop를 돌릴 필요 없이 직관대로 풀면 된다.&lt;/p&gt;
&lt;p&gt;이렇게 간단한 문제는 dp설명에 부적합해 보인다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시3- 279. &lt;span&gt;Perfect Squares&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dB37D0/btq2gLmiwXw/LxTPrSXDffXPMMD55i49HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dB37D0/btq2gLmiwXw/LxTPrSXDffXPMMD55i49HK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dB37D0/btq2gLmiwXw/LxTPrSXDffXPMMD55i49HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdB37D0%2Fbtq2gLmiwXw%2FLxTPrSXDffXPMMD55i49HK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다음 문제를 보자&lt;/p&gt;
&lt;p&gt;n이 주어졌을때 n을 최소한의 제곱수로 나눈다면 몇개로 나눠지냐는 문제이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 문제가 왜 DP문제인가?&lt;/p&gt;
&lt;p&gt;dp[ i ]를 n이 i일때 최소 squres의 갯수라 해보자.&lt;/p&gt;
&lt;p&gt;dp[ i ] 가 a^2+b^2로 나눠진다면, dp[ i ]는 dp[a] + dp[b]가 될 것이다&lt;/p&gt;
&lt;p&gt;이것을 순서대로 각각 Loop로 구해본다고 했을때, a에 대해서만 생각해보면 1(a라는 제곱수인것이 확실하므로 1가지)+dp[i-a]가 될 것이다.&lt;/p&gt;
&lt;p&gt;이렇게 일일이 구한 dp중 가장 작은 것이 답이 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G22J1/btq2cm9iAJB/wqmJRSCKn4RNjO8luecI6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G22J1/btq2cm9iAJB/wqmJRSCKn4RNjO8luecI6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G22J1/btq2cm9iAJB/wqmJRSCKn4RNjO8luecI6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG22J1%2Fbtq2cm9iAJB%2FwqmJRSCKn4RNjO8luecI6K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;풀이는 그림과 같다.&lt;/p&gt;
&lt;p&gt;각 n에 대해 Loop를 돌리면서 그것보다 작은 제곱수의 모든 경우에 대해 최솟값을 구해주는 것이다.&lt;/p&gt;
&lt;p&gt;이때 최솟값을 구해야 하므로 Infinity를 기본 원소로 두었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시4- 322. Coin Change&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o0Pax/btq2bJjDet1/ZXFKkJW3k9ZpD7vxsOAQrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o0Pax/btq2bJjDet1/ZXFKkJW3k9ZpD7vxsOAQrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o0Pax/btq2bJjDet1/ZXFKkJW3k9ZpD7vxsOAQrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo0Pax%2Fbtq2bJjDet1%2FZXFKkJW3k9ZpD7vxsOAQrK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;유사한 문제이다.&lt;/p&gt;
&lt;p&gt;배열과 amount가 주어질 때, 배열의 원소를 사용하여 amount를 만드는 최소한의 가짓수를 구하는 것.&lt;/p&gt;
&lt;p&gt;이번엔 전형적인 dp 풀이 방식에 맞추어 풀어보겠다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) dp[ i ] = amount가 i 일때 경우의 수&lt;/p&gt;
&lt;p&gt;2) Loop의 조건: nums의 각 원소에 대해 반드시 각 원소가 쓰이는 경우대로 Loop&lt;/p&gt;
&lt;p&gt;3) dp[ i ]의 결정: nums의 원소가 a라면, dp [ i ]는 dp[i -a]+1(a를 사용했으니 1회)과 dp[ i ] 중 더 작은 수&lt;/p&gt;
&lt;p&gt;4) 초깃값의 결정: dp [ 0 ]은 0&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buV6rP/btq2b4nIKS3/3ta5c1noJkTB7J16wlHKHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buV6rP/btq2b4nIKS3/3ta5c1noJkTB7J16wlHKHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buV6rP/btq2b4nIKS3/3ta5c1noJkTB7J16wlHKHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuV6rP%2Fbtq2b4nIKS3%2F3ta5c1noJkTB7J16wlHKHk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;위 조건대로 코드를 짜면 다음과 같다.&lt;/p&gt;
&lt;p&gt;역시 dp의 정의가 중요함을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;예시5- 494. Target Sum&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lzrvP/btq2ckKExWK/UojK7QKXKkpM1ZPMBkTQN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lzrvP/btq2ckKExWK/UojK7QKXKkpM1ZPMBkTQN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lzrvP/btq2ckKExWK/UojK7QKXKkpM1ZPMBkTQN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlzrvP%2Fbtq2ckKExWK%2FUojK7QKXKkpM1ZPMBkTQN1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;마지막으로 한 문제만 더 풀어보고 포스팅을 마치겠다.&lt;/p&gt;
&lt;p&gt;해당 문제는 양의 정수로 구성된 배열과 정수 S가 들어올 때, 배열의 원소중 일부를 마이너스로 바꾸어 합하여 정수 S를 만드는 방법의 가짓수를 구하는 문제이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;dp [ i ] 는 i를 만들기 위한 경우의 수 라고 해보자&lt;/p&gt;
&lt;p&gt;하지만 이는 상당히 애매한 정의다&lt;/p&gt;
&lt;p&gt;애초에 dp [ i ]를 dp[i- a] 로 어떻게 유추할 수 있을까?&lt;/p&gt;
&lt;p&gt;합이 2가 되는 경우의수와 3이 되는 경우의 수의 관계가 뭘까?&lt;/p&gt;
&lt;p&gt;잘 모르겠다&lt;/p&gt;
&lt;p&gt;따라서 조금 더 직관적인 dp를 만들어보고자 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;특정 S를 만들기 위해서는 nums의 배열에서 양수로 유지할 집합(A)에서 음수가 될 집합(B)를 빼야 한다.&lt;/p&gt;
&lt;p&gt;예컨데 nums가 [ 1, 1, 1, 1, 1]이고 s가 3이라면 A는 [ 1,1 ,1 1]되고 B는 [1]이 되어야 한다&lt;/p&gt;
&lt;p&gt;합으로 생각해보면 A+B= 5, A-B=3이 되어야 한다는 뜻이다.&lt;/p&gt;
&lt;p&gt;이를 일반화 시켜보면 A+B= total이라는 합으로, A-B=s로 나타낼 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/te7Mo/btq2gnGl1XH/WMjSr0JD4KQTPGKzSgpNH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/te7Mo/btq2gnGl1XH/WMjSr0JD4KQTPGKzSgpNH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/te7Mo/btq2gnGl1XH/WMjSr0JD4KQTPGKzSgpNH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fte7Mo%2Fbtq2gnGl1XH%2FWMjSr0JD4KQTPGKzSgpNH1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;다시말해 이렇게 나타낼 수 있다는 뜻인데, 이는 직관적인 dp배열을 만들도록 해준다&lt;/p&gt;
&lt;p&gt;왜냐하면 우리가 특정 s를 만족시킨다는 뜻은 결국 A라는 숫자를 만들 수 있는 경우가 된다.&lt;/p&gt;
&lt;p&gt;그런데 nums의 한 원소를 a라 하면 , dp[A]는 dp[A-a]를 만드는 경우의 수와 같아진다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cd1Utr/btq2gEA900e/2qkWuVJfVkYjwiCCuuK7a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cd1Utr/btq2gEA900e/2qkWuVJfVkYjwiCCuuK7a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cd1Utr/btq2gEA900e/2qkWuVJfVkYjwiCCuuK7a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcd1Utr%2Fbtq2gEA900e%2F2qkWuVJfVkYjwiCCuuK7a0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;따라서 다음과 같이 작성해주면 된다.&lt;/p&gt;
&lt;p&gt;상기에 나왔던 문제들과 원리는 모두 동일하다.&lt;/p&gt;</description>
      <category>프로그래밍-Science/LeetCode 문제 정리</category>
      <author>개발자1344</author>
      <guid isPermaLink="true">https://crmrelease.tistory.com/223</guid>
      <comments>https://crmrelease.tistory.com/223#entry223comment</comments>
      <pubDate>Fri, 9 Apr 2021 16:39:15 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] Sliding Window</title>
      <link>https://crmrelease.tistory.com/222</link>
      <description>&lt;p&gt;특정 배열에 대해 범위 단위로 로직을 처리할 때 주로 사용되는 알고리즘이다.&lt;/p&gt;
&lt;p&gt;pointer가 두개라는 점에서 Two-Pointers 알고리즘과 유사하지만, Two-Pointers알고리즘이 서로 독립적으로 움직이는 것과 달리 Sliding window 알고리즘은 포인터 두 개가 서로 동일하게 움직인다.&lt;/p&gt;
&lt;p&gt;사실 내 생각에 두 알고리즘을 구분하는 것은 의미가 없어 보인다.&lt;/p&gt;
&lt;p&gt;전체 element에 대해 Loop를 돌아야할 문제를, 포인터를 두 개 두고 element 하나씩 찍어가면서 돌면 two pointer고, range 단위로 비교하게 되면 sliding window라고 생각한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;326&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2Mdqw/btq2cmmuoHU/9s0Q9LBK3iH3HiNws23tp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2Mdqw/btq2cmmuoHU/9s0Q9LBK3iH3HiNws23tp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2Mdqw/btq2cmmuoHU/9s0Q9LBK3iH3HiNws23tp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2Mdqw%2Fbtq2cmmuoHU%2F9s0Q9LBK3iH3HiNws23tp1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;326&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;예컨데 대상배열(전체배열)과 비교 target인 기준배열이 있다면, left와 right라는 pointer 두 개를 두고, 순회가 끝나면&amp;nbsp; 두 개의 pointer를 일괄적으로 한번에 늘려주도록 처리한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;1_HN084lMD15SWjH6epVeSAg.gif&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;365&quot; width=&quot;611&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4QRES/btq17G0NVD2/AZPp3zpiwnSF26AkngDAA0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4QRES/btq17G0NVD2/AZPp3zpiwnSF26AkngDAA0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4QRES/btq17G0NVD2/AZPp3zpiwnSF26AkngDAA0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/b4QRES/btq17G0NVD2/AZPp3zpiwnSF26AkngDAA0/img.gif&quot; data-filename=&quot;1_HN084lMD15SWjH6epVeSAg.gif&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;365&quot; width=&quot;611&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;이렇게 기준배열의 크기를 고정한 채 옮기면서 범위내의 로직 처리를 행할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;예시1 - 567&lt;/span&gt;&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Permutation in String&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv5yU5/btq2aMTQEL5/wf1UYEwjdY0MHtJ6vhsKv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv5yU5/btq2aMTQEL5/wf1UYEwjdY0MHtJ6vhsKv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv5yU5/btq2aMTQEL5/wf1UYEwjdY0MHtJ6vhsKv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv5yU5%2Fbtq2aMTQEL5%2Fwf1UYEwjdY0MHtJ6vhsKv1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;leetcode의 가장 단순한 sliding window를 사용해서 풀 수 있는 예시문제인 567번을 보자&lt;/p&gt;
&lt;p&gt;s1, s2라는 두 개의 string이 들어왔을 때, s2에 s1으로만 이루어진 부분이 있는지 여부를 리턴하는 문제이다.&lt;/p&gt;
&lt;p&gt;이 문제는 s1만큼의 길이를 연쇄적으로 s2의 부분부분과 비교하는 문제이므로 sliding window를 적용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSGHgL/btq2b2aMmAP/WlKcEW5dibQM7y3A2vvCP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSGHgL/btq2b2aMmAP/WlKcEW5dibQM7y3A2vvCP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSGHgL/btq2b2aMmAP/WlKcEW5dibQM7y3A2vvCP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSGHgL%2Fbtq2b2aMmAP%2FWlKcEW5dibQM7y3A2vvCP1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;단순하게 생각해낼 수 있는 풀이는 다음과 같다.&lt;/p&gt;
&lt;p&gt;경계값을 걸러내준 뒤, left와 right 포인터를 두고, s2를 쪼개 sort한 후, pointer를 옮겨가면서 비교하는 것이다.&lt;/p&gt;
&lt;p&gt;그러나 이러한 방법은 매 순회마다 대상이 되는 부분을 쪼갯다 붙여야 하므로 time limit이 걸린다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XWLvP/btq2aM1hJoZ/o5WvDsar7lFheaWoh2E5Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XWLvP/btq2aM1hJoZ/o5WvDsar7lFheaWoh2E5Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XWLvP/btq2aM1hJoZ/o5WvDsar7lFheaWoh2E5Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXWLvP%2Fbtq2aM1hJoZ%2Fo5WvDsar7lFheaWoh2E5Q1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;효율적인 비교를 위해 &lt;b&gt;Map&lt;/b&gt;을 사용할것이다. freq라는 맵을 만들고 잘라낸 범위 안의 원소 및 해당원소의 갯수만 비교하는 것이다. 기본적으로 anagram이기 때문에 해당 구간에서 사용한 원소와 그 빈도만 알면 되기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pUp0g/btq18olYYfS/MsxoNCOFHrsSLJVvTvSwtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pUp0g/btq18olYYfS/MsxoNCOFHrsSLJVvTvSwtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pUp0g/btq18olYYfS/MsxoNCOFHrsSLJVvTvSwtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpUp0g%2Fbtq18olYYfS%2FMsxoNCOFHrsSLJVvTvSwtK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ntgtq/btq16i0MZ3e/zrfVzFXA11RFbRNieK1f3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ntgtq/btq16i0MZ3e/zrfVzFXA11RFbRNieK1f3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ntgtq/btq16i0MZ3e/zrfVzFXA11RFbRNieK1f3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fntgtq%2Fbtq16i0MZ3e%2FzrfVzFXA11RFbRNieK1f3K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;s1에 Loop를 돌려서 각 원소별 사용빈도를 map에 기록한다.&lt;/p&gt;
&lt;p&gt;예시의 경우 &lt;span&gt;&quot;ab&quot;,&lt;/span&gt;&lt;span&gt;&quot;eidbaooo&quot;를 input으로 받으므로 위과 같이 map이 생성된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7Ao2v/btq2c29PK1R/tud8XJE9eus4RvR9Gqkn6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7Ao2v/btq2c29PK1R/tud8XJE9eus4RvR9Gqkn6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7Ao2v/btq2c29PK1R/tud8XJE9eus4RvR9Gqkn6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7Ao2v%2Fbtq2c29PK1R%2Ftud8XJE9eus4RvR9Gqkn6k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wf5DS/btq16RCaro6/58hCeeOGwkPoXjDELN6gq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wf5DS/btq16RCaro6/58hCeeOGwkPoXjDELN6gq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wf5DS/btq16RCaro6/58hCeeOGwkPoXjDELN6gq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwf5DS%2Fbtq16RCaro6%2F58hCeeOGwkPoXjDELN6gq1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;실제 로직은 다음과 같이 반복문이 된다.&lt;/p&gt;
&lt;p&gt;end 위치가 전체 길이보다 짧거나 같을때까지 loop를 돈다&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위와 같이 input을 받았다고 해보자&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;start와 end는 초깃값 0으로 각각 startletter, endletter 라는 포인터를 만들것인데, 이 포인터가 바뀌는 조건은 세가지가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1) endletter가 freq에 있는 경우 -&amp;gt; 해당 endletter의 freq값을 1 줄인다&lt;/p&gt;
&lt;p&gt;1-1) end와 start사이의 길이가 index 길이와 같다면 true를 리턴한다&lt;/p&gt;
&lt;p&gt;2) endletter는 없지만 startletter가 freq에 있는 경우 -&amp;gt; start letter를 1칸 우측으로 옮긴다&lt;/p&gt;
&lt;p&gt;3) 모두 없는 경우 -&amp;gt; end와 start를 모두 1칸 우측으로 옮긴다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DewNu/btq17YumSGg/yNxj2KWA5B35Iku6B2KvR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DewNu/btq17YumSGg/yNxj2KWA5B35Iku6B2KvR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DewNu/btq17YumSGg/yNxj2KWA5B35Iku6B2KvR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDewNu%2Fbtq17YumSGg%2FyNxj2KWA5B35Iku6B2KvR0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;493&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byfueY/btq2bKhPiaI/HBRhBHCl1B24b96zv2Qej0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byfueY/btq2bKhPiaI/HBRhBHCl1B24b96zv2Qej0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byfueY/btq2bKhPiaI/HBRhBHCl1B24b96zv2Qej0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyfueY%2Fbtq2bKhPiaI%2FHBRhBHCl1B24b96zv2Qej0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;493&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;순서대로 그려보면 다음과 같다&lt;/p&gt;
&lt;p&gt;즉, 조건1은 해당 letter가 있을 경우 freq에서 지수를 줄이는 역할을&lt;/p&gt;
&lt;p&gt;조건2는 해당 letter가 없을 경우 freq에서 줄였던 지수를 다시 늘리는 역할을 한다.&lt;/p&gt;
&lt;p&gt;조건3은 둘 다 해당하지 않는 경우 start와 end를 모두 옮기는 역할을 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n5Hh6/btq2c2vc6ZU/3BDADpRcvlxJWyzqOqlmp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n5Hh6/btq2c2vc6ZU/3BDADpRcvlxJWyzqOqlmp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n5Hh6/btq2c2vc6ZU/3BDADpRcvlxJWyzqOqlmp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn5Hh6%2Fbtq2c2vc6ZU%2F3BDADpRcvlxJWyzqOqlmp1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;이렇게 false인 경우에 대해서도 테스트해보자&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;524&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQa7s6/btq2aMNLmXK/i5Sz0ycIR3ueMmEb1fnBX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQa7s6/btq2aMNLmXK/i5Sz0ycIR3ueMmEb1fnBX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQa7s6/btq2aMNLmXK/i5Sz0ycIR3ueMmEb1fnBX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQa7s6%2Fbtq2aMNLmXK%2Fi5Sz0ycIR3ueMmEb1fnBX1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;524&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;그림처럼 a,b까지는 조건에 부합하므로 freq를 하나씩 줄이다가&lt;/p&gt;
&lt;p&gt;w를 만났을때는 조건과 어긋나므로 start를 옮기며 줄였던 freq를 다시 복원시켜준다&lt;/p&gt;
&lt;p&gt;이때 조건1은 0이 아닌 경우로 한정주어야 하는데, 그 이유는 'abc', 'aaabc'와 같은 케이스에서 a의 freq가 마이너스가 될 수도 있기 때문이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;풀이의 핵심을 요약하자면 다음과 같다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1) Map객체로 기준을 만들어준다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2) pointer를 두 개 생성하여 Loop를 돌며 기준을 변경한다 &amp;lt;--- sliding window&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3) 기준에 따른 리턴 조건을 만들어 준다. 이때 answer는 indexLength를 만족해야 한다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;비슷한 예시의 문제를 하나 더 풀어보자&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span&gt;예시2 - 438&lt;/span&gt;&lt;span&gt;. Find All Anagrams in a String&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBfP4N/btq18ozvMGy/PhxgcqM20kPoUD8hqgsEk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBfP4N/btq18ozvMGy/PhxgcqM20kPoUD8hqgsEk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBfP4N/btq18ozvMGy/PhxgcqM20kPoUD8hqgsEk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBfP4N%2Fbtq18ozvMGy%2FPhxgcqM20kPoUD8hqgsEk0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;input은 동일한데 조건을 만족하는 subset이 여러개 있을 수 있고, 해당 subset이 시작하는 letter의 위치를 리턴하라는 문제이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgpaFx/btq18EbmazL/x26cLnKKzPcbLvdlZPjWok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgpaFx/btq18EbmazL/x26cLnKKzPcbLvdlZPjWok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgpaFx/btq18EbmazL/x26cLnKKzPcbLvdlZPjWok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgpaFx%2Fbtq18EbmazL%2Fx26cLnKKzPcbLvdlZPjWok%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;아주 유사한 문제다&lt;/p&gt;
&lt;p&gt;다만 567번과 다르게 result라는 배열을 만들어 조건을 만족하는 인덱스를 담아 리턴해야된다는 부분만 다르다.&lt;/p&gt;</description>
      <category>프로그래밍-Science/LeetCode 문제 정리</category>
      <category>Array</category>
      <category>Sliding Window</category>
      <author>개발자1344</author>
      <guid isPermaLink="true">https://crmrelease.tistory.com/222</guid>
      <comments>https://crmrelease.tistory.com/222#entry222comment</comments>
      <pubDate>Fri, 9 Apr 2021 11:42:49 +0900</pubDate>
    </item>
    <item>
      <title>[Array, Sort, Stack] Merge Intervals</title>
      <link>https://crmrelease.tistory.com/221</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/416l4/btq12wwlRXs/klXYNUXXNxs64CjLk1S0u0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/416l4/btq12wwlRXs/klXYNUXXNxs64CjLk1S0u0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/416l4/btq12wwlRXs/klXYNUXXNxs64CjLk1S0u0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F416l4%2Fbtq12wwlRXs%2FklXYNUXXNxs64CjLk1S0u0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;start와 end로 이루어진 interval의 배열이 input으로 들어올 때, 범위가 중복되는 값을 합쳐서 리턴하라&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F3i68/btq1057oKys/yYM87CfGB5WKVClVWfSjq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F3i68/btq1057oKys/yYM87CfGB5WKVClVWfSjq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F3i68/btq1057oKys/yYM87CfGB5WKVClVWfSjq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF3i68%2Fbtq1057oKys%2FyYM87CfGB5WKVClVWfSjq1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;stack을 이용하여 풀이하였다&lt;/p&gt;
&lt;p&gt;오름차순으로 정렬 후, stack에 interval[0]를 기준으로 넣어 둔다&lt;/p&gt;
&lt;p&gt;interval[0][0]은 start, interval[0][1]은 end일 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이때 stack의 원소의 end보다(Loop가 돌면 마지막 원소와 비교하게 될 것) intervals의 start가 짧다면, 두개를 합친 배열로 stack의 end를 바꿔준다.&lt;/p&gt;
&lt;p&gt;그것이 아니라면 범위를 그대로 푸쉬해주면된다.&lt;/p&gt;</description>
      <category>프로그래밍-코딩테스트/LeetCode</category>
      <category>Array</category>
      <category>Stack</category>
      <author>개발자1344</author>
      <guid isPermaLink="true">https://crmrelease.tistory.com/221</guid>
      <comments>https://crmrelease.tistory.com/221#entry221comment</comments>
      <pubDate>Wed, 7 Apr 2021 14:09:56 +0900</pubDate>
    </item>
    <item>
      <title>[DP, Binary Search] Longest Increasing Subsequence</title>
      <link>https://crmrelease.tistory.com/220</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ3Erg/btq126RMT26/h8Ikk0WNp6IYtGRG58uw61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ3Erg/btq126RMT26/h8Ikk0WNp6IYtGRG58uw61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ3Erg/btq126RMT26/h8Ikk0WNp6IYtGRG58uw61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ3Erg%2Fbtq126RMT26%2Fh8Ikk0WNp6IYtGRG58uw61%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;무작위로 정렬되어 있는 정수를 원소로 가진 배열에 대해, 오름차순으로 정렬된 원소의 갯수를 구하라는 문제이다.&lt;/p&gt;
&lt;p&gt;DP와 Binary Search를 써서 풀 수 있는 문제&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzismy/btq14ZrlCWV/x0HwFPvwQJuPy5b8rzKgzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzismy/btq14ZrlCWV/x0HwFPvwQJuPy5b8rzKgzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzismy/btq14ZrlCWV/x0HwFPvwQJuPy5b8rzKgzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzismy%2Fbtq14ZrlCWV%2Fx0HwFPvwQJuPy5b8rzKgzK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;DP의 경우는 간단하다. nums의 길이만큼 1로 채운 dp 배열을 만든다&lt;/p&gt;
&lt;p&gt;이때 dp [ i ]는 nums의 i번째 원소의 longest Increasing Subsquence이다.&lt;/p&gt;
&lt;p&gt;원소가 하나만 들어오면 &lt;span style=&quot;color: #333333;&quot;&gt;longest Increasing Subsquence는 1개이므로 초깃값은 모두 1로 설정한다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;nums의 원소를 하나씩 Loop하면서 i보다 작은 j를 모두 검사한다.&lt;/p&gt;
&lt;p&gt;nums[ j ]가 nums[ i ]보다 작다면 오름차순으로 정렬이 되어 있다는 뜻이다.&lt;/p&gt;
&lt;p&gt;i보다 작은 j번째 원소를 기준으로 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;longest Increasing Subsquence가 n개라면, i번째 원소를 기준으로는 n+1개가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beWit9/btq10RnCsX4/mLuuD6FptO6hpGl9ZYzTOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beWit9/btq10RnCsX4/mLuuD6FptO6hpGl9ZYzTOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beWit9/btq10RnCsX4/mLuuD6FptO6hpGl9ZYzTOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeWit9%2Fbtq10RnCsX4%2FmLuuD6FptO6hpGl9ZYzTOk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;&lt;span style=&quot;color: #333333;&quot;&gt;여기서 주의할점은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;최종적으로 dp[nums.length]이 아닌 dp중 max를 리턴한다는것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;실제로 dp를 콘솔로 찍어보면 오름차순 원소가 나오지 않는다&lt;/p&gt;
&lt;p&gt;왜냐하면 dp[i]는 i원소를 반드시 포함시키는 조건이기 때문이다.&lt;/p&gt;
&lt;p&gt;예를들어 i가 4인경우, 실제 &lt;span style=&quot;color: #333333;&quot;&gt;longest Increasing Subsquence는 1-3-6-7-9가 되지만, dp[i]는 4를 포함해야하므로 1-3-4가 최댓값일것이기 때문이다. 따라서 이 경우는 3이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;dp[i]는 nums[i]를 반드시 포함한다고 생각해야 한다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6RsYL/btq101RgR55/GkH9Gd1y7EEqplGHKj13Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6RsYL/btq101RgR55/GkH9Gd1y7EEqplGHKj13Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6RsYL/btq101RgR55/GkH9Gd1y7EEqplGHKj13Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6RsYL%2Fbtq101RgR55%2FGkH9Gd1y7EEqplGHKj13Dk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;하지만 위의 방식으로 풀이하면 모든 nums[i]에 대해 일일이 Loop를 돌려야한다는 문제가 있다&lt;/p&gt;
&lt;p&gt;따라서 binary search를 이용해 루프를 줄일것이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;292&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beXmWo/btq1ZMG32I8/Kc9svd4LLpqKTF9BJ4ncc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beXmWo/btq1ZMG32I8/Kc9svd4LLpqKTF9BJ4ncc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beXmWo/btq1ZMG32I8/Kc9svd4LLpqKTF9BJ4ncc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeXmWo%2Fbtq1ZMG32I8%2FKc9svd4LLpqKTF9BJ4ncc0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;292&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;이 binary search는 일반적인 이진탐색과 달리 target을 middle에서 찾지 않고 조건에 따라 start를 리턴한다&lt;/p&gt;
&lt;p&gt;array는 항상 오름차순으로 정렬되어 있다.&lt;/p&gt;
&lt;p&gt;n이라는 타겟이 들어오는 경우 그 타겟의 위치를 찾아서, 가장 큰 값보다 크다면 array의 길이+1의 위치를, 그것이 아니라면 n이 들어갈 위치를 리턴한다.&lt;/p&gt;
&lt;p&gt;if로직이 target이 원소보다 작을때만 일반적인 이진트리 처리가 진행되고, 크다면 +1을 해서 리턴하기 때문이다&lt;/p&gt;
&lt;p&gt;이렇게 하면 n이 c보다 큰 경우에만 length가 늘어나게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnHSMd/btq14ZrngUD/Pa2bdbZbKO25iIOymllyGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnHSMd/btq14ZrngUD/Pa2bdbZbKO25iIOymllyGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnHSMd/btq14ZrngUD/Pa2bdbZbKO25iIOymllyGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnHSMd%2Fbtq14ZrngUD%2FPa2bdbZbKO25iIOymllyGK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;사실 이러한 문제는 &lt;b&gt;LIS&lt;/b&gt;라는 하나의 케이스로 알고 있어야 한다.&lt;/p&gt;
&lt;p&gt;기준 배열을(예시의 경우 memo) 하나두고, Binary Search는 memo의 마지막 element보다 작다면 해당 위치를 업데이트하고, 크다면 push한다.&lt;/p&gt;
&lt;p&gt;즉 마지막 element보다 큰 element가 들어올때만 답이 1씩 추가되는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이때 [1,1,1,1,1,1]처럼 같은 숫자가 들어오는 경우 정답은 1이지만, elem을 그대로 찾으면 1의 갯수만큼이 답으로 나온다&lt;/p&gt;
&lt;p&gt;조건이 target이 middle보다 작은경우와 아닌 경우로만 나눠져 있으므로, elem에서 1을 빼더라도 middle보다 작은 경우에 속하지 않는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;결과 length를 리턴하면 답이 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍-코딩테스트/LeetCode</category>
      <category>binary search</category>
      <category>DP</category>
      <category>Lis</category>
      <author>개발자1344</author>
      <guid isPermaLink="true">https://crmrelease.tistory.com/220</guid>
      <comments>https://crmrelease.tistory.com/220#entry220comment</comments>
      <pubDate>Wed, 7 Apr 2021 12:23:26 +0900</pubDate>
    </item>
    <item>
      <title>[DP] Partition Equal Subset Sum</title>
      <link>https://crmrelease.tistory.com/219</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMYQL9/btq1XhAyWsj/P9d1puEwA3rJD0i1gk99L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMYQL9/btq1XhAyWsj/P9d1puEwA3rJD0i1gk99L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMYQL9/btq1XhAyWsj/P9d1puEwA3rJD0i1gk99L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMYQL9%2Fbtq1XhAyWsj%2FP9d1puEwA3rJD0i1gk99L1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;nums라는 배열에 대해 두개의 subset을 만들어 각 subset 원소의 합이 같은 subset을 만들 수 있는지 여부를 리턴하라&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqRqvV/btq11NxUBrD/ttV9kPnwIYynzuTU6eA31K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqRqvV/btq11NxUBrD/ttV9kPnwIYynzuTU6eA31K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqRqvV/btq11NxUBrD/ttV9kPnwIYynzuTU6eA31K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqRqvV%2Fbtq11NxUBrD%2FttV9kPnwIYynzuTU6eA31K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;이때 dp [ i ]는 'i라는 부분합을 만들 수 있는지 여부'이다&lt;/p&gt;
&lt;p&gt;경계값은 total을 구해서, total을 반으로 나눌 수 없는 경우엔 조건 만족 불가능이다&lt;/p&gt;
&lt;p&gt;경계값에 해당하지 않는다면 total의 반을 target으로 만들어 dp를 돌릴것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eOvM4F/btq11zsYOak/16mUKCJfU1TB8YkZShvnhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eOvM4F/btq11zsYOak/16mUKCJfU1TB8YkZShvnhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eOvM4F/btq11zsYOak/16mUKCJfU1TB8YkZShvnhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeOvM4F%2Fbtq11zsYOak%2F16mUKCJfU1TB8YkZShvnhK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;nums의 각 element에 대해서, dp[complement]가 true라면 해당 dp[i]는 true이다&lt;/p&gt;
&lt;p&gt;예컨데 [1,5,11,5]라는 배열에 대해 target은 11이다.&lt;/p&gt;
&lt;p&gt;이 시점에서 dp[11] 은 dp[11-1]일 것이다. 왜냐하면 10을 만들 수 있다면, 1이 존재하기 때문에 11을 만들수 있다는 뜻이기 때문이다.&lt;/p&gt;
&lt;p&gt;같은 방식으로 dp[11]은 dp[11-1], dp[11-5], dp[11-11] , dp[11-5] 중 어느 하나라도 true라면 true이다.&lt;/p&gt;
&lt;p&gt;이 방식으로 Loop를 돌려 target에 대한 값이 true인 경우 리턴을 아닌 경우 loop를 바져나가 false를 리턴한다.&lt;/p&gt;</description>
      <category>프로그래밍-코딩테스트/LeetCode</category>
      <category>DP</category>
      <author>개발자1344</author>
      <guid isPermaLink="true">https://crmrelease.tistory.com/219</guid>
      <comments>https://crmrelease.tistory.com/219#entry219comment</comments>
      <pubDate>Tue, 6 Apr 2021 18:34:58 +0900</pubDate>
    </item>
    <item>
      <title>[Hash Table] Find All Anagrams in a String</title>
      <link>https://crmrelease.tistory.com/218</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QQhaF/btq11M6L7TL/stvJYNPPBVF6LKODeKVvn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QQhaF/btq11M6L7TL/stvJYNPPBVF6LKODeKVvn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QQhaF/btq11M6L7TL/stvJYNPPBVF6LKODeKVvn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQQhaF%2Fbtq11M6L7TL%2FstvJYNPPBVF6LKODeKVvn1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;s와 p를 input으로 주는데, index=n에서 끊으면 p의 anagrams으로만 구성된 s의 부분집합을 찾으라는 문제이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여기에는 sliding window라는 알고리즘을 적용할 수 있다&lt;/p&gt;
&lt;p&gt;슬라이딩 윈도우는 배열의 일정 범위 값을 비교할때 유용하다&lt;/p&gt;
&lt;p&gt;index를 두개 두고 범위만큼 조금씩 움직이는 방법이다&lt;/p&gt;
&lt;p&gt;모든 배열의 요소를 일일이 체크할 필요가 없기 때문이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duh9g5/btq1XguSj1h/nyL0gKeG14KsjgWuNgP5zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duh9g5/btq1XguSj1h/nyL0gKeG14KsjgWuNgP5zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duh9g5/btq1XguSj1h/nyL0gKeG14KsjgWuNgP5zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fduh9g5%2Fbtq1XguSj1h%2FnyL0gKeG14KsjgWuNgP5zk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;&lt;s&gt;s안에서 p의 anagram을 찾아야하기 때문에, left를 시작점, right를 p의 길이로 둔다&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;이후 left를 s의 길이가 되기 전까지 Loop에 돌려주는데, left-right구간만큼 배열을 substring하여 해당 구간을 sorting하고 비교한다.&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;이 둘이 같으면 시작index인 left를 결과에 집어넣는다&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;타임아웃 에러뜬다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍-코딩테스트/LeetCode</category>
      <category>HASH</category>
      <category>Sliding Window</category>
      <author>개발자1344</author>
      <guid isPermaLink="true">https://crmrelease.tistory.com/218</guid>
      <comments>https://crmrelease.tistory.com/218#entry218comment</comments>
      <pubDate>Tue, 6 Apr 2021 18:01:47 +0900</pubDate>
    </item>
    <item>
      <title>[Binary Search] Search a 2D Matrix II</title>
      <link>https://crmrelease.tistory.com/217</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSDxlt/btq1WKpl5p1/KUtVTv8bXFMd3M470STIaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSDxlt/btq1WKpl5p1/KUtVTv8bXFMd3M470STIaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSDxlt/btq1WKpl5p1/KUtVTv8bXFMd3M470STIaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSDxlt%2Fbtq1WKpl5p1%2FKUtVTv8bXFMd3M470STIaK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;2차원 matrix가 주어질때, target이 있는지 찾아라. 이때 행렬별로 모두 오름차순으로 정렬되어있다&lt;/p&gt;
&lt;p&gt;오름차순 배열에서 무언가를 찾으려면? binary search ㄱㄱ&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfQfEt/btq102vjOo9/EHbtZwrV52VGa0VKVzBEuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfQfEt/btq102vjOo9/EHbtZwrV52VGa0VKVzBEuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfQfEt/btq102vjOo9/EHbtZwrV52VGa0VKVzBEuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfQfEt%2Fbtq102vjOo9%2FEHbtZwrV52VGa0VKVzBEuk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;간단한 문제였지만 2차원 배열도 binary search를 한번 적용해 본다는 의미로 기억할만한 문제&lt;/p&gt;</description>
      <category>프로그래밍-코딩테스트/LeetCode</category>
      <category>binary search</category>
      <author>개발자1344</author>
      <guid isPermaLink="true">https://crmrelease.tistory.com/217</guid>
      <comments>https://crmrelease.tistory.com/217#entry217comment</comments>
      <pubDate>Tue, 6 Apr 2021 17:35:32 +0900</pubDate>
    </item>
    <item>
      <title>[DP] Maximal Square</title>
      <link>https://crmrelease.tistory.com/216</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coXiSp/btq1YlbeqnD/5LfiM03OausxBHLX97YMdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coXiSp/btq1YlbeqnD/5LfiM03OausxBHLX97YMdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coXiSp/btq1YlbeqnD/5LfiM03OausxBHLX97YMdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoXiSp%2Fbtq1YlbeqnD%2F5LfiM03OausxBHLX97YMdK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;1로 구성된 사각형의 최대 크기를 구한다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;719&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VlTY4/btq11ArImDR/yEjptI61Yw98ykADI8oUe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VlTY4/btq11ArImDR/yEjptI61Yw98ykADI8oUe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VlTY4/btq11ArImDR/yEjptI61Yw98ykADI8oUe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVlTY4%2Fbtq11ArImDR%2FyEjptI61Yw98ykADI8oUe0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;719&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;다음과 같은 원리를 적용해보았다&lt;/p&gt;
&lt;p&gt;크기와 모양이 같은 Matrix를 만든 후 , dp로 각각 순회한다&lt;/p&gt;
&lt;p&gt;1을 발견했을 때 왼쪽, 위쪽, 좌상단의 값이 모두 1이면 정사각형이 구성된다&lt;/p&gt;
&lt;p&gt;이 경우 길이가 2인 정사각형이 만들어지므로 해당 node를 2로 변경한다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBz8uI/btq10RHriBh/DOODp2w0zMxuVBqOkFPXtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBz8uI/btq10RHriBh/DOODp2w0zMxuVBqOkFPXtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBz8uI/btq10RHriBh/DOODp2w0zMxuVBqOkFPXtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBz8uI%2Fbtq10RHriBh%2FDOODp2w0zMxuVBqOkFPXtK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;일단 index가 되는 매트릭스를 구성하는데 input matrix에 행렬을 하나씩 더한 값으로 구성한다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uUZsq/btq1XMmGbCy/4lPs5xuPKhm0zk41r0LJwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uUZsq/btq1XMmGbCy/4lPs5xuPKhm0zk41r0LJwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uUZsq/btq1XMmGbCy/4lPs5xuPKhm0zk41r0LJwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuUZsq%2Fbtq1XMmGbCy%2F4lPs5xuPKhm0zk41r0LJwk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;왜냐하면 1.1 위치가 1일때 node를 1로 순회해주려면 기준값을 주는 것이 편하기 때문이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uGJgM/btq1WPw6y7q/XBN0mkUWKVEJGZ8dZIaEiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uGJgM/btq1WPw6y7q/XBN0mkUWKVEJGZ8dZIaEiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uGJgM/btq1WPw6y7q/XBN0mkUWKVEJGZ8dZIaEiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuGJgM%2Fbtq1WPw6y7q%2FXBN0mkUWKVEJGZ8dZIaEiK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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&gt;이후 루프를 도는데, 하나씩 돌면서 값이 1인 노드를 만나는 경우, 왼쪽,위쪽,좌상단쪽 중 가장 작은 값에 1을 더해 업데이트 해준다&lt;/p&gt;
&lt;p&gt;그게 아니라면 노드는 0으로 설정한다&lt;/p&gt;
&lt;p&gt;이렇게 업데이트 된 값은 정사각형을 구성할 수 있는 변의 최대길이가 될 것이기 때문에 그것이 max보다 크다면 max를 업데이트 해준다&lt;/p&gt;
&lt;p&gt;최종적으로 정사각형의 크기를 리턴하므로, max의 제곱을 리턴하면 된다.&lt;/p&gt;
&lt;p&gt;약간 새로운 유형의 dp라서 헷갈렸다&lt;/p&gt;</description>
      <category>프로그래밍-코딩테스트/LeetCode</category>
      <category>DP</category>
      <author>개발자1344</author>
      <guid isPermaLink="true">https://crmrelease.tistory.com/216</guid>
      <comments>https://crmrelease.tistory.com/216#entry216comment</comments>
      <pubDate>Tue, 6 Apr 2021 17:21:26 +0900</pubDate>
    </item>
  </channel>
</rss>