<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>SYDev</title>
    <link>https://sypdevlog.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 25 Jul 2026 06:22:13 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>시데브</managingEditor>
    <image>
      <title>SYDev</title>
      <url>https://tistory1.daumcdn.net/tistory/6440177/attach/3093161981114842bbbabf06a95ebaf0</url>
      <link>https://sypdevlog.tistory.com</link>
    </image>
    <item>
      <title>블로그 이전(tistory -&amp;gt; velog)</title>
      <link>https://sypdevlog.tistory.com/376</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로&amp;nbsp; &lt;a href=&quot;https://velog.io/@tkddud386/posts&quot;&gt;https://velog.io/@tkddud386&lt;/a&gt; 에 포스트 게시할 예정입니다&lt;/p&gt;
&lt;figure id=&quot;og_1768840088173&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;tkddud386 (sydev) / 작성글 - velog&quot; data-og-description=&quot;&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@tkddud386/posts&quot; data-og-url=&quot;https://velog.io/@tkddud386/posts&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://velog.io/@tkddud386/posts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@tkddud386/posts&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;tkddud386 (sydev) / 작성글 - velog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>시데브</author>
      <guid isPermaLink="true">https://sypdevlog.tistory.com/376</guid>
      <comments>https://sypdevlog.tistory.com/376#entry376comment</comments>
      <pubDate>Tue, 20 Jan 2026 01:27:29 +0900</pubDate>
    </item>
    <item>
      <title>[컴파일러] Chapter 6. Activation Records</title>
      <link>https://sypdevlog.tistory.com/375</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;경희대학교 허선영 교수님의 컴파일러 수업을 기반으로 정리한 글입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. Backgrounds&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Process in Memory&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Memory Layout&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Text section:&lt;/b&gt; 프로그램 코드&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Data section:&amp;nbsp;&lt;/b&gt;(uninitialized and initialized) 전역 변수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stack section:&amp;nbsp;&lt;/b&gt;일시적 데이터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 파라미터, 리턴 어드레스, 지역 변수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Heap section:&amp;nbsp;&lt;/b&gt;런타임에 동적으로 할당되는 메모리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ELF File Format&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Excecutable and Linkable Format&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;source program -&amp;gt; compiler -&amp;gt; &lt;b&gt;target binary&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;target binary의 포맷 중 하나&lt;/u&gt;가 ELF&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2146&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wksX2/btsNwpSvecS/1D8AdKMw9Xnfm6je1m0nYK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wksX2/btsNwpSvecS/1D8AdKMw9Xnfm6je1m0nYK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wksX2/btsNwpSvecS/1D8AdKMw9Xnfm6je1m0nYK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwksX2%2FbtsNwpSvecS%2F1D8AdKMw9Xnfm6je1m0nYK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2146&quot; height=&quot;999&quot; data-origin-width=&quot;2146&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일 결과를 sections 나누어서 저장&lt;/li&gt;
&lt;li&gt;단순히 machine codes만 저장하는 것이 X -&amp;gt; 프로그램을 실행하기 위해 필요한 정보들을 포함&lt;/li&gt;
&lt;li&gt;&lt;b&gt;stakc pointer&lt;/b&gt;: stack의 마지막 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Stack Frames&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1. Stack&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LIFO&amp;nbsp;&lt;/b&gt;data structure to&amp;nbsp;&lt;u&gt;hold local variables&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Higher Address&lt;/b&gt;에 위치하고,&amp;nbsp;&lt;u&gt;lower address를 향함&lt;/u&gt;&lt;u&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stack Pointer&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;top of the stack&lt;/u&gt;을 가리킴&lt;/li&gt;
&lt;li&gt;stack pointer의 &lt;u&gt;아랫 부분&lt;/u&gt; -&amp;gt;&amp;nbsp;&lt;b&gt;garbage&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;stack pointer의&amp;nbsp;&lt;u&gt;윗 부분&lt;/u&gt; -&amp;gt;&amp;nbsp;&lt;b&gt;local variables&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Memory -&amp;gt;&amp;nbsp;&lt;b&gt;byte addressable&amp;nbsp;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 bytes = 8 bits = 8 binary digits = 2 hexadecimal digits&amp;nbsp; &amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX0G1P/btsNwceTdmZ/IkoDRjC7dYuT9KnDqYjKc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX0G1P/btsNwceTdmZ/IkoDRjC7dYuT9KnDqYjKc1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX0G1P/btsNwceTdmZ/IkoDRjC7dYuT9KnDqYjKc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX0G1P%2FbtsNwceTdmZ%2FIkoDRjC7dYuT9KnDqYjKc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;561&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- operations&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CPU 명령어&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Push(x)&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;stack_pointer--;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;M[stack_pointer] = x;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;x = Pop()&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;x = M[stack_ponter];&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;stack_pointer++;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kLl7l/btsNwJDmq09/XuwojRCZDzQgnMnGKXozKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kLl7l/btsNwJDmq09/XuwojRCZDzQgnMnGKXozKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kLl7l/btsNwJDmq09/XuwojRCZDzQgnMnGKXozKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkLl7l%2FbtsNwJDmq09%2FXuwojRCZDzQgnMnGKXozKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;431&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2. Stack Frames&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Activation Record&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;함수 하나하나에 할당이 된 Area on the stack
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;On&amp;nbsp;&lt;b&gt;entry&lt;/b&gt;: &lt;b&gt;stack grows &lt;/b&gt;-&amp;gt; 새로운 &lt;u&gt;stack frame&lt;/u&gt;을 유지
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;함수를 호출할 때&lt;/u&gt;, 생성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;stack overflow?&amp;nbsp;&lt;/b&gt;-&amp;gt; 재귀적으로 자신을 계속 호출하면서, stack frame을 새로 쌓아가다가, stack size를 넘어서면 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;On&amp;nbsp;&lt;b&gt;retrun&lt;/b&gt;:&amp;nbsp;&lt;b&gt;stack shrinks&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Frame Pointer(FP):&amp;nbsp;&lt;/b&gt;&lt;u&gt;현재 함수의 stack frame의 시작점&lt;/u&gt;을 가리킴&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1285&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1Y1t3/btsNwPpo3gn/j8I5PuxKhVlTIRowzdVTKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1Y1t3/btsNwPpo3gn/j8I5PuxKhVlTIRowzdVTKK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1Y1t3/btsNwPpo3gn/j8I5PuxKhVlTIRowzdVTKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1Y1t3%2FbtsNwPpo3gn%2Fj8I5PuxKhVlTIRowzdVTKK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;610&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1285&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 함수 호출 과정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;g가 Caller, f가 Callee&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2818&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SJiyw/btsNv7cL6Re/dz2ksrSISCYxzLUCminza0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SJiyw/btsNv7cL6Re/dz2ksrSISCYxzLUCminza0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SJiyw/btsNv7cL6Re/dz2ksrSISCYxzLUCminza0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSJiyw%2FbtsNv7cL6Re%2Fdz2ksrSISCYxzLUCminza0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2818&quot; height=&quot;1000&quot; data-origin-width=&quot;2818&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;f 호출&amp;nbsp;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기존 FP 저장&lt;/li&gt;
&lt;li&gt;현재 SP를 FP에 할당&lt;/li&gt;
&lt;li&gt;SP는 새로운 stack frame의 크기(N)만큼 아래로&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;return
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;현재의 FP를 SP에 할당&lt;/li&gt;
&lt;li&gt;저장된 FP를 FP에 복원&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cieIRl/btsNwaVMllP/YKKK9GkF9aj4DGfedEd9Ak/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cieIRl/btsNwaVMllP/YKKK9GkF9aj4DGfedEd9Ak/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cieIRl/btsNwaVMllP/YKKK9GkF9aj4DGfedEd9Ak/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcieIRl%2FbtsNwaVMllP%2FYKKK9GkF9aj4DGfedEd9Ak%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;519&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수의 호출은 다음의 인스턴스화를 의미
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Local Variables&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Parameters&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Return Addresses&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Other temopraries&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Arguments&lt;/b&gt; &lt;u&gt;accessed by&lt;/u&gt; &lt;b&gt;offset from FP&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;argument 1: M[ FP + a1 ]&lt;/li&gt;
&lt;li&gt;argument 2: M[ FP + a2 ]&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Caller Frame에&lt;/u&gt; 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Local Variables&lt;/b&gt; &lt;u&gt;accessed by&lt;/u&gt;&amp;nbsp;&lt;b&gt;offset from FP&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;local variable 1: M[ FP - i1 ]&lt;/li&gt;
&lt;li&gt;local variable 2: M[ FP - i2]&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Frame 내부에&lt;/u&gt; 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dynamic Link(Control Link)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;FP 백업&amp;nbsp;&lt;/b&gt;-&amp;gt;&amp;nbsp;&lt;u&gt;caller의 stack frame을 가리킴&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;current stack frame의 return 시에 복원하기 위함&lt;/li&gt;
&lt;li&gt;compile time 시에,&amp;nbsp;&lt;u&gt;caller frame의 사이즈가 고정&lt;/u&gt;됐다는 것을 알 수 있으면 필수 X&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.3. Stack Frame Organization&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Calling Convention&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Calling Convention&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마이크로 프로세서 제조사는 모든 컴파일러가 사용하는 &quot;표준&quot; 레이아웃 방식을 지정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex)&amp;nbsp;&lt;b&gt;매개변수는 어디에 배치되는가? 매개변수는 어떤 순서로 전달되는가?&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모든 컴파일러가 &lt;u&gt;같은 calling conventions 사용&lt;/u&gt; -&amp;gt; 하나의 컴파일러로&amp;nbsp;&lt;u&gt;&lt;b&gt;다른 컴파일러로 컴파일된 함수를 호출&lt;/b&gt;&lt;/u&gt; 가능&lt;/li&gt;
&lt;li&gt;OS/Libraries와 상호작용에 필수적&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Registers&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Registers&lt;/b&gt; are &lt;u&gt;faster than memory&lt;/u&gt;&lt;b&gt;&lt;u&gt;&lt;/u&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;컴파일러는 가능한 register에 값을 저장해놔야 함&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Calling conventio&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Caller-save registers:&amp;nbsp;&lt;/b&gt;&lt;u&gt;caller가 저장해야 하는&lt;/u&gt; 레지스터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;callee 호출 이후 사용될 레지스터 values -&amp;gt; 미리 stack에 저장&lt;/li&gt;
&lt;li&gt;Callee function은 해당 레지스터 값들을 저장하지 않고, caller-save registers 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Calle-save registers:&amp;nbsp;&lt;/b&gt;&lt;u&gt;callee가 저장해야 하는&lt;/u&gt; 레지스터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNLXlS/btsNt7ydxLa/ojsEjGBjjmeIFJCP7T3kKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNLXlS/btsNt7ydxLa/ojsEjGBjjmeIFJCP7T3kKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNLXlS/btsNt7ydxLa/ojsEjGBjjmeIFJCP7T3kKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNLXlS%2FbtsNt7ydxLa%2FojsEjGBjjmeIFJCP7T3kKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;302&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; caller save registers, callee save registers의 저장 &amp;gt;&amp;gt; 해당 레지스터들을 callee 내부에서 자유롭게 사용 가능&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Registers가&amp;nbsp;&lt;/b&gt;&lt;b&gt;저장하는 것들&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Parameters&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Return Values&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Intermediate results of expressions(temporaries) &lt;/b&gt;-&amp;gt; 프로그램 실행 중간 결과&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Stack&amp;nbsp;&lt;/b&gt;&lt;b&gt;Frame&lt;/b&gt;&lt;b&gt;이 저장하는 것들&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;register에 저장하기에 크기가 큰&lt;/u&gt; variables&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Array variables&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Passing Parameters&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;f(a1, a2, ..., an)&lt;/li&gt;
&lt;li&gt;Modern calling convention
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;a1, ..., ak를 &lt;u&gt;registers r1, ..., rk에 저장&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;나머지 ak, ..., an을 &lt;u&gt;stack에 저장&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nyLwp/btsNwcfasXH/EASKoPKlUbRNPU89wVtz20/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nyLwp/btsNwcfasXH/EASKoPKlUbRNPU89wVtz20/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nyLwp/btsNwcfasXH/EASKoPKlUbRNPU89wVtz20/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnyLwp%2FbtsNwcfasXH%2FEASKoPKlUbRNPU89wVtz20%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;253&quot; height=&quot;337&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 나중에 해당 레지스터들을 사용할 필요가 생기면, 해당 레지스터 값들도 f함수 내부에서 push 진행될 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C language에서는&amp;nbsp;&lt;b&gt;former parameter(argument)&lt;/b&gt;&lt;b&gt;의 주소(pointer)&lt;/b&gt;에 &lt;u&gt;접근 가능&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pointer -&amp;gt;&amp;nbsp;&lt;b&gt;메모리에 해당 주소값이 저장돼있다는 의미&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;parameters가 레지스터로 옮겨지더라도,&amp;nbsp;&lt;b&gt;주소를 위한 공간&lt;/b&gt;은 반드시 할당되어야 함!!&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stack frame이 사라질 때, 해당 주소값이 함께 사라질 수 있음 -&amp;gt;&amp;nbsp;&lt;b&gt;Dangling Reference&lt;/b&gt; 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nested Functions with Returned Function&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현대 언어의 nested function의 경우&amp;nbsp;&lt;b&gt;local variables&lt;/b&gt;를&amp;nbsp;&lt;b&gt;heap&lt;/b&gt;에 저장해야 함&lt;/li&gt;
&lt;li&gt;ex) 함수 f(x)는 g(y)라는 함수를 반환하는데, g(y)는 x + y를 반환하는 함수이다.&lt;/li&gt;
&lt;li&gt;하지만, 함수 f(x)가 종료된 시점에 x에 대한 정보가 사라지면 g(y)에서는 이를 사용할 수가 없다.&lt;/li&gt;
&lt;li&gt;따라서 stack이 아닌 heap에 x를 저장하여 보존&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Return Address&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;function call을 모두 수행하고 나서&lt;/u&gt;, &lt;b&gt;다시 돌아가야할 명령어의 주소&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;calling convention에 따라&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;x86 -&amp;gt; on the stack&lt;/li&gt;
&lt;li&gt;arm -&amp;gt; in a register&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Callee-save register&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Static Links&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Dynamic Link:&lt;/b&gt; 이런 frame의 시작점을 FP에 할당하는 방식&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Static Link&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;outer function's stack frame에 접근&lt;/u&gt;하고자할 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjdMuk/btsNwbADS1S/OktBACb566jYiWHKXHLIMk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjdMuk/btsNwbADS1S/OktBACb566jYiWHKXHLIMk/img.jpg&quot; data-origin-width=&quot;1323&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.8009%; margin-right: 10px;&quot; data-widthpercent=&quot;46.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjdMuk/btsNwbADS1S/OktBACb566jYiWHKXHLIMk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjdMuk%2FbtsNwbADS1S%2FOktBACb566jYiWHKXHLIMk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1323&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m1PJ6/btsNvSBiwui/oW0HdY4hoHjolrHFVd4iDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m1PJ6/btsNvSBiwui/oW0HdY4hoHjolrHFVd4iDk/img.jpg&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 53.0363%;&quot; data-widthpercent=&quot;53.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m1PJ6/btsNvSBiwui/oW0HdY4hoHjolrHFVd4iDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm1PJ6%2FbtsNvSBiwui%2FoW0HdY4hoHjolrHFVd4iDk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1532&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>4학년 1학기 전공/컴파일러</category>
      <author>시데브</author>
      <guid isPermaLink="true">https://sypdevlog.tistory.com/375</guid>
      <comments>https://sypdevlog.tistory.com/375#entry375comment</comments>
      <pubDate>Wed, 23 Apr 2025 21:24:24 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] Chapter 3. 동적계획(Dynamic Programming)</title>
      <link>https://sypdevlog.tistory.com/374</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;경희대학교 한치근 교수님의 알고리즘 수업을 기반으로 정리한 글입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dynamic Programming&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;divide-and-conquer(분할정복식, 재귀):&amp;nbsp;&lt;u&gt;top-down&lt;/u&gt; 해결법&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dynamic Programming:&amp;nbsp;&lt;/b&gt;&lt;u&gt;bottom-up&lt;/u&gt; 해결법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작은 문제 해결 먼저 -&amp;gt; 결과를 큰 문제의 해결로 확산
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;재귀 관계식(recursive property) 정립&lt;/li&gt;
&lt;li&gt;작은 사례를 먼저 해결하는 상향식 방법으로 진행&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 이항계수 구하기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnfYxn/btsNsc6c6Cb/LuZo5xfOlfK8Ye6ICypNIK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnfYxn/btsNsc6c6Cb/LuZo5xfOlfK8Ye6ICypNIK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnfYxn/btsNsc6c6Cb/LuZo5xfOlfK8Ye6ICypNIK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnfYxn%2FbtsNsc6c6Cb%2FLuZo5xfOlfK8Ye6ICypNIK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1640&quot; height=&quot;1000&quot; data-origin-width=&quot;1640&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제:&amp;nbsp;&lt;/b&gt;이항계수를 계산&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력:&amp;nbsp;&lt;/b&gt;음수가 아닌 정수 n과 k, 여기서 k &amp;lt;= n&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력:&amp;nbsp;&lt;/b&gt;bin, nCk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lXbsn/btsNry2YpHy/YYY5FTquVxtb0JomzzHRKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lXbsn/btsNry2YpHy/YYY5FTquVxtb0JomzzHRKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXbsn/btsNry2YpHy/YYY5FTquVxtb0JomzzHRKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXbsn%2FbtsNry2YpHy%2FYYY5FTquVxtb0JomzzHRKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1192&quot; height=&quot;362&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 시간복잡도(분할정복식 접근방법)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;귀납증명에 따라, nCk를 구하기 위해서 알고리즘이 계산하는 항(term)의 개수는 &lt;b&gt;2*nCk - 1&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 동적계획법 알고리즘 설계전략&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;recursive property 정립&lt;/li&gt;
&lt;li&gt;nCk를 구하기 위해서 B[0][0]부터 시작하여 위에서 아래로 재귀 관계식을 적용하여 배열을 채워 나가면 됨&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TA9pj/btsNrnAGhgb/Lw2dCXakdxysplXCJ8jYh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TA9pj/btsNrnAGhgb/Lw2dCXakdxysplXCJ8jYh0/img.png&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;472&quot; data-is-animation=&quot;false&quot; style=&quot;width: 71.51%; margin-right: 10px;&quot; data-widthpercent=&quot;72.35&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TA9pj/btsNrnAGhgb/Lw2dCXakdxysplXCJ8jYh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTA9pj%2FbtsNrnAGhgb%2FLw2dCXakdxysplXCJ8jYh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;936&quot; height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pkMJN/btsNnWDMQUZ/MSKPoopN0LxF0qvCQIvdC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pkMJN/btsNnWDMQUZ/MSKPoopN0LxF0qvCQIvdC1/img.png&quot; data-origin-width=&quot;194&quot; data-origin-height=&quot;256&quot; data-is-animation=&quot;false&quot; style=&quot;width: 27.3272%;&quot; data-widthpercent=&quot;27.65&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pkMJN/btsNnWDMQUZ/MSKPoopN0LxF0qvCQIvdC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpkMJN%2FbtsNnWDMQUZ%2FMSKPoopN0LxF0qvCQIvdC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;194&quot; height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총 수행횟수는 &lt;b&gt;&lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;isin;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(nk)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 최단경로 문제(all-pairs shortest paths problem)&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 그래프 용어&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정점(vertex, node), 이음선(edge, arc)&lt;/li&gt;
&lt;li&gt;방향 그래프(directed graph/digraph)&lt;/li&gt;
&lt;li&gt;가중치(weight), 가중치 포함 그래프(weighted graph)&lt;/li&gt;
&lt;li&gt;경로(path): 각 정점에서 다음 정점을 잇는 이음선이 존재하는 일련의 정점들&lt;/li&gt;
&lt;li&gt;단순경로(simple path): 같은 정점을 두 번 지나지 않는 경로&lt;/li&gt;
&lt;li&gt;순환(cycle): 한 정점에서 다시 그 정점으로 돌아오는 경로&lt;/li&gt;
&lt;li&gt;순환 그래프(cyclic graph) vs 비순환 그래프(acyclic graph)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cycle이 있는 그래프 vs 없는 그래프&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;길이(length): 경로상에 있는 가중치의 합(가중치 포함 그래프). 경로상의 이음선의 개수(가중치가 없는 그래프)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. all-pairs shortest paths problem&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제:&amp;nbsp;&lt;/b&gt;가중치 포함, 방향성 그래프에서 최단경로 찾기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최적화문제(optimization problem)&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 문제에 대하여 하나 이상의 많은 해답이 존재할 때, 이 가운데에서 optimal solution을 찾아야 하는 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Adjacency Martix: W&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpYpEE/btsNo0FI8vX/obgKzzL8EqQsB3hcqbwuZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpYpEE/btsNo0FI8vX/obgKzzL8EqQsB3hcqbwuZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpYpEE/btsNo0FI8vX/obgKzzL8EqQsB3hcqbwuZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpYpEE%2FbtsNo0FI8vX%2FobgKzzL8EqQsB3hcqbwuZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1212&quot; height=&quot;226&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Brute-force algorithm&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 정점에서 다른 정점으로의&amp;nbsp;&lt;b&gt;가능한 모든 경로&lt;/b&gt;들의 길이를 구한 뒤, 그들 중에서 최소 길이의 경로를 탐색&lt;/li&gt;
&lt;li&gt;분석
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n개의 정점이 모두 연결된 상태&lt;/li&gt;
&lt;li&gt;처음에 선택 가능한 정점 n-2개, n-1개, ...&lt;/li&gt;
&lt;li&gt;총 경로의 개수는 &lt;b&gt;(n-2)!&amp;nbsp;&lt;/b&gt;-&amp;gt; 지수함수보다 큰 시간복잡도&amp;nbsp;&lt;b&gt;비효율적!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Dynamic Programming&amp;nbsp;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;case 1:&lt;/b&gt; { v1, v2, .. ,vk }의 정점들만을 통해서, v_i에서 v_j로 가는 최단경로가 v_k를 거치지 않는 경우&lt;/li&gt;
&lt;li&gt;&lt;b&gt;case 2&lt;/b&gt;: { v1, v2, .. ,vk }의 정점들만을 통해서&lt;b&gt;, &lt;/b&gt;v_i에서 v_j로 가는 최단경로가 v_k를 거치는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ngDUN/btsNrxiLH6t/SZitQ1w7CwY5199GhGw6OK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ngDUN/btsNrxiLH6t/SZitQ1w7CwY5199GhGw6OK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ngDUN/btsNrxiLH6t/SZitQ1w7CwY5199GhGw6OK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FngDUN%2FbtsNrxiLH6t%2FSZitQ1w7CwY5199GhGw6OK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1130&quot; height=&quot;752&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. Floyd의 알고리즘 1&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제:&lt;/b&gt; 가중치 포함 그래프의 각 정점에서 다른 모든 정점까지의 최단거리를 계산하라&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력:&amp;nbsp;&lt;/b&gt;가중치 포함, 방향성 그래프 W와 그 그래프에서의 정점의 수 n&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력:&amp;nbsp;&lt;/b&gt;최단거리의 길이 포함된 배열 D&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lzuNf/btsNrlQIjPO/L1GNJQHyskXHjLL9QLmmE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lzuNf/btsNrlQIjPO/L1GNJQHyskXHjLL9QLmmE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lzuNf/btsNrlQIjPO/L1GNJQHyskXHjLL9QLmmE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlzuNf%2FbtsNrlQIjPO%2FL1GNJQHyskXHjLL9QLmmE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1116&quot; height=&quot;316&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 시간복잡도&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;every case&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단위연산:&amp;nbsp;&lt;/b&gt;for-j 루프 안의 지정문&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력크기:&amp;nbsp;&lt;/b&gt;그래프에서의 정점의 수 n
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;T(n) = n * n * n = n^3 &lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;isin;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^3)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- 3차원 배열이 필요하지 않은 이유&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k는 가장 늦게 증가하기 때문에, k번째 node를 경유하는 상태를 계산할 때, k를 중간에 넣기 전 상태이므로 덮어써도 문제 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. Floyd의 알고리즘 2&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;출력:&amp;nbsp;&lt;/b&gt;최단경로의 길이가 포함된 배열 D, 다음을 만족하는 배열 P&lt;/li&gt;
&lt;li&gt;&lt;b&gt;P[i][j]&lt;/b&gt;: i에서 j까지 가는 최단 경로 중, j 바로 이전에 들른 노드
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;vi에서 vj까지 가는 최단경로의 중간에 놓여 있는 정점이 최소한 하나는 있는 경우 -&amp;gt; 놓여 있는 정점 중에서 가장 큰 인덱스&lt;/li&gt;
&lt;li&gt;최단경로의 중간에 놓여 있는 정점이 없는 경우 -&amp;gt; 0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3luO9/btsNrjL66Nv/qIMW4aiCof5GJLwLHfqdQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3luO9/btsNrjL66Nv/qIMW4aiCof5GJLwLHfqdQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3luO9/btsNrjL66Nv/qIMW4aiCof5GJLwLHfqdQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3luO9%2FbtsNrjL66Nv%2FqIMW4aiCof5GJLwLHfqdQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1262&quot; height=&quot;582&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sCi4F/btsNsmHg5yZ/sbkMF2aVUUU3TVglB6NbC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sCi4F/btsNsmHg5yZ/sbkMF2aVUUU3TVglB6NbC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sCi4F/btsNsmHg5yZ/sbkMF2aVUUU3TVglB6NbC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsCi4F%2FbtsNsmHg5yZ%2FsbkMF2aVUUU3TVglB6NbC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1274&quot; height=&quot;1000&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.4. 최적의 원칙&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;the principle of optimality&lt;/b&gt;: 어떤 문제 사례에 대한 최적 해가 그 사례를 분할한 부분 사례에 대한 최적해를 항상 포함하고 있는 경우&lt;/li&gt;
&lt;li&gt;&lt;u&gt;최적의 원칙이 적용&lt;/u&gt;되어야 -&amp;gt; 동적 계획법 사용 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) 최단 경로 구하는 문제에서, vk를 vi에서 vj로 가는 최적 경로 상의 정점이라고 하면&lt;/li&gt;
&lt;li&gt;vi에서 vk로 가는 부분경로 &amp;amp; vk에서 vj로 가는 부분경로도 반드시 최적이어야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 최적의 원칙이 적용되지 않는 예:&amp;nbsp;&lt;b&gt;최장경로(longest path) 문제&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHQGjE/btsNsOjgbsd/VKxrmj94KXLQVw7oKvlKl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHQGjE/btsNsOjgbsd/VKxrmj94KXLQVw7oKvlKl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHQGjE/btsNsOjgbsd/VKxrmj94KXLQVw7oKvlKl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHQGjE%2FbtsNsOjgbsd%2FVKxrmj94KXLQVw7oKvlKl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;378&quot; height=&quot;516&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;v1에서 v4로의 최장경로는 [v1, v3, v2, v4]&lt;/li&gt;
&lt;li&gt;그러나 이 경로의 부분경로인 v1에서 v3으로의 최장경로는 [v1, v3]이 아니고, [v1, v2, v3]이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 연쇄 행렬 곱셈(matrix-chain multiplication)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDdfCr/btsNrprN8Ez/uQCamQC6SIXvW68WVsomuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDdfCr/btsNrprN8Ez/uQCamQC6SIXvW68WVsomuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDdfCr/btsNrprN8Ez/uQCamQC6SIXvW68WVsomuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDdfCr%2FbtsNrprN8Ez%2FuQCamQC6SIXvW68WVsomuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;904&quot; height=&quot;596&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;i x j 행렬과 j x k 행렬을 곱하기 위해서는 &lt;b&gt;i x j x k번의 곱셈&lt;/b&gt;이 필요&lt;/li&gt;
&lt;li&gt;연쇄적으로 행렬곱셈을 수행할 때, &lt;u&gt;어떤 행렬곱셈을 먼저 수행하느냐&lt;/u&gt;에 따라 &lt;b&gt;필요한 총 곱셈의 횟수가 달라짐&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;ex) A1 x A2 X A3&lt;/li&gt;
&lt;li&gt;A1의 크기는 10 X 100, A2의 크기 100 X 5, A3의 크기 5 X 50&lt;/li&gt;
&lt;li&gt;(A1 X A2) X A3 곱셈의 총 횟수 7500 = 5000 + 2500
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(10 * 100 * 5) + (10 * 5 * 50)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A1 X (A2 X A3) 곱셈의 총 횟수 75000 = 25000 + 50000
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;(10 * 100 * 50) + (100 * 5 * 50)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. Brute-force&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간복잡도 최소 exponential-time&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wQopJ/btsNrizKkqq/yUtK0qXrRPc0Fc65JPwqFK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wQopJ/btsNrizKkqq/yUtK0qXrRPc0Fc65JPwqFK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wQopJ/btsNrizKkqq/yUtK0qXrRPc0Fc65JPwqFK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwQopJ%2FbtsNrizKkqq%2FyUtK0qXrRPc0Fc65JPwqFK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1858&quot; height=&quot;1000&quot; data-origin-width=&quot;1858&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Brute Force의 모든 가능한 가지 수 P(n)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;P(n) = C(n - 1): Catalan Number&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKdOTy/btsNskbSThO/yZv5Ki4VS10KJwBrQaHbAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKdOTy/btsNskbSThO/yZv5Ki4VS10KJwBrQaHbAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKdOTy/btsNskbSThO/yZv5Ki4VS10KJwBrQaHbAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKdOTy%2FbtsNskbSThO%2FyZv5Ki4VS10KJwBrQaHbAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;338&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; n이 커질수록 기하급수적으로 커지므로 최적화 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. Dynamic Programming&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HGPyL/btsNoq5MTRa/o88eqKjAIk6kvODRJwJSa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HGPyL/btsNoq5MTRa/o88eqKjAIk6kvODRJwJSa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HGPyL/btsNoq5MTRa/o88eqKjAIk6kvODRJwJSa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHGPyL%2FbtsNoq5MTRa%2Fo88eqKjAIk6kvODRJwJSa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1502&quot; height=&quot;578&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DP 기본 개념
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;i ~ k 범위에서의 최소곱셈 &amp;amp; k + 1 ~ j까지의 범위에서의 최소 곱셈&lt;/li&gt;
&lt;li&gt;그 둘을 곱하는 곱셈의 횟수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- example&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cE2Ztq/btsNsbzyrgE/avFRo7cuWbOWr93A5r67o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cE2Ztq/btsNsbzyrgE/avFRo7cuWbOWr93A5r67o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cE2Ztq/btsNsbzyrgE/avFRo7cuWbOWr93A5r67o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcE2Ztq%2FbtsNsbzyrgE%2FavFRo7cuWbOWr93A5r67o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1368&quot; height=&quot;906&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;906&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;922&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyhKGd/btsNrzOqOKE/WOYsqIu9eS8WLKAGjDm6Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyhKGd/btsNrzOqOKE/WOYsqIu9eS8WLKAGjDm6Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyhKGd/btsNrzOqOKE/WOYsqIu9eS8WLKAGjDm6Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyhKGd%2FbtsNrzOqOKE%2FWOYsqIu9eS8WLKAGjDm6Ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1354&quot; height=&quot;922&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;922&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 최적 순서의 구축&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6LTnH/btsNpUyjiK3/GXhRvKz89q8Ibv0WgQtNCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6LTnH/btsNpUyjiK3/GXhRvKz89q8Ibv0WgQtNCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6LTnH/btsNpUyjiK3/GXhRvKz89q8Ibv0WgQtNCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6LTnH%2FbtsNpUyjiK3%2FGXhRvKz89q8Ibv0WgQtNCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;676&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m5xDC/btsNr99z32t/WqRGzKfwJZMYm3OjWnFX1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m5xDC/btsNr99z32t/WqRGzKfwJZMYm3OjWnFX1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m5xDC/btsNr99z32t/WqRGzKfwJZMYm3OjWnFX1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm5xDC%2FbtsNr99z32t%2FWqRGzKfwJZMYm3OjWnFX1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1084&quot; height=&quot;658&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvbwME/btsNskQwpdj/IlVRSjcsU5pFnKjJPNUuv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvbwME/btsNskQwpdj/IlVRSjcsU5pFnKjJPNUuv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvbwME/btsNskQwpdj/IlVRSjcsU5pFnKjJPNUuv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvbwME%2FbtsNskQwpdj%2FIlVRSjcsU5pFnKjJPNUuv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1368&quot; height=&quot;1006&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; M[i][j]를 구하기 위해서는 M[i][k]와 M[k+1][j]가 이미 구해져 있어야 함&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 시간복잡도&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;every case &amp;isin;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^3)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 최적 이진검색 트리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Optimal Binary Search Tree:&amp;nbsp;&lt;/b&gt;키를 찾는데 걸리는 평균시간이 최소가 되도록 구축된 트리&lt;/li&gt;
&lt;li&gt;각 키를 찾을 확률이 주어져 있을 때(모두 같지 않음), 키를 찾는데 걸리는 평균시간이 최소가 되도록 이진트리를 구축하는 문제&lt;/li&gt;
&lt;li&gt;notation
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;p_i = key_i의 검색 빈도 -&amp;gt; 얼마나 자주 검색되는지&lt;/li&gt;
&lt;li&gt;c_i = 주어진 트리에서 Key_i를 찾는데 필요한 비교횟수&lt;/li&gt;
&lt;li&gt;평균검색시간 = &amp;Sigma;(c_i * p_i)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7gegM/btsNtgAxrWU/27mi8knX2OkmYwjiHU9KSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7gegM/btsNtgAxrWU/27mi8knX2OkmYwjiHU9KSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7gegM/btsNtgAxrWU/27mi8knX2OkmYwjiHU9KSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7gegM%2FbtsNtgAxrWU%2F27mi8knX2OkmYwjiHU9KSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1218&quot; height=&quot;314&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; DP에서는 매 단계가 1층 기준이므로, c_i = 1 -&amp;gt;&amp;gt; &amp;Sigma;p_i&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I66iD/btsNputo83t/o90DKPNRzdRMR0isZzUtQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I66iD/btsNputo83t/o90DKPNRzdRMR0isZzUtQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I66iD/btsNputo83t/o90DKPNRzdRMR0isZzUtQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI66iD%2FbtsNputo83t%2Fo90DKPNRzdRMR0isZzUtQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1266&quot; height=&quot;136&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 일반화 버전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 해당 일반화 식을 이용하여 표를 채운 이후, A[1][n]을 구하면, 해당 값이 최적값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A 배열: 최적 BST의 평균 검색 시간 -&amp;gt; 최적 BST의 모양은 알 수 없음&lt;/li&gt;
&lt;li&gt;R 배열: A 배열에 최적값을 넣는 순간 k의 값 -&amp;gt; 루트 노드가 k(좌측 서브트리가 1~k-1, 우측 서브트리가 k+1 ~ n)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJiTN6/btsNti5ZDG7/EdUtFmp0rBYT1syGMqTAl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJiTN6/btsNti5ZDG7/EdUtFmp0rBYT1syGMqTAl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJiTN6/btsNti5ZDG7/EdUtFmp0rBYT1syGMqTAl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJiTN6%2FbtsNti5ZDG7%2FEdUtFmp0rBYT1syGMqTAl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1296&quot; height=&quot;762&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1299&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b07MsO/btsNsprsnxq/VmFbghWulHKA8zh07FkAZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b07MsO/btsNsprsnxq/VmFbghWulHKA8zh07FkAZk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b07MsO/btsNsprsnxq/VmFbghWulHKA8zh07FkAZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb07MsO%2FbtsNsprsnxq%2FVmFbghWulHKA8zh07FkAZk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1299&quot; height=&quot;1000&quot; data-origin-width=&quot;1299&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/naBJM/btsNoZAnQzA/KZIZRSPlOz5W1Ht9k21b30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/naBJM/btsNoZAnQzA/KZIZRSPlOz5W1Ht9k21b30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/naBJM/btsNoZAnQzA/KZIZRSPlOz5W1Ht9k21b30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnaBJM%2FbtsNoZAnQzA%2FKZIZRSPlOz5W1Ht9k21b30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;372&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. DNA 서열 맞춤(sequence alignment)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동족서열(homologous sequence)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 종에서 출발하여, 교환, 삽입, 삭제 돌연변이에 의해 서열이 달라짐&lt;/li&gt;
&lt;li&gt;달라진 두 종에서 추출한 염기서열을 동족서열이라 함&lt;/li&gt;
&lt;li&gt;이 두 서열이 얼마나 다른지를 확인해서, 종족 간의 거리를 측정&lt;/li&gt;
&lt;li&gt;두 개의 염기서열을 어떻게 맞춰야 할까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DNA 서열 맞춤 문제: 두 개의 서열을 최소비용으로 맞추는 방법을 찾는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IPQTr/btsNsbmWGxH/xgKxGoI3pdsIfP7B422Pe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IPQTr/btsNsbmWGxH/xgKxGoI3pdsIfP7B422Pe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IPQTr/btsNsbmWGxH/xgKxGoI3pdsIfP7B422Pe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIPQTr%2FbtsNsbmWGxH%2FxgKxGoI3pdsIfP7B422Pe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1038&quot; height=&quot;298&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;opt(i, j):&amp;nbsp;&lt;/b&gt;부분 서열 x[i, ..., 9]와 y[j, ..., 7]의 최적 맞춤 비용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;opt(0, 0):&amp;nbsp;&lt;/b&gt;부분 서열 x[0, ..., 9]와 y[0, ..., 7]의 최적 맞춤 비용 -&amp;gt; 구하려는 최종 비용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/debC3b/btsNtidSjk7/YT44AFnNYv7bFaPX9b5Oz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/debC3b/btsNtidSjk7/YT44AFnNYv7bFaPX9b5Oz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/debC3b/btsNtidSjk7/YT44AFnNYv7bFaPX9b5Oz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdebC3b%2FbtsNtidSjk7%2FYT44AFnNYv7bFaPX9b5Oz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1014&quot; height=&quot;80&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;둘을 맞추는 경우 -&amp;gt; penalty = 0&lt;/li&gt;
&lt;li&gt;못 맞추는 경우 -&amp;gt; penalty = 1&lt;/li&gt;
&lt;li&gt;y쪽을 틈으로 비워두는 경우 -&amp;gt; +2&lt;/li&gt;
&lt;li&gt;x쪽을 틈으로 비워두는 경우 -&amp;gt; +2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEtICC/btsNsclTxnQ/Olm64vaqtGFWcKRMOjVD40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEtICC/btsNsclTxnQ/Olm64vaqtGFWcKRMOjVD40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEtICC/btsNsclTxnQ/Olm64vaqtGFWcKRMOjVD40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEtICC%2FbtsNsclTxnQ%2FOlm64vaqtGFWcKRMOjVD40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1370&quot; height=&quot;728&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Divide-and-Conquer 구현&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xHXPz/btsNscTLMtT/pq20DYRsPWlyeAkPmDCKmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xHXPz/btsNscTLMtT/pq20DYRsPWlyeAkPmDCKmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xHXPz/btsNscTLMtT/pq20DYRsPWlyeAkPmDCKmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxHXPz%2FbtsNscTLMtT%2Fpq20DYRsPWlyeAkPmDCKmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1300&quot; height=&quot;562&quot; data-origin-width=&quot;1300&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqhMzL/btsNtggjGeW/GzTOOh2giJ0l0qrUCPrLc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqhMzL/btsNtggjGeW/GzTOOh2giJ0l0qrUCPrLc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqhMzL/btsNtggjGeW/GzTOOh2giJ0l0qrUCPrLc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqhMzL%2FbtsNtggjGeW%2FGzTOOh2giJ0l0qrUCPrLc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;332&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 중복호출하는 경우가 너무 많아 비효율적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Dynamic Programming&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnVKnQ/btsNpuGUDVg/BycKeoXu5FmSXTmQzkha1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnVKnQ/btsNpuGUDVg/BycKeoXu5FmSXTmQzkha1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnVKnQ/btsNpuGUDVg/BycKeoXu5FmSXTmQzkha1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnVKnQ%2FbtsNpuGUDVg%2FBycKeoXu5FmSXTmQzkha1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1092&quot; height=&quot;886&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 틈 행과 틈 열을 채워 넣음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhmPai/btsNrZUBBu4/FAC3YVwxGvDEAgrIYv06k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhmPai/btsNrZUBBu4/FAC3YVwxGvDEAgrIYv06k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhmPai/btsNrZUBBu4/FAC3YVwxGvDEAgrIYv06k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhmPai%2FbtsNrZUBBu4%2FFAC3YVwxGvDEAgrIYv06k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1282&quot; height=&quot;888&quot; data-origin-width=&quot;1282&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 우측 아래부터 대각원소들을 채워 넣음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;902&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MOlMT/btsNsjrvurF/Sdo02GOuO0XZ59uwW04SC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MOlMT/btsNsjrvurF/Sdo02GOuO0XZ59uwW04SC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MOlMT/btsNsjrvurF/Sdo02GOuO0XZ59uwW04SC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMOlMT%2FbtsNsjrvurF%2FSdo02GOuO0XZ59uwW04SC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1010&quot; height=&quot;902&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;902&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt; 최적서열맞춤 찾아가는 방법&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;[0][0] 선택&lt;/li&gt;
&lt;li&gt;경로에 넣을 둘째 항목을 찾는다
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;[0][1] 검사&lt;/li&gt;
&lt;li&gt;[1][0] 검사&lt;/li&gt;
&lt;li&gt;[1][1] 검사&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGAIg7/btsNrZG6GGo/RLrlLCdVNBeh1QA9bSqnK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGAIg7/btsNrZG6GGo/RLrlLCdVNBeh1QA9bSqnK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGAIg7/btsNrZG6GGo/RLrlLCdVNBeh1QA9bSqnK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGAIg7%2FbtsNrZG6GGo%2FRLrlLCdVNBeh1QA9bSqnK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1334&quot; height=&quot;578&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt;&amp;gt; 맞춤된 서열을 구성하는 방법&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;최적배열의 오른쪽 맨 아래 구성에서 시작하여 표시해둔 경로를 따라감&lt;/li&gt;
&lt;li&gt;배열의 [i][j]칸에 도달하기 위해서&amp;nbsp;&lt;u&gt;대각선으로&lt;/u&gt; 이동할 때 마다,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;i번째 행에 해당하는 문자를 x서열에 넣고&lt;/li&gt;
&lt;li&gt;j번째 행에 해당하는 문자를 y 서열에 넣음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;배열의 [i][j]칸에 도달하기 위해서 &lt;u&gt;위로&lt;/u&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이동할 때 마다,&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;i번째 행에 해당하는 문자를 x서열에 넣고&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;틈 문자를 y서열에 넣음&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;배열의 [i][j]칸에 도달하기 위해서 &lt;u&gt;아래로&lt;/u&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이동할 때 마다&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;틈 문자를 x서열에 넣고&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;j번째 행에 해당하는 문자를 y서열에 넣음&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FiwPy/btsNth0kXvl/b4ADCLYVW1qfKmGI3zOgSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FiwPy/btsNth0kXvl/b4ADCLYVW1qfKmGI3zOgSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FiwPy/btsNth0kXvl/b4ADCLYVW1qfKmGI3zOgSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFiwPy%2FbtsNth0kXvl%2Fb4ADCLYVW1qfKmGI3zOgSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;627&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://gsmesie692.tistory.com/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://gsmesie692.tistory.com/116&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1745157068694&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;최적 이진 탐색 트리 (Optimal Binary Search Tree)&quot; data-og-description=&quot;이전 포스팅에서 설명했던 이진 탐색 트리 (BST) 의 활용 예를 보자. 설명할 때는 보통 이해하기 쉽게 노드에 들어있는 데이터를 숫자로 가정하지만, 실제로 쓰일 때는 문자열이라던가 더 다양한 &quot; data-og-host=&quot;gsmesie692.tistory.com&quot; data-og-source-url=&quot;https://gsmesie692.tistory.com/116&quot; data-og-url=&quot;https://gsmesie692.tistory.com/116&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZzFTb/hyYIczOO4c/ePjJIrFiEFc1MeKDxxJNTk/img.png?width=800&amp;amp;height=254&amp;amp;face=0_0_800_254,https://scrap.kakaocdn.net/dn/u6LSq/hyYFC60FB5/S4c84YWZeATKIvWuKUpsa1/img.png?width=800&amp;amp;height=254&amp;amp;face=0_0_800_254,https://scrap.kakaocdn.net/dn/sTdqR/hyYJEpq85J/Dh8IEhdlaIfoZqkEISnDA0/img.png?width=1736&amp;amp;height=507&amp;amp;face=0_0_1736_507&quot;&gt;&lt;a href=&quot;https://gsmesie692.tistory.com/116&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gsmesie692.tistory.com/116&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZzFTb/hyYIczOO4c/ePjJIrFiEFc1MeKDxxJNTk/img.png?width=800&amp;amp;height=254&amp;amp;face=0_0_800_254,https://scrap.kakaocdn.net/dn/u6LSq/hyYFC60FB5/S4c84YWZeATKIvWuKUpsa1/img.png?width=800&amp;amp;height=254&amp;amp;face=0_0_800_254,https://scrap.kakaocdn.net/dn/sTdqR/hyYJEpq85J/Dh8IEhdlaIfoZqkEISnDA0/img.png?width=1736&amp;amp;height=507&amp;amp;face=0_0_1736_507');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;최적 이진 탐색 트리 (Optimal Binary Search Tree)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이전 포스팅에서 설명했던 이진 탐색 트리 (BST) 의 활용 예를 보자. 설명할 때는 보통 이해하기 쉽게 노드에 들어있는 데이터를 숫자로 가정하지만, 실제로 쓰일 때는 문자열이라던가 더 다양한&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gsmesie692.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>4학년 1학기 전공/알고리즘</category>
      <author>시데브</author>
      <guid isPermaLink="true">https://sypdevlog.tistory.com/374</guid>
      <comments>https://sypdevlog.tistory.com/374#entry374comment</comments>
      <pubDate>Mon, 21 Apr 2025 01:01:46 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] Chapter 2. 분할정복법(Divide-and-Conquer)</title>
      <link>https://sypdevlog.tistory.com/373</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;경희대학교 한치근 교수님의 알고리즘 수업을 기반으로 정리한 글입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;분할정복(Divide-and-Conquer)식 설계 전략&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;분할(Divide):&amp;nbsp;&lt;/b&gt;해결하기 쉽도록 문제를 여러 개의 작은 부분으로 나눔&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정복(Conquer):&amp;nbsp;&lt;/b&gt;나눈 작은 문제를 각각 해결&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통합(Combine):&amp;nbsp;&lt;/b&gt;(필요하다면) 해결된 해답을 모음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 이런 문제 해결 방법을 &lt;b&gt;하향식(top-down)&amp;nbsp;&lt;/b&gt;접근방법이라 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 이분검색(binary search): 재귀식 방식&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설계 전략
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;x가 배열의 중간에 위치한 항목과 같으면 stop, 그렇지 않으면
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Divide:&amp;nbsp;&lt;/b&gt;배열을 반으로 나누어 x와 중앙값을 비교하여 배열 반쪽을 선택&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Conquer:&lt;/b&gt; 선택된 반쪽 배열에서 x를 찾음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1744695106216&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def bs(data, item, low, high):
    # item 존재 X
    if(low &amp;gt; high):
        return -1
    
    mid = (low + high) // 2

    # 탐색 성공
    if(item == data[mid]):
        return mid
    # 우측 배열
    elif(item &amp;gt; data[mid]):
        return bs(data, item, mid + 1, high)
    # 좌측 배열
    else:
        return bs(data, item, low, mid - 1)
    
data = [1, 3, 5, 6, 7, 9, 10, 13, 17, 19]
n = 10
location = bs(data, 17, 0, n - 1)
print(location)&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 시간복잡도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxHdRz/btsNivGeTLL/SdUyZOF0X0qkbqWkAbvf90/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxHdRz/btsNivGeTLL/SdUyZOF0X0qkbqWkAbvf90/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxHdRz/btsNivGeTLL/SdUyZOF0X0qkbqWkAbvf90/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxHdRz%2FbtsNivGeTLL%2FSdUyZOF0X0qkbqWkAbvf90%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;697&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDmxpm/btsNmEhCEHA/2BVKE5ODFlt7QHRXOmfdtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDmxpm/btsNmEhCEHA/2BVKE5ODFlt7QHRXOmfdtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDmxpm/btsNmEhCEHA/2BVKE5ODFlt7QHRXOmfdtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDmxpm%2FbtsNmEhCEHA%2F2BVKE5ODFlt7QHRXOmfdtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1316&quot; height=&quot;910&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 합병정렬(mergesort)&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Mergesort&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제:&amp;nbsp;&lt;/b&gt;n개의 정수를 비내림차순으로 정렬&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력:&amp;nbsp;&lt;/b&gt;정수 n, 크기가 n인 배열 S[1..n]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력:&amp;nbsp;&lt;/b&gt;비내림차순으로 정렬된 배열 S[1..n]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보기: &lt;/b&gt;27, 10, 12, 20, 25, 13, 15, 22&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yNFJl/btsNmfiCE01/4zsRuntkLurA8NJo3LEFNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yNFJl/btsNmfiCE01/4zsRuntkLurA8NJo3LEFNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yNFJl/btsNmfiCE01/4zsRuntkLurA8NJo3LEFNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyNFJl%2FbtsNmfiCE01%2F4zsRuntkLurA8NJo3LEFNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;998&quot; height=&quot;726&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;배열 S를 U와 V로 분할&lt;/li&gt;
&lt;li&gt;U와 V에 대해서 mergesort 호출&lt;/li&gt;
&lt;li&gt;U와 V에 대해서 merge 호출&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Merge&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제:&amp;nbsp;&lt;/b&gt;두 개의 정렬된 배열을 하나의 정렬된 배열로 합병하시오.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력:&amp;nbsp;&lt;/b&gt;(1) 양의 정수 h, m, (2) 정렬된 배열 U[1..h], V[1..m]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력:&amp;nbsp;&lt;/b&gt;U와 V에 있는 키들을 하나의 배열에 정렬한 S[1..h+m]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dd708/btsNlMHXlMk/IJu9HEYoxShklRWNjHYuK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dd708/btsNlMHXlMk/IJu9HEYoxShklRWNjHYuK1/img.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;358&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.4406%; margin-right: 10px;&quot; data-widthpercent=&quot;52.05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dd708/btsNlMHXlMk/IJu9HEYoxShklRWNjHYuK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDd708%2FbtsNlMHXlMk%2FIJu9HEYoxShklRWNjHYuK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qfRGO/btsNnvD0BEH/ZXzHQGkj6mFbzcfJu8AKrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qfRGO/btsNnvD0BEH/ZXzHQGkj6mFbzcfJu8AKrk/img.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;646&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.3966%;&quot; data-widthpercent=&quot;47.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qfRGO/btsNnvD0BEH/ZXzHQGkj6mFbzcfJu8AKrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqfRGO%2FbtsNnvD0BEH%2FZXzHQGkj6mFbzcfJu8AKrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1094&quot; height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3zS4S/btsNmshqqEG/7jIHkY5w07z9kAoIsdEB6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3zS4S/btsNmshqqEG/7jIHkY5w07z9kAoIsdEB6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3zS4S/btsNmshqqEG/7jIHkY5w07z9kAoIsdEB6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3zS4S%2FbtsNmshqqEG%2F7jIHkY5w07z9kAoIsdEB6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1124&quot; height=&quot;720&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;u&gt;U, V의 iterator&lt;/u&gt; &lt;b&gt;i, j&lt;/b&gt;를 선언, &lt;u&gt;i, j를 모두 추적&lt;/u&gt;하는 &lt;b&gt;k&lt;/b&gt;를 선언&lt;/li&gt;
&lt;li&gt;크기에 따라 i, j를 ++ -&amp;gt; k++&lt;/li&gt;
&lt;li&gt;i가 모두 돌았으면, j부터 m까지(나머지 부분)를 S에 copy | j가 모두 돌았으면 i부터 h까지를 S에 copy&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 시간복잡도&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단위연산: &lt;b&gt;U[i]와 V[j]의 비교&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;입력크기:&amp;nbsp;&lt;b&gt;2개의 입력 배열에 들어 있는 항목의 개수: h&amp;amp;m&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;i = h + 1, j = m인 상태로 loop에서 빠져나가는 경우&lt;/li&gt;
&lt;li&gt;ex) U: 4 5 6 7, V: 1 2 3 8&lt;/li&gt;
&lt;li&gt;&lt;b&gt;W(h, m) = h + m - 1&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단위연산:&amp;nbsp;&lt;b&gt;합병 알고리즘 merge에서 발생하는 비교&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;입력크기:&amp;nbsp;&lt;b&gt;배열 S에 들어 있는 항목의 개수 n&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;W(h, m) = W(h) + W(m) + h + m - 1&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;W(n) = 2W(n/2) + n - 1, W(1) = 0&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;W(n) &lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;isin;&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(nlgn)&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;-&amp;gt;&amp;nbsp;&lt;b&gt;도사정리&lt;/b&gt; 적용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coTTpI/btsNiyiAkCF/o6CzkOy1jncMWp29aWFm21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coTTpI/btsNiyiAkCF/o6CzkOy1jncMWp29aWFm21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coTTpI/btsNiyiAkCF/o6CzkOy1jncMWp29aWFm21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoTTpI%2FbtsNiyiAkCF%2Fo6CzkOy1jncMWp29aWFm21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1164&quot; height=&quot;652&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 공간복잡도&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;제자리정렬(in-place sort) 알고리즘:&amp;nbsp;&lt;/b&gt;추가적인 저장장소를 사용하지 않고 정렬하는 알고리즘&lt;/li&gt;
&lt;li&gt;mergesort는 &lt;b&gt;제자리 정렬이 X&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k4evg/btsNlYnWB0V/KBWfjn23gMlcWwDzo2Kg01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k4evg/btsNlYnWB0V/KBWfjn23gMlcWwDzo2Kg01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k4evg/btsNlYnWB0V/KBWfjn23gMlcWwDzo2Kg01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk4evg%2FbtsNlYnWB0V%2FKBWfjn23gMlcWwDzo2Kg01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;262&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;총 저장 장소의 크기:&amp;nbsp;&lt;b&gt;n + n/2 + n/4 + ... = 2n&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;b&gt;&lt;span&gt;2n &lt;/span&gt;&lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&amp;isin;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n)&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1744782594027&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def mergeSort(n, s):
    mid = n // 2
    u = s[:mid]
    v = s[mid:]
    h = len(u) 
    m = len(v) 
    
    if(n &amp;gt; 1):
        mergeSort(h, u)
        mergeSort(m, v)
        merge(h, m, u, v, s)
    

def merge(h, m, u, v, s):
    i = j = k = 0
    
    while(i &amp;lt; h and j &amp;lt; m):
        if(u[i] &amp;lt; v[j]):
            s[k] = u[i]
            i += 1
        else:
            s[k] = v[j]
            j += 1
        k += 1

    if(i &amp;gt;= h):
        remained = v[j:m]
        for value in remained:
            s[k] = value
            k += 1
    else:
        remained = u[i:h]
        for value in remained:
            s[k] = value
            k += 1&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 공간복잡도가 향상된 알고리즘&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWhAgD/btsNnn64y8D/IXxlg51t9HVVSYhebF7Fj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWhAgD/btsNnn64y8D/IXxlg51t9HVVSYhebF7Fj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWhAgD/btsNnn64y8D/IXxlg51t9HVVSYhebF7Fj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWhAgD%2FbtsNnn64y8D%2FIXxlg51t9HVVSYhebF7Fj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1190&quot; height=&quot;890&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;890&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 공간 재사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVDXKn/btsNiyQrH8s/APxyYjB9ho0o8Klkczx6C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVDXKn/btsNiyQrH8s/APxyYjB9ho0o8Klkczx6C1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVDXKn/btsNiyQrH8s/APxyYjB9ho0o8Klkczx6C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVDXKn%2FbtsNiyQrH8s%2FAPxyYjB9ho0o8Klkczx6C1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;236&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;792&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qd0vF/btsNmJbVgD8/q1Bq6qWeKt0PwJV7lOA6Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qd0vF/btsNmJbVgD8/q1Bq6qWeKt0PwJV7lOA6Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qd0vF/btsNmJbVgD8/q1Bq6qWeKt0PwJV7lOA6Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqd0vF%2FbtsNmJbVgD8%2Fq1Bq6qWeKt0PwJV7lOA6Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;910&quot; height=&quot;792&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;792&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 반으로 나눠진 S의 정렬된 형태를 U에 저장하다가, 마지막에 S로 최종 결과물을 복사&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcbblo/btsNlCw9zkO/sLlZSs0IE3HIwW2Bbf8bjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcbblo/btsNlCw9zkO/sLlZSs0IE3HIwW2Bbf8bjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcbblo/btsNlCw9zkO/sLlZSs0IE3HIwW2Bbf8bjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcbblo%2FbtsNlCw9zkO%2FsLlZSs0IE3HIwW2Bbf8bjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;364&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YalDT/btsNnkioXNt/C2kIPbvo0aS7yTiKlStWP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YalDT/btsNnkioXNt/C2kIPbvo0aS7yTiKlStWP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YalDT/btsNnkioXNt/C2kIPbvo0aS7yTiKlStWP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYalDT%2FbtsNnkioXNt%2FC2kIPbvo0aS7yTiKlStWP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1210&quot; height=&quot;894&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;894&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1744782610657&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def mergeSort2(s, low, high):
    if(low &amp;lt; high):        
        mid = (low + high) // 2
        mergeSort2(s, low, mid)
        mergeSort2(s, mid + 1, high)
        merge2(s, low, mid, high)

def merge2(s, low, mid, high):
    u = [0 for i in range(high - low + 1)]
    i = low
    j = mid + 1
    k = 0
    
    while(i &amp;lt;= mid and j &amp;lt;= high):
        if(s[i] &amp;lt; s[j]):
            u[k] = s[i]
            i += 1
        else:
            u[k] = s[j]
            j += 1
        k += 1

    if(i &amp;gt; mid):
        remained = s[j:high+1]
        for value in remained:
            u[k] = value
            k += 1
    else:
        remained = s[i:mid+1]
        for value in remained:
            u[k] = value
            k += 1
    
    for i in range(len(u)):
        s[low + i] = u[i]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x0diL/btsNmKbZPIK/jKrO6ZAFZAMJcbBykj5PK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x0diL/btsNmKbZPIK/jKrO6ZAFZAMJcbBykj5PK0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x0diL/btsNmKbZPIK/jKrO6ZAFZAMJcbBykj5PK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx0diL%2FbtsNmKbZPIK%2FjKrO6ZAFZAMJcbBykj5PK0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1529&quot; height=&quot;1000&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; index 유의하여 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 빠른정렬(Quicksort)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;분할 교환 정렬(partition exchange sort)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문제:&amp;nbsp;&lt;/b&gt;n개의 정수를 비내림차순으로 정렬&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력:&amp;nbsp;&lt;/b&gt;정수 n&amp;gt;0, 크기가 n인 배열S[1..n]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력:&amp;nbsp;&lt;/b&gt;비내림차순으로 정렬된 배열 S[1..n]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hg1Bv/btsNnjkG0W7/UWj3KKfvLgBSNlSLy0VSZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hg1Bv/btsNnjkG0W7/UWj3KKfvLgBSNlSLy0VSZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hg1Bv/btsNnjkG0W7/UWj3KKfvLgBSNlSLy0VSZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHg1Bv%2FbtsNnjkG0W7%2FUWj3KKfvLgBSNlSLy0VSZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1310&quot; height=&quot;796&quot; data-origin-width=&quot;1310&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- quicksort&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lTcUk/btsNnLgJFha/zA18aApiLCgdRJ5KrZH4o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lTcUk/btsNnLgJFha/zA18aApiLCgdRJ5KrZH4o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lTcUk/btsNnLgJFha/zA18aApiLCgdRJ5KrZH4o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlTcUk%2FbtsNnLgJFha%2FzA18aApiLCgdRJ5KrZH4o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;390&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;partition 수행한 값을 pivotpoint에 할당&lt;/li&gt;
&lt;li&gt;quicksort(low, pivotpoint - 1)&lt;/li&gt;
&lt;li&gt;quicksort(pivotpoint + 1, high)&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- partition&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TuVzJ/btsNobTfDej/ih2Ik6fAIVtNb2vi4T83Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TuVzJ/btsNobTfDej/ih2Ik6fAIVtNb2vi4T83Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TuVzJ/btsNobTfDej/ih2Ik6fAIVtNb2vi4T83Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTuVzJ%2FbtsNobTfDej%2Fih2Ik6fAIVtNb2vi4T83Ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1386&quot; height=&quot;618&quot; data-origin-width=&quot;1386&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;pivotitem으로 첫 번째 항목 선택&lt;/li&gt;
&lt;li&gt;i = pivotitem + 1, i번째 item이 pivotitem보다 작으면 j번째 항목과 i번째 항목 위치 변경, 이후 j++ -&amp;gt; j 왼쪽의 아이템들은 모두 pivotitem보다 작은 items&lt;/li&gt;
&lt;li&gt;pivotpoint = j &amp;amp; pivotitem을 pivotpoint에 위치&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1744785953330&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def exchange(index1, index2, s):
    temp = s[index1]
    s[index1] = s[index2]
    s[index2] = temp

def partition(s, low, high):
    pivotItem = s[low]
    j = low
    
    for i in range(low + 1, high + 1):
        if(s[i] &amp;lt; pivotItem):
            j += 1
            exchange(i, j, s)
    pivotPoint = j
    
    exchange(low, pivotPoint, s)
    return pivotPoint
    

def quickSort(s, low, high):
    if(low &amp;lt; high):
        pivotPoint = partition(s, low, high)
        quickSort(s, low, pivotPoint - 1)
        quickSort(s, pivotPoint + 1, high)

s = [3, 5, 2, 9, 10, 14, 4, 8]
quickSort(s, 0, 7)
print(s)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- partition 시간복잡도&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단위연산:&lt;/b&gt; S[i]와 pivotitem 비교&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력크기:&amp;nbsp;&lt;/b&gt;부분배열이 가지고 있는 항목의 수, n = high - low + 1&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분석:&amp;nbsp;&lt;/b&gt;배열의 첫 번째 항목만 제외하고 모든 항목을 한 번씩 비교하므로, T(n) = n - 1&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- quicksort 분석&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단위연산:&amp;nbsp;&lt;/b&gt;&lt;u&gt;partition&lt;/u&gt;의 S[i]와 pivotitem 비교&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력크기:&amp;nbsp;&lt;/b&gt;배열 S가 가지고 있는 항목의 수, n&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분석:&amp;nbsp;&lt;/b&gt;입력이 비내림차순으로 정렬된 경우가 최악, pivotitem보다 작은 항목이 없으므로,&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피벗 아이템의 좌측: 크기가 0인 배열&lt;/li&gt;
&lt;li&gt;피벗 아이템의 우측: 크기가 n-1인 배열&lt;/li&gt;
&lt;li&gt;&lt;b&gt;T(n) = T(0) + T(n - 1) + n - 1, T(0) = 0&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/46bqE/btsNnByNmA0/MqF0Qxd5tKY5Q5cFfk8W91/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/46bqE/btsNnByNmA0/MqF0Qxd5tKY5Q5cFfk8W91/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/46bqE/btsNnByNmA0/MqF0Qxd5tKY5Q5cFfk8W91/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F46bqE%2FbtsNnByNmA0%2FMqF0Qxd5tKY5Q5cFfk8W91%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1909&quot; height=&quot;1000&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt;&amp;nbsp;&lt;b&gt;W(n) &lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;isin;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^2)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;+ A(n) &lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;isin;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(nlgn)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;+ B(n) &lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;isin;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(nlgn)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;4. 행렬 곱셈(matrix multiplication)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제:&amp;nbsp;&lt;/b&gt;n x n 크기의 행렬의 곱을 구하시오&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력:&amp;nbsp;&lt;/b&gt;양수 n, n x n 크기의 행렬 A와 B&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력:&amp;nbsp;&lt;/b&gt;행렬 A와 B의 곱인 C&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oMoEY/btsNomApQVe/D023L8BkcIsMDw6MLTJiuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oMoEY/btsNomApQVe/D023L8BkcIsMDw6MLTJiuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oMoEY/btsNomApQVe/D023L8BkcIsMDw6MLTJiuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoMoEY%2FbtsNomApQVe%2FD023L8BkcIsMDw6MLTJiuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1316&quot; height=&quot;470&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 시간복잡도&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단위연산:&amp;nbsp;&lt;/b&gt;가장 안쪽의 루프에 있는 &lt;u&gt;곱셈하는 연산&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력크기:&amp;nbsp;&lt;/b&gt;행과 열의 수, n&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Every case&lt;/b&gt;: 총 곱셈의 횟수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;T(n) = n * n * n = n^3 &lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;isin;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^3)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z02hD/btsNnUEPtPR/2cDCnHWPFzbREoLzQN7ZTk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z02hD/btsNnUEPtPR/2cDCnHWPFzbREoLzQN7ZTk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z02hD/btsNnUEPtPR/2cDCnHWPFzbREoLzQN7ZTk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz02hD%2FbtsNnUEPtPR%2F2cDCnHWPFzbREoLzQN7ZTk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;388&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 한 단계 당 8번의 곱셈 연산 필요&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- 개선된 알고리즘 시간복잡도&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단위연산:&amp;nbsp;&lt;/b&gt;가장 안쪽의 루프에 있는 &lt;u&gt;덧셈하는 연산&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력크기:&amp;nbsp;&lt;/b&gt;행과 열의 수, n&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Every case:&amp;nbsp;&lt;/b&gt;총 덧셈의 횟수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;T(n) = (n - 1) * n * n = n^3 - n^2 &lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;isin;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^3)&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-size: 1.25em; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;br /&gt;- Strassen algorithm&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n이 2의 거듭제곱이고, 각 행렬을 4개의 submatrix로 나눈다고 가정. 두 n x n 행렬 A와 B의 곱 C&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QnOqS/btsNn2h93Vs/wN0TAKaECKzFqIZNOKOZN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QnOqS/btsNn2h93Vs/wN0TAKaECKzFqIZNOKOZN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QnOqS/btsNn2h93Vs/wN0TAKaECKzFqIZNOKOZN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQnOqS%2FbtsNn2h93Vs%2FwN0TAKaECKzFqIZNOKOZN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;124&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Strassen의 해&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAGgsx/btsNmKpSD4h/OBBxQcA6iSeEy7kycq43E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAGgsx/btsNmKpSD4h/OBBxQcA6iSeEy7kycq43E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAGgsx/btsNmKpSD4h/OBBxQcA6iSeEy7kycq43E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAGgsx%2FbtsNmKpSD4h%2FOBBxQcA6iSeEy7kycq43E0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1218&quot; height=&quot;532&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제:&amp;nbsp;&lt;/b&gt;n이 2의 거듭제곱일 때, n x n 크기의 두 행렬의 곱을 구하시오.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력:&amp;nbsp;&lt;/b&gt;정수 n, n x n 크기의 행렬 A와 B&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력:&amp;nbsp;&lt;/b&gt;행렬 A와 B의 곱인 C&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRS81E/btsNn9uBZIw/BMHNbCURaMt3gpjBfX9S11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRS81E/btsNn9uBZIw/BMHNbCURaMt3gpjBfX9S11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRS81E/btsNn9uBZIw/BMHNbCURaMt3gpjBfX9S11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRS81E%2FbtsNn9uBZIw%2FBMHNbCURaMt3gpjBfX9S11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1356&quot; height=&quot;480&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;A, B를 4개의 부분 행렬로 분할&lt;/li&gt;
&lt;li&gt;Strassen 방법을 사용하여 C = A * B 계산 - strassen(n/2, A11 + A22, B11 + B22, M1)&lt;/li&gt;
&lt;li&gt;임계점에서 단순 알고리즘 계산&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1744791383274&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from numpy import *

def strassen(n, A, B, C):
    threshold = 2
    A11 = array([[A[rows][cols] for cols in range(int(n/2))]for rows in range(int(n/2))])
    A12 = array([[A[rows][cols] for cols in range(int(n/2), n)]for rows in range(int(n/2))])
    A21 = array([[A[rows][cols] for cols in range(int(n/2))]for rows in range(int(n/2), n)])
    A22 = array([[A[rows][cols] for cols in range(int(n/2), n)]for rows in range(int(n/2), n)])
    
    B11 = array([[B[rows][cols] for cols in range(int(n/2))]for rows in range(int(n/2))])
    B12 = array([[B[rows][cols] for cols in range(int(n/2), n)]for rows in range(int(n/2))])
    B21 = array([[B[rows][cols] for cols in range(int(n/2))]for rows in range(int(n/2), n)])
    B22 = array([[B[rows][cols] for cols in range(int(n/2), n)]for rows in range(int(n/2), n)])
    
    if(n &amp;lt;= threshold):
        C = array(A) @ array(B)
    else:
        M1 = M2 = M3 = M4 = M5 = M6 = M7 = array([])
        M1 = strassen(int(n/2), (A11 + A22) , (B11 + B22), M1)
        M2 = strassen(int(n/2), (A21 + A22) , B11, M2)
        M3 = strassen(int(n/2), A11 , (B12 - B22), M3)
        M4 = strassen(int(n/2), A22 , (B21 - B11), M4)
        M5 = strassen(int(n/2), (A11 + A12) , B22, M5)
        M6 = strassen(int(n/2), (A21 - A11) , (B11 + B12), M6)
        M7 = strassen(int(n/2), (A12 - A22) , (B21 + B22), M7)
        
        C = vstack([ hstack([M1 + M4 - M5 + M7, M3 + M5]), hstack([M2 + M4, M1 + M3 - M2 + M6]) ])
    return C

n = 4

A=[ [1,2,0,2], [3,1,0,0], [0,1,1,2],[2,0,2,0]]
B=[ [0,3,0,2], [1,1,4,0], [1,1,0,2],[0,5,2,0]]
C = array(A)@array(B)
D = [[0 for cols in range(n)]for rows in range(n)]
print(C)
D=strassen(n, A, B, D)
print(D)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;- Strassen 알고리즘 시간복잡도&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단위연산:&amp;nbsp;&lt;/b&gt;&lt;u&gt;곱셈 연산&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력크기:&amp;nbsp;&lt;/b&gt;행과 열의 수, n&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Every case:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;T(n) = 7T(n/2), T(1) = 1&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOyqBj/btsNnKvMcJN/FMOHMJWS53upjdqfrg8aYk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOyqBj/btsNnKvMcJN/FMOHMJWS53upjdqfrg8aYk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOyqBj/btsNnKvMcJN/FMOHMJWS53upjdqfrg8aYk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOyqBj%2FbtsNnKvMcJN%2FFMOHMJWS53upjdqfrg8aYk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;504&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; strassen에서는 곱셈이 7번!!&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- Strassen 알고리즘 시간복잡도 2&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;단위연산:&amp;nbsp;&lt;/b&gt;&lt;u&gt;덧셈/뺄셈 연산&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력크기:&amp;nbsp;&lt;/b&gt;행과 열의 수, n&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Every case:&amp;nbsp;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;T(n) = 7T(n/2) + 18(n/2)^2 , T(1) = 0&amp;nbsp;&lt;/b&gt;-&amp;gt; 7회의 곱셈과 18회의 덧셈&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2029&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nbE7p/btsNoxomZ0z/cTqSQeYd0TvkukoAcMETc0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nbE7p/btsNoxomZ0z/cTqSQeYd0TvkukoAcMETc0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nbE7p/btsNoxomZ0z/cTqSQeYd0TvkukoAcMETc0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnbE7p%2FbtsNoxomZ0z%2FcTqSQeYd0TvkukoAcMETc0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;301&quot; data-origin-width=&quot;2029&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caTs2A/btsNnlXyfhz/DT9lfXX0ldF4vnetucywKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caTs2A/btsNnlXyfhz/DT9lfXX0ldF4vnetucywKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caTs2A/btsNnlXyfhz/DT9lfXX0ldF4vnetucywKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaTs2A%2FbtsNnlXyfhz%2FDT9lfXX0ldF4vnetucywKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;376&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Discussion&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;838&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cffkkK/btsNnCrgNpI/2532BeGgeJapTzYpXBaDg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cffkkK/btsNnCrgNpI/2532BeGgeJapTzYpXBaDg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cffkkK/btsNnCrgNpI/2532BeGgeJapTzYpXBaDg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcffkkK%2FbtsNnCrgNpI%2F2532BeGgeJapTzYpXBaDg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1426&quot; height=&quot;838&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 큰 정수 계산법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제:&lt;/b&gt; 2개의 큰 정수 u와 v를 곱하라&lt;/li&gt;
&lt;li&gt;&lt;b&gt;입력:&amp;nbsp;&lt;/b&gt;큰 정수 u와 v, 크기 n&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력&lt;/b&gt;: prod(u와 v의 곱)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wZSA2/btsNnwkDMpk/xtCvAALgAakptIbliNRJbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wZSA2/btsNnwkDMpk/xtCvAALgAakptIbliNRJbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wZSA2/btsNnwkDMpk/xtCvAALgAakptIbliNRJbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwZSA2%2FbtsNnwkDMpk%2FxtCvAALgAakptIbliNRJbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;166&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 2개의 큰 정수 곱셈을 4개의 작은 정수 곱셈으로 변환 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Llibd/btsNnpdo31d/W2fBAAGK22cAQsK63K5hW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Llibd/btsNnpdo31d/W2fBAAGK22cAQsK63K5hW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Llibd/btsNnpdo31d/W2fBAAGK22cAQsK63K5hW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLlibd%2FbtsNnpdo31d%2FW2fBAAGK22cAQsK63K5hW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1224&quot; height=&quot;682&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 개선된 방법(Karatsuba)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFJ21M/btsNnStW3j1/e9yVAOIbvAehpV5Yd26N1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFJ21M/btsNnStW3j1/e9yVAOIbvAehpV5Yd26N1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFJ21M/btsNnStW3j1/e9yVAOIbvAehpV5Yd26N1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFJ21M%2FbtsNnStW3j1%2Fe9yVAOIbvAehpV5Yd26N1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1336&quot; height=&quot;422&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) a = a1 * 10 + a0, b = b1 * 10 + b0
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기존 방식:&amp;nbsp;&lt;/b&gt;a * b = (a1 * 10 + a0)(b1 * 10 + b0)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;a1b1, a1b0, a0b1, a0b0&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;카라츠바&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;z0 = a0 * b0&lt;/li&gt;
&lt;li&gt;z2 = a1 * b1&lt;/li&gt;
&lt;li&gt;z1 = (a0 + a1) * (b0 + b1) - z0 - z2&lt;/li&gt;
&lt;li&gt;-&amp;gt; 곱셈이 4번에서 3번으로 줄어듦&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kb5Kr/btsNnKiER6N/oplunczKE9KGhKhZJdCiqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kb5Kr/btsNnKiER6N/oplunczKE9KGhKhZJdCiqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kb5Kr/btsNnKiER6N/oplunczKE9KGhKhZJdCiqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKb5Kr%2FbtsNnKiER6N%2FoplunczKE9KGhKhZJdCiqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1180&quot; height=&quot;732&quot; data-origin-width=&quot;1180&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 시간복잡도&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;기존: W(n) &lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;isin;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^lg4) = &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^2)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;카라츠바: &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;W(n)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #cdcdcd; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;isin;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^lg3) ~= &lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^1.58)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;6. 임계값결정&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어느 크기의 문제가 딜 때까지 분할할 것인가&lt;/li&gt;
&lt;li&gt;&lt;b&gt;optimal threshold value&lt;/b&gt;를 결정하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkUOwJ/btsNkoG4E95/GgpJU3ssaoGFlMitOE9c8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkUOwJ/btsNkoG4E95/GgpJU3ssaoGFlMitOE9c8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkUOwJ/btsNkoG4E95/GgpJU3ssaoGFlMitOE9c8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkUOwJ%2FbtsNkoG4E95%2FGgpJU3ssaoGFlMitOE9c8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1350&quot; height=&quot;522&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 분할정복을 사용하지 말아야 하는 경우&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;크기가 n인 입력이 2개 이상의 조각으로 분할되며, 분할된 부분들의 크기가 거의 n에 가깝게 되는 경우 -&amp;gt;&amp;nbsp;&lt;b&gt;exponential&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) T(n) = 2T(n - 1) + n&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;크기가 n인 입력이 거의 n개 조각으로 분할되며, 분할된 부분의 크기가 n/c인 경우. 여기서 c는 상수 -&amp;gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^lgn)&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;ex) T(n) = nT(n/2) + n&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 도사 정리(The Master Theorem)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1보다 큰 상수 a, b, 어떤 함수 f(n), 음이 아닌 정수 n에 대해서 정의된 재현식 T(n)이 다음 형태라 가정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;T(n) = a x T(n/b) + f(n)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;T(n)은 다음과 같은&amp;nbsp;&lt;b&gt;점근적 한계점(asymptotic bound)&lt;/b&gt;을 가질 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQyuwq/btsNlBZXJPA/FksKoKa3wpTD5aZuvqKCv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQyuwq/btsNlBZXJPA/FksKoKa3wpTD5aZuvqKCv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQyuwq/btsNlBZXJPA/FksKoKa3wpTD5aZuvqKCv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQyuwq%2FbtsNlBZXJPA%2FFksKoKa3wpTD5aZuvqKCv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1426&quot; height=&quot;388&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1FcDs/btsNnWPEcY0/0EqzKWZ3Ru16kARAwjjmoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1FcDs/btsNnWPEcY0/0EqzKWZ3Ru16kARAwjjmoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1FcDs/btsNnWPEcY0/0EqzKWZ3Ru16kARAwjjmoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1FcDs%2FbtsNnWPEcY0%2F0EqzKWZ3Ru16kARAwjjmoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1190&quot; height=&quot;436&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xowrh/btsNmejahiX/fZQazyzjZsf2pXxwj5N1T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xowrh/btsNmejahiX/fZQazyzjZsf2pXxwj5N1T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xowrh/btsNmejahiX/fZQazyzjZsf2pXxwj5N1T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXowrh%2FbtsNmejahiX%2FfZQazyzjZsf2pXxwj5N1T1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1238&quot; height=&quot;548&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>4학년 1학기 전공/알고리즘</category>
      <author>시데브</author>
      <guid isPermaLink="true">https://sypdevlog.tistory.com/373</guid>
      <comments>https://sypdevlog.tistory.com/373#entry373comment</comments>
      <pubDate>Thu, 17 Apr 2025 02:30:45 +0900</pubDate>
    </item>
    <item>
      <title>[컴파일러] Chapter 5. Semantic Analysis</title>
      <link>https://sypdevlog.tistory.com/372</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;경희대학교 허선영 교수님의 컴파일러 수업을 기반으로 정리한 글입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;0. Introduction&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Understanding&amp;nbsp;&lt;b&gt;the meaning of a sentence&amp;nbsp;&lt;/b&gt;-&amp;gt;&amp;nbsp;&lt;u&gt;문장의 의미&lt;/u&gt;를 유추
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Check&amp;nbsp;&lt;b&gt;ambiguity &amp;amp; type&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;ex) Jack and Jack left her homework at home
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잭은 몇 명?&lt;/li&gt;
&lt;li&gt;jack과 her의 미스매치&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Semantic Analysis&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;each expression&lt;/u&gt;이 &lt;b&gt;correct type&lt;/b&gt;을 가지는지
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;x + y -&amp;gt; x는 int, y는 string이면 error&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;translate&amp;nbsp;&lt;b&gt;Abstract Syntax Tree -&amp;gt; Intermediate Representation(IR) Trees&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KsThO/btsNkh2hSG8/9IkfUGfABKChgSMqfiz681/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KsThO/btsNkh2hSG8/9IkfUGfABKChgSMqfiz681/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KsThO/btsNkh2hSG8/9IkfUGfABKChgSMqfiz681/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKsThO%2FbtsNkh2hSG8%2F9IkfUGfABKChgSMqfiz681%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;481&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Semantic analyzer also can check
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;All identifiers&lt;/b&gt;(Variable, Class, Functions, Methods, ...) -&amp;gt;&amp;nbsp;&lt;u&gt;한 번만 선언됐는지&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;parser에서도 가능 -&amp;gt; compiler designer들이 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Inheritance Relationship&amp;nbsp;&lt;/b&gt;- 상하관계&lt;/li&gt;
&lt;li&gt;Types are well defined and related&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reserved Identifiers&lt;/b&gt;가 &lt;u&gt;잘못 사용&lt;/u&gt;되지는 않았는지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Motivation&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Lexical Analysis:&amp;nbsp;&lt;/b&gt;잘못된 Tokens를 Detecting&amp;nbsp;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) 123foo -&amp;gt; 처리할 수 없는 토큰&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Parsing:&amp;nbsp;&lt;/b&gt;문법을 잘못 작성한 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) if then 절에 if(조건문) -&amp;gt; 조건문 부분을 뺀 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Semantic Analysis&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) abc + 3 -&amp;gt; parser cannot catch the error&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Symbol Table&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Symbol Table(Environment)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;main data structure in semantic analysis&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Identifiers&lt;/b&gt;(variables, functions, class name, ..)-&amp;gt; &lt;b&gt;types&amp;nbsp;&lt;/b&gt;&amp;amp;&amp;nbsp;&lt;b&gt;loactions&lt;/b&gt; 매핑&lt;/li&gt;
&lt;li&gt;&lt;u&gt;identifier가 어떤 type에 mapping&lt;/u&gt;됐는지를 저장 -&amp;gt;&amp;nbsp;&lt;b&gt;binding&lt;/b&gt;&lt;b&gt;s&lt;/b&gt;라 부름&lt;/li&gt;
&lt;li&gt;ex){g ↦ string, a ↦ int}&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- exmaple&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt; 0&lt;/b&gt;: &lt;u&gt;Initial environment&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KQU77/btsNlzGVq05/9oXliKnCPmBDwA6A8tdCS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KQU77/btsNlzGVq05/9oXliKnCPmBDwA6A8tdCS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KQU77/btsNlzGVq05/9oXliKnCPmBDwA6A8tdCS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKQU77%2FbtsNlzGVq05%2F9oXliKnCPmBDwA6A8tdCS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;472&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 가장 가까운 binding 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 범위를 벗어나면 이전 정의로 회귀&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. Symbol Table - Implementation&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Imperative&lt;/b&gt; Style&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;single global environment&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;beginning-of-scope &lt;/b&gt;진입&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;table에 entries &lt;u&gt;추가&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;end-of-scope&lt;/b&gt;&amp;nbsp;도달
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;previous addition을 &lt;u&gt;제거&lt;/u&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;Functional &lt;/b&gt;Style&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;beginning-of-scope&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;진입&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;old one에 추가함으로써, &lt;u&gt;새로운 environment 생성&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;old table remains pristine&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;end-of-scope&lt;/b&gt;&amp;nbsp;도달
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;retrieve&lt;/u&gt; old table&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. Imperative Symbol Table&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Symbol tables must permit&amp;nbsp;&lt;b&gt;efficient lookup of identifiers&amp;nbsp;&lt;/b&gt;-&amp;gt; id의 type을 빠르게 찾아낼 수 있어야 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Hash Tables&amp;nbsp;&lt;/b&gt;- an array of buckets&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bucket&amp;nbsp;&lt;/b&gt;- linked list of entires(각 entry에 binding 하나 존재)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3488&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Ri3l/btsNiYng7dt/MdqPWREM3qiinS8B3wATFK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Ri3l/btsNiYng7dt/MdqPWREM3qiinS8B3wATFK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Ri3l/btsNiYng7dt/MdqPWREM3qiinS8B3wATFK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Ri3l%2FbtsNiYng7dt%2FMdqPWREM3qiinS8B3wATFK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3488&quot; height=&quot;1000&quot; data-origin-width=&quot;3488&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;simplest example) string length를 bucket id로 사용 -&amp;gt; length에 대한 modulo 연산을 id로 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Symbol table을 하나만 유지&lt;/b&gt;!!
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Insert new element&lt;/b&gt;&amp;nbsp;&lt;u&gt;at front of bucket&lt;/u&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;example) val a: string = &quot;x&quot; -&amp;gt;&amp;nbsp;&lt;b&gt;h(a) = 0&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Remove each symbol&amp;nbsp;&lt;/b&gt;&lt;u&gt;at the end of the scope&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;example) pop(a)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3345&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l8L5u/btsNlf3iFrK/d3OC5D5cfM7Dszp2JGofwK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l8L5u/btsNlf3iFrK/d3OC5D5cfM7Dszp2JGofwK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l8L5u/btsNlf3iFrK/d3OC5D5cfM7Dszp2JGofwK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl8L5u%2FbtsNlf3iFrK%2Fd3OC5D5cfM7Dszp2JGofwK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3345&quot; height=&quot;999&quot; data-origin-width=&quot;3345&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.4. Functional Symbol Table&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 테이블을 수정하는 방식 X -&amp;gt; &lt;b&gt;new&lt;/b&gt;&lt;b&gt;&amp;nbsp;table을 생성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;example) val a: string = &quot;x&quot;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;기존 테이블을 link&lt;/u&gt;하는 식으로 효율적으로 테이블 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2221&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/54eeA/btsNiXPs0vM/zTZjoOfyzF42a2PUa84VB1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/54eeA/btsNiXPs0vM/zTZjoOfyzF42a2PUa84VB1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/54eeA/btsNiXPs0vM/zTZjoOfyzF42a2PUa84VB1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F54eeA%2FbtsNiXPs0vM%2FzTZjoOfyzF42a2PUa84VB1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2221&quot; height=&quot;1000&quot; data-origin-width=&quot;2221&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Better Medhot: use&amp;nbsp;&lt;b&gt;binary search trees&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BST
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;easy insertion&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;tree build 시에 &lt;u&gt;ordering이 필요&lt;/u&gt;할 시에&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmPBSh/btsNkTGmAre/y6CN0vgTSt6mRky0hqZiu1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmPBSh/btsNkTGmAre/y6CN0vgTSt6mRky0hqZiu1/img.jpg&quot; data-origin-width=&quot;1393&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; width=&quot;570&quot; height=&quot;409&quot; style=&quot;width: 37.8554%; margin-right: 10px;&quot; data-widthpercent=&quot;38.3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmPBSh/btsNkTGmAre/y6CN0vgTSt6mRky0hqZiu1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmPBSh%2FbtsNkTGmAre%2Fy6CN0vgTSt6mRky0hqZiu1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1393&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdNmlc/btsNiWiJDW4/trtP7EgP4kaiZjA2ZYNQjK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdNmlc/btsNiWiJDW4/trtP7EgP4kaiZjA2ZYNQjK/img.jpg&quot; data-origin-width=&quot;2244&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 60.9818%;&quot; data-widthpercent=&quot;61.7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdNmlc/btsNiWiJDW4/trtP7EgP4kaiZjA2ZYNQjK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdNmlc%2FbtsNiWiJDW4%2FtrtP7EgP4kaiZjA2ZYNQjK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2244&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3269&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvqx3E/btsNllWubRC/BGfMYKvS2xsaUoUB2y8aO0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvqx3E/btsNllWubRC/BGfMYKvS2xsaUoUB2y8aO0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvqx3E/btsNllWubRC/BGfMYKvS2xsaUoUB2y8aO0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvqx3E%2FbtsNllWubRC%2FBGfMYKvS2xsaUoUB2y8aO0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3269&quot; height=&quot;1000&quot; data-origin-width=&quot;3269&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Type System&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Type System&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;typing rules의 집합&lt;/b&gt;으로 구성&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;typing rules -&amp;gt; &lt;u&gt;expressions에 types 할당&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;어떤 type에 어떤 operations가 valid&lt;/b&gt;한지 특정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Type Checking&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;expression의 type이&amp;nbsp;&lt;/b&gt;&lt;u&gt;type system에 따라&lt;/u&gt; 유효한지 검사&lt;/li&gt;
&lt;li&gt;operations가 올바른 type과 사용되었는지 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Type Inference(타입 추론)&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;type system에 따라&lt;/u&gt;,&amp;nbsp;&lt;b&gt;type을 자동으로 추론&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;생략된 타입 정보를 자동으로 채움
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) let = 3일 때, x의 타입은 자동으로 int로 추론&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. Typing Rule&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;expression에 type을 할당&lt;/u&gt;하기 위한 &lt;b&gt;유도 법칙&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;if&amp;nbsp;&lt;b&gt;hypothesis(가정)&lt;/b&gt;&lt;b&gt; is true&amp;nbsp;&lt;/b&gt;-&amp;gt;&amp;nbsp;&lt;b&gt;conclusion is true&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) if e1 has type t1 &amp;amp; e2 has type t2 -&amp;gt; e3 has type T3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A typing rule:&lt;b&gt;&amp;nbsp; &lt;span&gt;1&lt;/span&gt;:   &lt;span&gt;1 &lt;/span&gt;&amp;and; ⋯ &amp;and;  &lt;span&gt; &lt;/span&gt;:   &lt;span&gt;  &lt;/span&gt;&amp;rArr;  :  &lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Hypothesis &lt;b&gt;&amp;rArr; &lt;/b&gt;Conclusion&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;if hypothesis is true, then conclusion is true&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;e: T&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;e has type T&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Symbol &amp;and;&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;and&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- example&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;( 1:   &amp;and;  2:  ) &amp;rArr;  1 +  2:  &lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lCPXZ/btsNlNkGH8r/Gu8A7VOoTnXUZURRKRkIuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lCPXZ/btsNlNkGH8r/Gu8A7VOoTnXUZURRKRkIuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lCPXZ/btsNlNkGH8r/Gu8A7VOoTnXUZURRKRkIuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlCPXZ%2FbtsNlNkGH8r%2FGu8A7VOoTnXUZURRKRkIuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;160&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;axiom&lt;/span&gt;: inference rule &lt;/b&gt;&lt;u&gt;with no premise(가정)&lt;/u&gt; -&amp;gt; always true&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctfGOx/btsNljK7nkF/6R0EkU23MKR9TgiXOAypKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctfGOx/btsNljK7nkF/6R0EkU23MKR9TgiXOAypKk/img.jpg&quot; data-origin-width=&quot;1696&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; width=&quot;209&quot; height=&quot;123&quot; style=&quot;width: 26.4373%; margin-right: 10px;&quot; data-widthpercent=&quot;27.07&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctfGOx/btsNljK7nkF/6R0EkU23MKR9TgiXOAypKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctfGOx%2FbtsNljK7nkF%2F6R0EkU23MKR9TgiXOAypKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1696&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BFP0N/btsNlMlMC1J/vIssD57CIJ1Rpf6pTBWVRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BFP0N/btsNlMlMC1J/vIssD57CIJ1Rpf6pTBWVRK/img.jpg&quot; data-origin-width=&quot;2425&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.8009%; margin-right: 10px;&quot; data-widthpercent=&quot;38.7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BFP0N/btsNlMlMC1J/vIssD57CIJ1Rpf6pTBWVRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBFP0N%2FbtsNlMlMC1J%2FvIssD57CIJ1Rpf6pTBWVRK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2425&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uwODi/btsNkgCmZis/XubATajEN9TVzyKutSkRsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uwODi/btsNkgCmZis/XubATajEN9TVzyKutSkRsk/img.jpg&quot; data-origin-width=&quot;2145&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 33.4363%;&quot; data-widthpercent=&quot;34.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uwODi/btsNkgCmZis/XubATajEN9TVzyKutSkRsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuwODi%2FbtsNkgCmZis%2FXubATajEN9TVzyKutSkRsk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2145&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. Type Inference&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;expression의 type을 유도하기 위해&amp;nbsp;&lt;/b&gt;-&amp;gt; type system의 typing rules 사용&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Build a &lt;b&gt;Derivation tree(Typing Derivation) &lt;/b&gt;by&amp;nbsp;&lt;u&gt;applying typing rules&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- example&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Grammar&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;E -&amp;gt; NUM&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;E -&amp;gt; E + E&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Type System&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blF00f/btsNkJYjHdj/WEUC9OZMbvf6mgmKIu1lFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blF00f/btsNkJYjHdj/WEUC9OZMbvf6mgmKIu1lFk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blF00f/btsNkJYjHdj/WEUC9OZMbvf6mgmKIu1lFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblF00f%2FbtsNkJYjHdj%2FWEUC9OZMbvf6mgmKIu1lFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;692&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Type Inference: 1 + 2&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;752&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5lrjK/btsNlzNMp7g/lJUzWdJ14Kck45CIKAahsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5lrjK/btsNlzNMp7g/lJUzWdJ14Kck45CIKAahsk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5lrjK/btsNlzNMp7g/lJUzWdJ14Kck45CIKAahsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5lrjK%2FbtsNlzNMp7g%2FlJUzWdJ14Kck45CIKAahsk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;752&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;752&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 완성된 derivation tree&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; axiom으로부터 하나씩 type 추론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. Type Environment&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Problem:&amp;nbsp;&lt;/b&gt;What is the &lt;u&gt;type of a&amp;nbsp;variable?&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2068&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xQ6yF/btsNlZd7vUF/tuXvsBKsx3UYoczKsfiWLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xQ6yF/btsNlZd7vUF/tuXvsBKsx3UYoczKsfiWLk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xQ6yF/btsNlZd7vUF/tuXvsBKsx3UYoczKsfiWLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxQ6yF%2FbtsNlZd7vUF%2FtuXvsBKsx3UYoczKsfiWLk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;252&quot; data-origin-width=&quot;2068&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Solution&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Put &lt;b&gt;more informaiton &lt;/b&gt;&lt;u&gt;in the rules&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Type environment&amp;nbsp;&lt;/b&gt;gives the types of variables&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5Znn/btsNlxoOneR/1sMncn0A6lPgkkluk2kne0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5Znn/btsNlxoOneR/1sMncn0A6lPgkkluk2kne0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5Znn/btsNlxoOneR/1sMncn0A6lPgkkluk2kne0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5Znn%2FbtsNlxoOneR%2F1sMncn0A6lPgkkluk2kne0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;264&quot; data-origin-width=&quot;2116&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&amp;Gamma; ⊢   ∶  &amp;nbsp; &amp;hArr;&amp;nbsp;&lt;/b&gt;expression &lt;b&gt;e has type A&lt;/b&gt; &lt;u&gt;under type environment &amp;Gamma;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- example&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lB4WH/btsNlYGh0IQ/y4o7kRNG5gRQKL5ZvSbKXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lB4WH/btsNlYGh0IQ/y4o7kRNG5gRQKL5ZvSbKXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lB4WH/btsNlYGh0IQ/y4o7kRNG5gRQKL5ZvSbKXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlB4WH%2FbtsNlYGh0IQ%2Fy4o7kRNG5gRQKL5ZvSbKXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;96&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2563&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9CCkH/btsNkjFQicR/p0kyRSYBV5R7ftwt5E3u11/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9CCkH/btsNkjFQicR/p0kyRSYBV5R7ftwt5E3u11/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9CCkH/btsNkjFQicR/p0kyRSYBV5R7ftwt5E3u11/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9CCkH%2FbtsNkjFQicR%2Fp0kyRSYBV5R7ftwt5E3u11%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;202&quot; data-origin-width=&quot;2563&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drczXP/btsNlnGNk4S/FqwnpVNpzuBKiOMH5KxzgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drczXP/btsNlnGNk4S/FqwnpVNpzuBKiOMH5KxzgK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drczXP/btsNlnGNk4S/FqwnpVNpzuBKiOMH5KxzgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrczXP%2FbtsNlnGNk4S%2FFqwnpVNpzuBKiOMH5KxzgK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;571&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2799&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5fbiz/btsNkg3oxTJ/OxsrTsBl9OkDKHaRdUWRQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5fbiz/btsNkg3oxTJ/OxsrTsBl9OkDKHaRdUWRQk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5fbiz/btsNkg3oxTJ/OxsrTsBl9OkDKHaRdUWRQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5fbiz%2FbtsNkg3oxTJ%2FOxsrTsBl9OkDKHaRdUWRQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2799&quot; height=&quot;1000&quot; data-origin-width=&quot;2799&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2008&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d828AN/btsNkVdbjbN/C1rXKgaitufZjeWARJJgZ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d828AN/btsNkVdbjbN/C1rXKgaitufZjeWARJJgZ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d828AN/btsNkVdbjbN/C1rXKgaitufZjeWARJJgZ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd828AN%2FbtsNkVdbjbN%2FC1rXKgaitufZjeWARJJgZ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2008&quot; height=&quot;1000&quot; data-origin-width=&quot;2008&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beJx2w/btsNivFGwwe/zuS7snB76Yua7Q99aELjp0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beJx2w/btsNivFGwwe/zuS7snB76Yua7Q99aELjp0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beJx2w/btsNivFGwwe/zuS7snB76Yua7Q99aELjp0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeJx2w%2FbtsNivFGwwe%2FzuS7snB76Yua7Q99aELjp0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2104&quot; height=&quot;1000&quot; data-origin-width=&quot;2104&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- What is type of the following expression?&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NApyT/btsNktBm4kL/RusiRMXlUahBsKvXpgAe1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NApyT/btsNktBm4kL/RusiRMXlUahBsKvXpgAe1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NApyT/btsNktBm4kL/RusiRMXlUahBsKvXpgAe1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNApyT%2FbtsNktBm4kL%2FRusiRMXlUahBsKvXpgAe1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;66&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2579&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7ZFQY/btsNlj5tE2R/Kka8a6CesjazfPdyIWEDyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7ZFQY/btsNlj5tE2R/Kka8a6CesjazfPdyIWEDyK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7ZFQY/btsNlj5tE2R/Kka8a6CesjazfPdyIWEDyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7ZFQY%2FbtsNlj5tE2R%2FKka8a6CesjazfPdyIWEDyK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2579&quot; height=&quot;1000&quot; data-origin-width=&quot;2579&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Fun &amp;amp; Arg&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Type System&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3428&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UrIYM/btsNlzfWqA8/9zGCUC165p7NKmBnYAZwZK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UrIYM/btsNlzfWqA8/9zGCUC165p7NKmBnYAZwZK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UrIYM/btsNlzfWqA8/9zGCUC165p7NKmBnYAZwZK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUrIYM%2FbtsNlzfWqA8%2F9zGCUC165p7NKmBnYAZwZK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3428&quot; height=&quot;1000&quot; data-origin-width=&quot;3428&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pkuF8/btsNkVxtu4c/J3nzop83Jw0eOKvbKLTYk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pkuF8/btsNkVxtu4c/J3nzop83Jw0eOKvbKLTYk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pkuF8/btsNkVxtu4c/J3nzop83Jw0eOKvbKLTYk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpkuF8%2FbtsNkVxtu4c%2FJ3nzop83Jw0eOKvbKLTYk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;636&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Subtyping&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;Subtyping&lt;/span&gt;:&lt;/b&gt;&amp;nbsp;&lt;u&gt;&lt;b&gt;Compatibility(호환성) of interfaces&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A에 대한 subtype B -&amp;gt; A 객체에서 호출 가능한 모든 함수: B 객체에서도 호출 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;A를 호출하는 function에 B가 대신 들어갈 수 있는가!!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #1a5490;&quot;&gt;Inheritance&lt;/span&gt;:&amp;nbsp;&lt;/b&gt;&lt;u&gt;&lt;b&gt;Reuse of implementations&lt;/b&gt;&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A를 상속하는 B -&amp;gt; A의 구현을 재사용할 수 있다는 뜻&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;977&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t65Fi/btsNk3PARUy/orMOCMzpx0KB5ZkersKFc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t65Fi/btsNk3PARUy/orMOCMzpx0KB5ZkersKFc1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t65Fi/btsNk3PARUy/orMOCMzpx0KB5ZkersKFc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft65Fi%2FbtsNk3PARUy%2ForMOCMzpx0KB5ZkersKFc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;977&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;977&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; input 1개로 f를 호출 가능하지만, g는 호출 불가능: g는 f의 subtype X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; input 2개로 g를 호출 가능, 또한 f도 호출 가능: f는 g의 subtype 가능&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1. Subtyping Rules&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Reflectivity:&lt;/b&gt; &lt;u&gt;스스로의 subtype&lt;/u&gt;이 될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LONTL/btsNlZLYBna/xEfg0pDHtNZahqnMAEjD6K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LONTL/btsNlZLYBna/xEfg0pDHtNZahqnMAEjD6K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LONTL/btsNlZLYBna/xEfg0pDHtNZahqnMAEjD6K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLONTL%2FbtsNlZLYBna%2FxEfg0pDHtNZahqnMAEjD6K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;211&quot; height=&quot;131&quot; data-origin-width=&quot;1612&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Transitivity:&lt;/b&gt; &lt;u&gt;t1이 t2의 subtype&lt;/u&gt; &amp;amp; &lt;u&gt;t2가 t3의 subtype&lt;/u&gt;이면 -&amp;gt; &lt;b&gt;t1은 t3의 subtype&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3120&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o9zFR/btsNkhVxyrn/b5oFpNwS4ne5tNthrAUsS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o9zFR/btsNkhVxyrn/b5oFpNwS4ne5tNthrAUsS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o9zFR/btsNkhVxyrn/b5oFpNwS4ne5tNthrAUsS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo9zFR%2FbtsNkhVxyrn%2Fb5oFpNwS4ne5tNthrAUsS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;146&quot; data-origin-width=&quot;3120&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Depth:&amp;nbsp;&lt;/b&gt;&lt;u&gt;tuple의 길이가 동일할 때&lt;/u&gt;, &lt;u&gt;내부 scalar가 모두 subtype 관계&lt;/u&gt;를 가져야, &lt;b&gt;tuple의 subtype 관계&lt;/b&gt;가 성립&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;719&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C4wCd/btsNkLOjGfR/FP05I3s0tJEGYP1wb4WJiK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C4wCd/btsNkLOjGfR/FP05I3s0tJEGYP1wb4WJiK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C4wCd/btsNkLOjGfR/FP05I3s0tJEGYP1wb4WJiK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC4wCd%2FbtsNkLOjGfR%2FFP05I3s0tJEGYP1wb4WJiK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;771&quot; height=&quot;139&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Width: &lt;/b&gt;&lt;u&gt;tuple의 일정 길이를 자른 tuple을 T2, 전체 tuple을 T1이라 할 때, &lt;/u&gt;&lt;b&gt;T1은 T2의 subtype&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZiiON/btsNlztuESm/mSTA2jaRZ9ED7UNyn8LlOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZiiON/btsNlztuESm/mSTA2jaRZ9ED7UNyn8LlOk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZiiON/btsNlztuESm/mSTA2jaRZ9ED7UNyn8LlOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZiiON%2FbtsNlztuESm%2FmSTA2jaRZ9ED7UNyn8LlOk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;121&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추가적으로, int와 &amp;lt;int&amp;gt;는 다른 타입, subtype 관계도 가지지 않음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Function:&amp;nbsp;&lt;/b&gt;&lt;u&gt;argument는 일반화&lt;/u&gt;, &lt;u&gt;return은 구체화&lt;/u&gt;돼야 subtype이 될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2433&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceCaso/btsNljklYNz/HqcV4H6x55AUu122zVO72K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceCaso/btsNljklYNz/HqcV4H6x55AUu122zVO72K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceCaso/btsNljklYNz/HqcV4H6x55AUu122zVO72K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceCaso%2FbtsNljklYNz%2FHqcV4H6x55AUu122zVO72K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;261&quot; data-origin-width=&quot;2433&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2479&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5iEz/btsNliTgwZE/XbJL8domez5AIRlpchSUzk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5iEz/btsNliTgwZE/XbJL8domez5AIRlpchSUzk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5iEz/btsNliTgwZE/XbJL8domez5AIRlpchSUzk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5iEz%2FbtsNliTgwZE%2FXbJL8domez5AIRlpchSUzk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2479&quot; height=&quot;1000&quot; data-origin-width=&quot;2479&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 기존에 f를 사용하던 자리에서는 int를 2개만 받아도 됐음,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; g로 교체되면 input이 2개만 들어오면 문제가 발생&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; g는 f의 subtype이 될 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- return 또한 마찬가지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 기존 f를 사용하던 자리에서는 2개의 return이 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; g로 교체되면 return이 1개만 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 2개가 필요한 경우 문제 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vfoE2/btsNlZZvNGK/IBoi55UKErKAreKNWauaKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vfoE2/btsNlZZvNGK/IBoi55UKErKAreKNWauaKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vfoE2/btsNlZZvNGK/IBoi55UKErKAreKNWauaKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvfoE2%2FbtsNlZZvNGK%2FIBoi55UKErKAreKNWauaKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;888&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2. Subtyping - Join&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Motivation:&amp;nbsp;&lt;/b&gt;다음 expression의 return type?&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;if a &amp;gt; 0 then &amp;lt;&amp;lt;3,4&amp;gt;, 5&amp;gt; else &amp;lt;&amp;lt;6&amp;gt;, 7, 8&amp;gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;-&amp;gt; if, then, else의 type이 각각 다름&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Join: &lt;/b&gt;find &lt;u&gt;&lt;b&gt;least common supertype&lt;/b&gt;&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;짧은 쪽 tuple에 맞춤&lt;/li&gt;
&lt;li&gt;join &amp;lt;int&amp;gt; &amp;amp; int -&amp;gt; int?:&amp;nbsp;&lt;b&gt;impossible&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2557&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJSNE7/btsNk500fkV/WAwQhNddecVwyilkRmTBrk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJSNE7/btsNk500fkV/WAwQhNddecVwyilkRmTBrk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJSNE7/btsNk500fkV/WAwQhNddecVwyilkRmTBrk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJSNE7%2FbtsNk500fkV%2FWAwQhNddecVwyilkRmTBrk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2557&quot; height=&quot;1000&quot; data-origin-width=&quot;2557&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 짧은 쪽으로 맞추기!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt;&lt;b&gt; subtype&lt;/b&gt;에 가까운 방향&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3. Subtyping - Meet&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Meet:&amp;nbsp;&lt;/b&gt;find&amp;nbsp;&lt;u&gt;&lt;b&gt;most common subtype&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;supertype&lt;/b&gt;에 가까운 방향&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;함수의 subtype 구할 때,&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;argument type&lt;/b&gt;: supertype -&amp;gt;&amp;nbsp;&lt;b&gt;meet&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;return type&lt;/b&gt;: subtype -&amp;gt;&amp;nbsp;&lt;b&gt;join&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;( 이 부분 개념 질문 후에 수정 예정.. )&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Static Typing vs Dynamic Typing&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Statically Typed Language&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일 과정에서 all or almost type checking이 완료되는 언어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일 단계에서 많은 programming errors 검출&lt;/li&gt;
&lt;li&gt;runtime type checking overheads를 피함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ex) C, Java, Fun&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dynamically Typed Language&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Almost all type checking이 프로그램 실행 단계에서 완료되는 언어 -&amp;gt; 실행하면서 타입 유추
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;static type systems are restrictive&lt;/li&gt;
&lt;li&gt;rapid prototyping is difficult within a static type system&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ex) PHP, Scheme, Python&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Untyped Language&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;No type checking&lt;/li&gt;
&lt;li&gt;ex) Machine codes -&amp;gt; binary 형태이기에 checking 필요 X&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;in practice, 정적 Language에도 escape mechanism 존재
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unsafe casts in C, Java&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>4학년 1학기 전공/컴파일러</category>
      <author>시데브</author>
      <guid isPermaLink="true">https://sypdevlog.tistory.com/372</guid>
      <comments>https://sypdevlog.tistory.com/372#entry372comment</comments>
      <pubDate>Tue, 15 Apr 2025 02:40:36 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] Chapter 1. 알고리즘: 효율, 분석 그리고 차수</title>
      <link>https://sypdevlog.tistory.com/371</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;경희대학교 한치근 교수님의 알고리즘 수업을 기반으로 정리한 글입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 알고리즘&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제를 해결할 수 있는 &lt;b&gt;&lt;u&gt;잘 정의된(well defined)&lt;/u&gt;&amp;nbsp;&lt;u&gt;유한(finite)&lt;/u&gt;&lt;/b&gt; 시간 내에 종료되는&amp;nbsp;&lt;b&gt;&lt;u&gt;계산적인(computational)&lt;/u&gt; &lt;u&gt;절차(prodcedure)&lt;/u&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;input -&amp;gt; output: 일련의 계산 절차&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 알고리즘과 Method의 차이&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Algorithm: 유한 시간 내에 종료&lt;/li&gt;
&lt;li&gt;Method: 유한 시간 내에 종료하는지 모름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제의 표기 방법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문제:&amp;nbsp;&lt;/b&gt;답을 찾고자 던지는 질문&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Parameter:&amp;nbsp;&lt;/b&gt;문제에서 특정 값이 주어지지 않은 변수 - 매개변수&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Instance(입력):&amp;nbsp;&lt;/b&gt;파라미터에 특정 값을 지정한 것&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Solution(출력):&amp;nbsp;&lt;/b&gt;주어진 사례에 관한 질문에 대한 답&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수학적 귀납법(mathematical induction)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;귀납 출발점(basis, base case):&amp;nbsp;&lt;/b&gt;n = 0(또는 1)일 때, 주장이 사실임을 보임&lt;/li&gt;
&lt;li&gt;&lt;b&gt;귀납 가정(induction(inductive) hypothesis):&amp;nbsp;&lt;/b&gt;어떤 n에 대해서 주장이 사실임을 가정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;귀납 절차(inductive step): &lt;/b&gt;n + 1에 대해서 주장이 사실임을 보임&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0gFb2/btsNjNzUeWw/gRZn15QegoiVJQZ442YWEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0gFb2/btsNjNzUeWw/gRZn15QegoiVJQZ442YWEk/img.png&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;1018&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.8834%; margin-right: 10px;&quot; data-widthpercent=&quot;48.45&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0gFb2/btsNjNzUeWw/gRZn15QegoiVJQZ442YWEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0gFb2%2FbtsNjNzUeWw%2FgRZn15QegoiVJQZ442YWEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1426&quot; height=&quot;1018&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KVuuY/btsNklhNoYs/dokujB7PP9DaQfsZ15iTHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KVuuY/btsNklhNoYs/dokujB7PP9DaQfsZ15iTHk/img.png&quot; data-origin-width=&quot;1428&quot; data-origin-height=&quot;958&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.9538%;&quot; data-widthpercent=&quot;51.55&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KVuuY/btsNklhNoYs/dokujB7PP9DaQfsZ15iTHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKVuuY%2FbtsNklhNoYs%2FdokujB7PP9DaQfsZ15iTHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1428&quot; height=&quot;958&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; n &amp;gt;= 2인 모든 n에 대해서 T(n) &amp;gt; 2^(n/2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;두 Fibonacci algorithm의 비교&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dul2hb/btsNhtnQpS3/tluqKv6Nxzh1eKwuOP3cwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dul2hb/btsNhtnQpS3/tluqKv6Nxzh1eKwuOP3cwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dul2hb/btsNhtnQpS3/tluqKv6Nxzh1eKwuOP3cwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdul2hb%2FbtsNhtnQpS3%2FtluqKv6Nxzh1eKwuOP3cwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1214&quot; height=&quot;630&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 알고리즘의 분석(analysis)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;공간복잡도(space(memory) complexity 분석)&lt;/b&gt;&lt;b&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;입력 크기&lt;/b&gt;에 따라서&amp;nbsp;&lt;b&gt;작업 공간(memory)이 얼마나 필요한지&amp;nbsp;&lt;/b&gt;결정하는 절차&lt;/li&gt;
&lt;li&gt;표현 척도: input size&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시간복잡도(time complexity) 분석&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;입력 크&lt;/b&gt;&lt;b&gt;기&lt;/b&gt;에 따라서&amp;nbsp;&lt;b&gt;단위연산&lt;/b&gt;&lt;b&gt;이 몇 번 수행되는지&lt;/b&gt; 결정하는 절차&lt;/li&gt;
&lt;li&gt;알고리즘이 수행되는 machine에 따라 문제 해결 시간이 달라짐&lt;/li&gt;
&lt;li&gt;표현 척도: comparison, assignment&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 분석 방법의 종류&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Every-case analysis(모든 경우 분석)&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;입력 크기&lt;/b&gt;에만 종속,&amp;nbsp;&lt;u&gt;입력 값과는 무관&lt;/u&gt;하게 결과 값이 항상 일정&lt;u&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Worst-case analysis(&lt;/b&gt;&lt;b&gt;최악의 경우 분석)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;입력 크기&lt;/b&gt;와&amp;nbsp;&lt;b&gt;입력 값&lt;/b&gt; 모두에 종속&lt;/li&gt;
&lt;li&gt;&lt;u&gt;단위연산이 수행되는 횟수가 &lt;b&gt;최대&lt;/b&gt;&lt;/u&gt;인 경우 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Average-case analysis(평균의 경우 분석)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;입력 크기&lt;/b&gt;에 종속&lt;/li&gt;
&lt;li&gt;모든 입력에 대해서 단위연산이 수행되는 기대치(평균)&lt;/li&gt;
&lt;li&gt;각 입력에 대해서 확률 할당 가능&lt;/li&gt;
&lt;li&gt;일반적으로 최악의 경우보다&amp;nbsp;&lt;u&gt;계산이 복잡&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Best-case analysis(최선의 경우 분석)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;입력 크기&lt;/b&gt;와&amp;nbsp;&lt;b&gt;입력 값&lt;/b&gt; 모두에 종속&lt;/li&gt;
&lt;li&gt;&lt;u&gt;단위연산이 수행되는 횟수가 &lt;b&gt;최소&lt;/b&gt;&lt;/u&gt;인 경우 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 배열 덧셈 시간복잡도 분석&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWW2C4/btsNlnfhAPt/97prKaZXMmWErwkL7KOPM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWW2C4/btsNlnfhAPt/97prKaZXMmWErwkL7KOPM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWW2C4/btsNlnfhAPt/97prKaZXMmWErwkL7KOPM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWW2C4%2FbtsNlnfhAPt%2F97prKaZXMmWErwkL7KOPM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;828&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 교환 정렬 시간복잡도 분석&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9yy2E/btsNjMgLnaC/2Y9INDp6cVZSJg6FpRk58k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9yy2E/btsNjMgLnaC/2Y9INDp6cVZSJg6FpRk58k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9yy2E/btsNjMgLnaC/2Y9INDp6cVZSJg6FpRk58k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9yy2E%2FbtsNjMgLnaC%2F2Y9INDp6cVZSJg6FpRk58k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1176&quot; height=&quot;604&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단위연산: 조건문(S[j]와 S[i]의 비교)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;every case&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;j loop 수행 횟수: T(n) = n -1 + n -2 + ... + 1 = ((n-1)n)/2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단위연산: 교환 연산(exchange)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;worst case&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;조건문이 항상 true인 경우 -&amp;gt; W(n) = ((n-1)n)/2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 행렬 곱셈 시간복잡도 분석&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kNcLm/btsNkVjyVaE/KeZGdZM4AQLNA8H4lVZ0g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kNcLm/btsNkVjyVaE/KeZGdZM4AQLNA8H4lVZ0g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kNcLm/btsNkVjyVaE/KeZGdZM4AQLNA8H4lVZ0g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkNcLm%2FbtsNkVjyVaE%2FKeZGdZM4AQLNA8H4lVZ0g0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;178&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단위 연산: 가장 안쪽 for loop에 위치한 곱셈
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;every case&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;T(n) = n * n * n = n^3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 순차 검색 시간복잡도 분석&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NMKvZ/btsNlC4gbQl/C4FAzYM3PjHnKEAoP62lS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NMKvZ/btsNlC4gbQl/C4FAzYM3PjHnKEAoP62lS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NMKvZ/btsNlC4gbQl/C4FAzYM3PjHnKEAoP62lS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNMKvZ%2FbtsNlC4gbQl%2FC4FAzYM3PjHnKEAoP62lS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;178&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단위 연산: 배열이 아이템과 키 x와 비교 연산(S[location] != x)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;worst case&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;x가 last item | x가 배열에 없는 경우 -&amp;gt;&amp;nbsp;&lt;b&gt;W(n) = n&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;average case&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;1051&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uQACN/btsNlmHz6f7/nEhtVbCOQXLmN9iKToTFv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uQACN/btsNlmHz6f7/nEhtVbCOQXLmN9iKToTFv0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uQACN/btsNlmHz6f7/nEhtVbCOQXLmN9iKToTFv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuQACN%2FbtsNlmHz6f7%2FnEhtVbCOQXLmN9iKToTFv0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;601&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;1051&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;best case&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;x가 S[1]에 위치할 때, &lt;b&gt;B(n) = 1&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. Discussion&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;complexity function:&lt;/b&gt; 음이 아닌 정수가 주어지면, 음이 아닌 실수를 내주는 함수 -&amp;gt; 정수 n을 시간으로 매핑!!&lt;/li&gt;
&lt;li&gt;f(n) = n, lg n, 3n^2, ...&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. 정확도 분석&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알고리즘이 의도한 대로 수행되는지 증명하는 절차&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정확한 알고리즘:&amp;nbsp;&lt;/b&gt;어떠한 입려겡 대해서도 답을 출력하면서 멈추는 알고리즘&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정확하지 않은 알고리즘:&amp;nbsp;&lt;/b&gt;어떤 입력에 대해서 멈추지 않거나, 틀린 답을 출력하면서 멈추는 알고리즘&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 차수(order)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대표적인 복잡도 함수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(lg n)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n): 1차 - linear&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(nlg n)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^2): 2차 - quadratic&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^3): 3차 - cubic&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(2^n): 지수 - exponential&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n!)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Theta;(n^n)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;3.1. 복잡도 함수의 증가율&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7ToeD/btsNlhftZn3/k4VauT5O6UqRKq1Zk4UgTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7ToeD/btsNlhftZn3/k4VauT5O6UqRKq1Zk4UgTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7ToeD/btsNlhftZn3/k4VauT5O6UqRKq1Zk4UgTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7ToeD%2FbtsNlhftZn3%2Fk4VauT5O6UqRKq1Zk4UgTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;674&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. Asymptotic(점근적) Behavior&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n이 큰 수가 될 때의 함수 f(n)이 갖는 특성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfdF42/btsNlEuhNQc/c3zCXc2s8LBnNKISDcdYp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfdF42/btsNlEuhNQc/c3zCXc2s8LBnNKISDcdYp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfdF42/btsNlEuhNQc/c3zCXc2s8LBnNKISDcdYp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfdF42%2FbtsNlEuhNQc%2Fc3zCXc2s8LBnNKISDcdYp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;186&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;228&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. 복잡도 함수 표기법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;O()&lt;/b&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;- big oh&lt;/span&gt;: &lt;/b&gt;aymptotic &lt;u&gt;upper bound&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;o() - small oh: &lt;/b&gt;upper bound that is &lt;u&gt;not asymptotically tight&lt;/u&gt;&lt;u&gt;&amp;nbsp;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Omega;&lt;/span&gt;() - omega:&amp;nbsp;&lt;/b&gt;aymtotic&amp;nbsp;&lt;u&gt;lower bound&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;&amp;omega;() - small omega&lt;/b&gt;: lower bound that is &lt;u&gt;not asymptotically tight&lt;/u&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;b&gt;&amp;Theta;() - theta&lt;/b&gt;: asymptotic tight bound&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- big O notation&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2521&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l0VcX/btsNkg28qcd/PI1LZpRcFJTCThuXApRkHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l0VcX/btsNkg28qcd/PI1LZpRcFJTCThuXApRkHk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l0VcX/btsNkg28qcd/PI1LZpRcFJTCThuXApRkHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl0VcX%2FbtsNkg28qcd%2FPI1LZpRcFJTCThuXApRkHk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2521&quot; height=&quot;1000&quot; data-origin-width=&quot;2521&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1378&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B469V/btsNjb19uoo/koYT6GZOn7pUVxBvCeARik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B469V/btsNjb19uoo/koYT6GZOn7pUVxBvCeARik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B469V/btsNjb19uoo/koYT6GZOn7pUVxBvCeARik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB469V%2FbtsNjb19uoo%2FkoYT6GZOn7pUVxBvCeARik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1378&quot; height=&quot;602&quot; data-origin-width=&quot;1378&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) 어떤 함수 g(n)이 O(n^2)에 속한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n이 N보다 커진 시점에서 어떤 2차함수 cn^2보다는 반드시 작은 값을 가짐&lt;/li&gt;
&lt;li&gt;함수 g(n)은 N보다 n이 큰 시점에, n^2보다는 반드시 성능이 좋다는 의미&lt;/li&gt;
&lt;li&gt;시간 복잡도가 O(f(n)) -&amp;gt; 입력 크기 n에 대해서 알고리즘의 수행 시간이 &lt;b&gt;아무리 늦어도 cf(n)&lt;/b&gt;은 된다는 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ex) n^2 + 10n이 O(n^2)에 속하는지?&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;n &amp;gt;= 10인 모든 정수 n에 대해서 n^2 + 10n &amp;lt;= 2n^2 성립&amp;nbsp;&lt;/li&gt;
&lt;li&gt;c = 2, N = 10에 대해서 n^2 + 10n이 O(n^2)에 속함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NBPv7/btsNlhzRrif/Kmatk7OjlM6bO5jfUjDAK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NBPv7/btsNlhzRrif/Kmatk7OjlM6bO5jfUjDAK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NBPv7/btsNlhzRrif/Kmatk7OjlM6bO5jfUjDAK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNBPv7%2FbtsNlhzRrif%2FKmatk7OjlM6bO5jfUjDAK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1366&quot; height=&quot;628&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/urBki/btsNkjMpcXJ/uoYo5tQaiSlzMoXxpyCVG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/urBki/btsNkjMpcXJ/uoYo5tQaiSlzMoXxpyCVG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/urBki/btsNkjMpcXJ/uoYo5tQaiSlzMoXxpyCVG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FurBki%2FbtsNkjMpcXJ%2FuoYo5tQaiSlzMoXxpyCVG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1354&quot; height=&quot;262&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;Omega; notation&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3057&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V6eOz/btsNkGG5y85/kvKQK7xCFG7dOhNuxCtDeK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V6eOz/btsNkGG5y85/kvKQK7xCFG7dOhNuxCtDeK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V6eOz/btsNkGG5y85/kvKQK7xCFG7dOhNuxCtDeK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV6eOz%2FbtsNkGG5y85%2FkvKQK7xCFG7dOhNuxCtDeK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3057&quot; height=&quot;1000&quot; data-origin-width=&quot;3057&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxyyEA/btsNlAMsyes/uZIV1nffLbGBy0xUkWf6Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxyyEA/btsNlAMsyes/uZIV1nffLbGBy0xUkWf6Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxyyEA/btsNlAMsyes/uZIV1nffLbGBy0xUkWf6Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxyyEA%2FbtsNlAMsyes%2FuZIV1nffLbGBy0xUkWf6Wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1388&quot; height=&quot;574&quot; data-origin-width=&quot;1388&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) 함수 g(n)이 &amp;Omega;(n^2)에 속한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정수 n이 N보다 커지는 순간부터, 함수 g(n)은 어떤 2차함수 cn^2보다는 반드시 큰 값을 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ex) 어떤 알고리즘의 시간복잡도가 &amp;Omega;(f(n))이라면,
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 알고리즘의 수행 시간은 cf(n)보다 절대로 더 빠를 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnsTcA/btsNkVYkFYO/0GQHYeXtJXZLesZL0nYnz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnsTcA/btsNkVYkFYO/0GQHYeXtJXZLesZL0nYnz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnsTcA/btsNkVYkFYO/0GQHYeXtJXZLesZL0nYnz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnsTcA%2FbtsNkVYkFYO%2F0GQHYeXtJXZLesZL0nYnz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1146&quot; height=&quot;734&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dr1cK4/btsNlJWGiIk/FFhXeqjkejKQmYKzDTd3UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dr1cK4/btsNlJWGiIk/FFhXeqjkejKQmYKzDTd3UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dr1cK4/btsNlJWGiIk/FFhXeqjkejKQmYKzDTd3UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdr1cK4%2FbtsNlJWGiIk%2FFFhXeqjkejKQmYKzDTd3UK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1382&quot; height=&quot;574&quot; data-origin-width=&quot;1382&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- &amp;Theta; notation&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3462&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ALuIe/btsNkuNIpbL/uYuVEOeNDbFeatFPJwsAv1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ALuIe/btsNkuNIpbL/uYuVEOeNDbFeatFPJwsAv1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ALuIe/btsNkuNIpbL/uYuVEOeNDbFeatFPJwsAv1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FALuIe%2FbtsNkuNIpbL%2FuYuVEOeNDbFeatFPJwsAv1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3462&quot; height=&quot;1000&quot; data-origin-width=&quot;3462&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cs4RXo/btsNlKaei8j/wpvejkTCpHjyxKfwKYnZQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cs4RXo/btsNlKaei8j/wpvejkTCpHjyxKfwKYnZQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cs4RXo/btsNlKaei8j/wpvejkTCpHjyxKfwKYnZQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcs4RXo%2FbtsNlKaei8j%2FwpvejkTCpHjyxKfwKYnZQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1396&quot; height=&quot;660&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- small O notation&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;complexity functions끼리의&lt;/b&gt; 관계를 나타내기 위한 notation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3419&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWerkK/btsNlAFJeaf/Chs8VSAbFQwczG9yTx8yk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWerkK/btsNlAFJeaf/Chs8VSAbFQwczG9yTx8yk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWerkK/btsNlAFJeaf/Chs8VSAbFQwczG9yTx8yk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWerkK%2FbtsNlAFJeaf%2FChs8VSAbFQwczG9yTx8yk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3419&quot; height=&quot;1000&quot; data-origin-width=&quot;3419&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Big O와의 차이점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Big O: &lt;u&gt;실수 c&amp;gt;0 중 하나만&lt;/u&gt; 성립해도 됨&lt;/li&gt;
&lt;li&gt;small o: &lt;u&gt;모든 실수 c&amp;gt;0에 대해서&lt;/u&gt; 성립해야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DaMX4/btsNkJKEYgs/ebTb6VESAmdConP1OcRDuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DaMX4/btsNkJKEYgs/ebTb6VESAmdConP1OcRDuK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DaMX4/btsNkJKEYgs/ebTb6VESAmdConP1OcRDuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDaMX4%2FbtsNkJKEYgs%2FebTb6VESAmdConP1OcRDuK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;663&quot; height=&quot;606&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- &amp;omega; notation&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3384&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wgM3R/btsNjPdGtlZ/KF7OurQX6yIf8OJgMXCAik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wgM3R/btsNjPdGtlZ/KF7OurQX6yIf8OJgMXCAik/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wgM3R/btsNjPdGtlZ/KF7OurQX6yIf8OJgMXCAik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwgM3R%2FbtsNjPdGtlZ%2FKF7OurQX6yIf8OJgMXCAik%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3384&quot; height=&quot;999&quot; data-origin-width=&quot;3384&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.4. 차수의 주요 성질&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SMmjC/btsNlgnqXPS/oBvUUC2ywNAEOdBKfmZTJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SMmjC/btsNlgnqXPS/oBvUUC2ywNAEOdBKfmZTJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SMmjC/btsNlgnqXPS/oBvUUC2ywNAEOdBKfmZTJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSMmjC%2FbtsNlgnqXPS%2FoBvUUC2ywNAEOdBKfmZTJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;574&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3XoTA/btsNjKI2IqW/TFJkS9htdorBBIvMmSNZn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3XoTA/btsNjKI2IqW/TFJkS9htdorBBIvMmSNZn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3XoTA/btsNjKI2IqW/TFJkS9htdorBBIvMmSNZn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3XoTA%2FbtsNjKI2IqW%2FTFJkS9htdorBBIvMmSNZn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1370&quot; height=&quot;594&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.5. 극한을 이용하여 차수를 구하는 방법&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba4Ov9/btsNkvy6PZJ/nkF0p0THFoT9Ia4qaAMWFK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba4Ov9/btsNkvy6PZJ/nkF0p0THFoT9Ia4qaAMWFK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba4Ov9/btsNkvy6PZJ/nkF0p0THFoT9Ia4qaAMWFK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba4Ov9%2FbtsNkvy6PZJ%2FnkF0p0THFoT9Ia4qaAMWFK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;1000&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br5rXH/btsNllvg4bv/4TCx3NfIwoXXU9sIH7BkWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br5rXH/btsNllvg4bv/4TCx3NfIwoXXU9sIH7BkWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br5rXH/btsNllvg4bv/4TCx3NfIwoXXU9sIH7BkWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr5rXH%2FbtsNllvg4bv%2F4TCx3NfIwoXXU9sIH7BkWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1304&quot; height=&quot;852&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;852&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; n이 충분히 커지면, n/2의 천장함수가 a^4보다 커짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;922&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caAAcn/btsNk3Pr8Sw/dYwok7MkGkQ5aGR963yDg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caAAcn/btsNk3Pr8Sw/dYwok7MkGkQ5aGR963yDg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caAAcn/btsNk3Pr8Sw/dYwok7MkGkQ5aGR963yDg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaAAcn%2FbtsNk3Pr8Sw%2FdYwok7MkGkQ5aGR963yDg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;563&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;922&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 알고리즘 복잡도와 컴퓨터 능력&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;알고리즘 복잡도&lt;/b&gt;가&amp;nbsp;&lt;b&gt;cn&lt;/b&gt;일 때 &lt;b&gt;t시간&lt;/b&gt; 동안
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재의 기계가 &lt;b&gt;문제 크기&amp;nbsp;m개&lt;/b&gt;의 문제 해결&lt;/li&gt;
&lt;li&gt;&lt;u&gt;기계 처리 속도 &lt;b&gt;2배&lt;/b&gt;&lt;/u&gt; -&amp;gt; &lt;b&gt;t시간 동안 2m개&lt;/b&gt; 문제 해결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;알고리즘 복잡도&lt;/b&gt;가&amp;nbsp;&lt;b&gt;cn^2&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;일 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;t시간&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;동안&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재의 기계가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;문제 크기&amp;nbsp;m개&lt;/b&gt;의 문제 해결&lt;/li&gt;
&lt;li&gt;&lt;u&gt;기계 처리 속도 &lt;b&gt;4배&lt;/b&gt;&lt;/u&gt; -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;t시간 동안 2m개&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문제 해결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;알고리즘 복잡도&lt;/b&gt;가&amp;nbsp;&lt;b&gt;c2^n&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;일 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;t시간&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;동안&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재의 기계가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;문제 크기&amp;nbsp;m개&lt;/b&gt;의 문제 해결&lt;/li&gt;
&lt;li&gt;&lt;u&gt;기계 처리 속도 &lt;b&gt;2배&lt;/b&gt;&lt;/u&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;t시간 동안 m+1개&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문제 해결&lt;/li&gt;
&lt;li&gt;&lt;u&gt;기계 처리 속도&lt;b&gt;&lt;span&gt; 100&lt;/span&gt;배&lt;/b&gt;&lt;/u&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;t시간 동안 m+6개&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문제 해결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;알고리즘 복잡도&lt;/b&gt;가 &lt;b&gt;(A)&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;일 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;t시간&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;동안&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재의 기계가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;문제 크기&amp;nbsp;m개&lt;/b&gt;의 문제 해결&lt;/li&gt;
&lt;li&gt;&lt;u&gt;기계 처리 속도&lt;b&gt;&lt;span&gt; (B)&lt;/span&gt;배&lt;/b&gt;&lt;/u&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;t시간 동안 (C)개&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문제 해결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 108px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;A&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;cn&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;2m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;cn^2&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;2m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;cn^3&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;8&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;2m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;c2^n&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;m+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;c2^n&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;100&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;m + 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; t시간에 cm^3만큼의 연산이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 기계 성능이 8배 되었으므로, t시간에 8cm^3 만큼 연산 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 증가된 문제 크기를 m'라 가정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; c(m ')^3 = 8cm^3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; m' = 2m&lt;/p&gt;</description>
      <category>4학년 1학기 전공/알고리즘</category>
      <author>시데브</author>
      <guid isPermaLink="true">https://sypdevlog.tistory.com/371</guid>
      <comments>https://sypdevlog.tistory.com/371#entry371comment</comments>
      <pubDate>Mon, 14 Apr 2025 19:35:06 +0900</pubDate>
    </item>
    <item>
      <title>[컴파일러] Chapter 3. Syntax Analysis(Part 2)</title>
      <link>https://sypdevlog.tistory.com/370</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;경희대학교 허선영 교수님의 컴파일러 수업을 기반으로 정리한 글입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Shift-Reduce Parsing - LR(k) Parsing&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;predictive parser:&amp;nbsp;&lt;b&gt;어떤 production이 사용될지 예측&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;오른쪽 항 전체에 해당하는 입력 토큰을 볼 때까지&amp;nbsp;&lt;b&gt;결정을 미룲&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LR(k)&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Left-to-right parse&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rightmost derivation&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;k-token lookahead&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;predictive parsing(LL aprsing)보다 더 많은 grammars&lt;/u&gt;에 대해서 parsing 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 동작 방식&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;parser는&amp;nbsp;&lt;b&gt;stack &amp;amp; input&lt;/b&gt;을 가짐
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;stack contents &amp;amp; next input token&lt;/u&gt;에 의해서, 2가지 동작 중 하나가 결정됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Shift&lt;/span&gt;:&amp;nbsp;&lt;/b&gt;top of stack에 &lt;b&gt;next input&lt;/b&gt;을 &lt;b&gt;push&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Reduce&lt;/span&gt;:&lt;/b&gt; choose a production X -&amp;gt; ABC
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Pop off C, B, A&lt;/li&gt;
&lt;li&gt;Push X&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2132&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOLm7F/btsNiLPI42v/p2Tt76bW4PjVX9JRe2oJ51/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOLm7F/btsNiLPI42v/p2Tt76bW4PjVX9JRe2oJ51/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOLm7F/btsNiLPI42v/p2Tt76bW4PjVX9JRe2oJ51/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOLm7F%2FbtsNiLPI42v%2Fp2Tt76bW4PjVX9JRe2oJ51%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;249&quot; data-origin-width=&quot;2132&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Initialization
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Stack is Empty&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Parset&amp;nbsp;&lt;/b&gt;is at the&amp;nbsp;&lt;b&gt;beginnig of input stream&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;if&lt;b&gt; $ is shifted &lt;/b&gt;-&amp;gt; input stream has been &lt;b&gt;successfully parsed&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Example&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KUjAT/btsNiOenBwa/royLmy8pLvcfZDS7Xwlwt1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KUjAT/btsNiOenBwa/royLmy8pLvcfZDS7Xwlwt1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KUjAT/btsNiOenBwa/royLmy8pLvcfZDS7Xwlwt1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKUjAT%2FbtsNiOenBwa%2FroyLmy8pLvcfZDS7Xwlwt1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;515&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oHT0n/btsNjPwvLFn/ZydLrvEuof5hiJHTsLH5t0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oHT0n/btsNjPwvLFn/ZydLrvEuof5hiJHTsLH5t0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oHT0n/btsNjPwvLFn/ZydLrvEuof5hiJHTsLH5t0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoHT0n%2FbtsNjPwvLFn%2FZydLrvEuof5hiJHTsLH5t0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;289&quot; height=&quot;249&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1613&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rbGfZ/btsNjzAF5kA/SM546XSondEQn4izZlWbe0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rbGfZ/btsNjzAF5kA/SM546XSondEQn4izZlWbe0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rbGfZ/btsNjzAF5kA/SM546XSondEQn4izZlWbe0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrbGfZ%2FbtsNjzAF5kA%2FSM546XSondEQn4izZlWbe0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1613&quot; height=&quot;1000&quot; data-origin-width=&quot;1613&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GkffG/btsNi0MqSqc/fzgktbjjCj4OGjbjqwjnb1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GkffG/btsNi0MqSqc/fzgktbjjCj4OGjbjqwjnb1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GkffG/btsNi0MqSqc/fzgktbjjCj4OGjbjqwjnb1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGkffG%2FbtsNi0MqSqc%2FfzgktbjjCj4OGjbjqwjnb1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1498&quot; height=&quot;1000&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2073&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bndtqm/btsNjBrKjl2/ZxQP2Jk5WV2pcoGU2Wras0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bndtqm/btsNjBrKjl2/ZxQP2Jk5WV2pcoGU2Wras0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bndtqm/btsNjBrKjl2/ZxQP2Jk5WV2pcoGU2Wras0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbndtqm%2FbtsNjBrKjl2%2FZxQP2Jk5WV2pcoGU2Wras0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2073&quot; height=&quot;1000&quot; data-origin-width=&quot;2073&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 어떤 타이밍에 shift/reduce를 진행할지 결정해야 함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;to make&amp;nbsp;&lt;b&gt;shift/reduce decisions&lt;/b&gt; -&amp;gt; parser uses&amp;nbsp;&lt;b&gt;deterministic finite automata(DFA)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;each &lt;b&gt;state&amp;nbsp;&lt;/b&gt;-&amp;gt; corresponds to the&amp;nbsp;&lt;b&gt;contents of stack&amp;nbsp;&lt;/b&gt;at some time&lt;/li&gt;
&lt;li&gt;each&amp;nbsp;&lt;b&gt;edge&lt;/b&gt; -&amp;gt; is&amp;nbsp;&lt;b&gt;labeled with a&lt;/b&gt; &lt;b&gt;symbol&lt;/b&gt;(terminal or non-terminal)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;DFA를&lt;/u&gt; 사용하여 &lt;b&gt;transition table&lt;/b&gt;을 build
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;make decisions based on transition table&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3341&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBRsVD/btsNjE9Pqh5/VguM8vLEtV3OQC3fmwXnAK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBRsVD/btsNjE9Pqh5/VguM8vLEtV3OQC3fmwXnAK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBRsVD/btsNjE9Pqh5/VguM8vLEtV3OQC3fmwXnAK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBRsVD%2FbtsNjE9Pqh5%2FVguM8vLEtV3OQC3fmwXnAK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3341&quot; height=&quot;999&quot; data-origin-width=&quot;3341&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;sn:&amp;nbsp;&lt;/b&gt;&lt;u&gt;shift&lt;/u&gt; in to state n&lt;/li&gt;
&lt;li&gt;&lt;b&gt;gn:&amp;nbsp;&lt;/b&gt;&lt;u&gt;goto&lt;/u&gt; state n&lt;/li&gt;
&lt;li&gt;&lt;b&gt;rk&lt;/b&gt;: &lt;u&gt;reduce&lt;/u&gt; by rule k&lt;/li&gt;
&lt;li&gt;&lt;b&gt;a:&amp;nbsp;&lt;/b&gt;&lt;u&gt;accept&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Example&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;shift +&amp;nbsp;&lt;b&gt;state num&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;reduce +&amp;nbsp;&lt;b&gt;production num&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1863&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buakEJ/btsNjag7SJz/8LlYpguByo0Ar1BTHpEH90/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buakEJ/btsNjag7SJz/8LlYpguByo0Ar1BTHpEH90/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buakEJ/btsNjag7SJz/8LlYpguByo0Ar1BTHpEH90/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuakEJ%2FbtsNjag7SJz%2F8LlYpguByo0Ar1BTHpEH90%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1863&quot; height=&quot;1000&quot; data-origin-width=&quot;1863&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 4 Actions&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Shift(n)&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력을&amp;nbsp;&lt;b&gt;한 칸 앞으로&amp;nbsp;&lt;/b&gt;진행&lt;/li&gt;
&lt;li&gt;&lt;b&gt;현재 input token&lt;/b&gt;과 &lt;b&gt;new state n&lt;/b&gt;을 stack에 &lt;b&gt;push&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reduce(k)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;rule k의 우변 길이(symbols 개수) 만큼&lt;/u&gt; stack을 &lt;b&gt;pop&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;goto n&lt;/b&gt; 수행&lt;/li&gt;
&lt;li&gt;전이된 &lt;b&gt;new state n&lt;/b&gt;을 stack에 push&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1807&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZtIJX/btsNjkqjzNv/8lgXeOQXwV0scaXjMpaY9K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZtIJX/btsNjkqjzNv/8lgXeOQXwV0scaXjMpaY9K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZtIJX/btsNjkqjzNv/8lgXeOQXwV0scaXjMpaY9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZtIJX%2FbtsNjkqjzNv%2F8lgXeOQXwV0scaXjMpaY9K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;302&quot; data-origin-width=&quot;1807&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Accept&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Stop parsing, report success&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Error&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Stop parsing, report error&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. LR(k) Parsing&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LR(k) parsing -&amp;gt;&amp;nbsp;&lt;b&gt;content of its stack &amp;amp; next k tokens&amp;nbsp;&lt;/b&gt;사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로는 &lt;u&gt;k&amp;gt;1은 사용되지 않음&lt;/u&gt; -&amp;gt; parsing algorithm이 복잡해지고, memory도 많이 사용됨&lt;/li&gt;
&lt;li&gt;대부분의 programming languages는 LR(1) grammars로 표현됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LR(0) parsing&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;lookahead를 아예 보지 않고&lt;/u&gt;, shift/reduce decisions 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. LR(0) Parsing&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;stack is empty&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;input contains&lt;b&gt; 'S' string followed by a '$'&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;parser position:&lt;/b&gt; parser가 보고있는 위치&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2289&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IoKbh/btsNiZGFeKy/D3oNbkyqOvDq18MEfaTOq1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IoKbh/btsNiZGFeKy/D3oNbkyqOvDq18MEfaTOq1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IoKbh/btsNiZGFeKy/D3oNbkyqOvDq18MEfaTOq1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIoKbh%2FbtsNiZGFeKy%2FD3oNbkyqOvDq18MEfaTOq1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;256&quot; data-origin-width=&quot;2289&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Basic Operations&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Closure(I):&lt;/b&gt; &lt;u&gt;parser position 오른쪽에 위치&lt;/u&gt;한 &lt;b&gt;non-terminal로 시작하는 모든 productions&lt;/b&gt;를 LR(0) items를 나타내는 &lt;b&gt;I에 추가&amp;nbsp;&lt;/b&gt;-&amp;gt; I가 변하지 않을 때까지&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1639&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qo2Hc/btsNi5mAfwp/nCwFrkc0rUB9NocrbRAmQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qo2Hc/btsNi5mAfwp/nCwFrkc0rUB9NocrbRAmQk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qo2Hc/btsNi5mAfwp/nCwFrkc0rUB9NocrbRAmQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqo2Hc%2FbtsNi5mAfwp%2FnCwFrkc0rUB9NocrbRAmQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;346&quot; data-origin-width=&quot;1639&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcdCdk/btsNi9CxW76/7pqHlhr5KNmikKNsAZ6WHK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcdCdk/btsNi9CxW76/7pqHlhr5KNmikKNsAZ6WHK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcdCdk/btsNi9CxW76/7pqHlhr5KNmikKNsAZ6WHK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcdCdk%2FbtsNi9CxW76%2F7pqHlhr5KNmikKNsAZ6WHK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;421&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; S로 시작되는 모든 productions 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Goto(I, X):&lt;/b&gt; 모든 items에서 parser position을 symbol X 이후로 이동하는 함수&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 state I에서 symbol X를 읽었을 때, 다음 state는 무엇인지 알려줌&lt;/li&gt;
&lt;li&gt;item 집합 I 내부에서, parser position 바로 &lt;u&gt;우측에 X가 있는 items&lt;/u&gt;만 골라서 해당 items의 &lt;b&gt;parser position을 한 칸 오른쪽&lt;/b&gt;으로 이동 -&amp;gt; &lt;u&gt;해당 아이템들로 만든 집합&lt;/u&gt;에 &lt;b&gt;Clousre 연산&lt;/b&gt; 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmXEbR/btsNi3oODlt/j8QikCxKfGGTGKv9t3f3k1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmXEbR/btsNi3oODlt/j8QikCxKfGGTGKv9t3f3k1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmXEbR/btsNi3oODlt/j8QikCxKfGGTGKv9t3f3k1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmXEbR%2FbtsNi3oODlt%2Fj8QikCxKfGGTGKv9t3f3k1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1852&quot; height=&quot;1000&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TTQtL/btsNivkIdt3/YlRM3gkYvKiCXylC7rFf7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TTQtL/btsNivkIdt3/YlRM3gkYvKiCXylC7rFf7k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TTQtL/btsNivkIdt3/YlRM3gkYvKiCXylC7rFf7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTTQtL%2FbtsNivkIdt3%2FYlRM3gkYvKiCXylC7rFf7k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;235&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Example(DFA 생성)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1wor9/btsNjzAGnsh/2951MkCljTImASMDYbjHHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1wor9/btsNjzAGnsh/2951MkCljTImASMDYbjHHk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1wor9/btsNjzAGnsh/2951MkCljTImASMDYbjHHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1wor9%2FbtsNjzAGnsh%2F2951MkCljTImASMDYbjHHk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1317&quot; height=&quot;1000&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2389&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/op8j3/btsNjC5hHCl/b5SBEKg21gMxnykl0gzOD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/op8j3/btsNjC5hHCl/b5SBEKg21gMxnykl0gzOD1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/op8j3/btsNjC5hHCl/b5SBEKg21gMxnykl0gzOD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fop8j3%2FbtsNjC5hHCl%2Fb5SBEKg21gMxnykl0gzOD1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2389&quot; height=&quot;1000&quot; data-origin-width=&quot;2389&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; DFA 완성&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Building Transition Table&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3521&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FvIXU/btsNkGlkn4G/RzXywBgyNKkkqHMTtvXauK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FvIXU/btsNkGlkn4G/RzXywBgyNKkkqHMTtvXauK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FvIXU/btsNkGlkn4G/RzXywBgyNKkkqHMTtvXauK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFvIXU%2FbtsNkGlkn4G%2FRzXywBgyNKkkqHMTtvXauK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3521&quot; height=&quot;1000&quot; data-origin-width=&quot;3521&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2089&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYF9hi/btsNiKpMG7w/OBnNm5JkwnsM4R2cpArDS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYF9hi/btsNiKpMG7w/OBnNm5JkwnsM4R2cpArDS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYF9hi/btsNiKpMG7w/OBnNm5JkwnsM4R2cpArDS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYF9hi%2FbtsNiKpMG7w%2FOBnNm5JkwnsM4R2cpArDS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2089&quot; height=&quot;1000&quot; data-origin-width=&quot;2089&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; DFA 이용하여 작성&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; conflict 발생 시에, LR(0)로 parsing 불가능한 grammar&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2098&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLHNT7/btsNi2KdYkH/xwV0l1s0lRjLVJaFxSzUz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLHNT7/btsNi2KdYkH/xwV0l1s0lRjLVJaFxSzUz0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLHNT7/btsNi2KdYkH/xwV0l1s0lRjLVJaFxSzUz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLHNT7%2FbtsNi2KdYkH%2FxwV0l1s0lRjLVJaFxSzUz0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2098&quot; height=&quot;999&quot; data-origin-width=&quot;2098&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 최종 Example&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MD6Gv/btsNjCRJqiC/mcuCK1IIX2AyXyEeYTdwC1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MD6Gv/btsNjCRJqiC/mcuCK1IIX2AyXyEeYTdwC1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MD6Gv/btsNjCRJqiC/mcuCK1IIX2AyXyEeYTdwC1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMD6Gv%2FbtsNjCRJqiC%2FmcuCK1IIX2AyXyEeYTdwC1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2300&quot; height=&quot;1000&quot; data-origin-width=&quot;2300&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. Simple LR Parsing&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LR(0) parser를 기반으로 하지만, &lt;b&gt;&lt;u&gt;reduce할 때 FOLLOW 집합을 사용&lt;/u&gt;&lt;/b&gt;해 reduce의 범위를 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQRf2N/btsNggoMGZP/j6RsybD99PnnUNZWLV6XY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQRf2N/btsNggoMGZP/j6RsybD99PnnUNZWLV6XY0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQRf2N/btsNggoMGZP/j6RsybD99PnnUNZWLV6XY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQRf2N%2FbtsNggoMGZP%2Fj6RsybD99PnnUNZWLV6XY0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2236&quot; height=&quot;999&quot; data-origin-width=&quot;2236&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; state3에서 기존에는 모든 terminals에 대해서 reduce 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; SLR에서는 T의 follow인 +, $에 대해서만 reduce를 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; r3에서도 마찬가지로 E의 follow인 $에 대해서만 reduce 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; LR(0)로는 parsing 불가능, but SLR로는 parsing 가능한 gammar!!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3. LR(1) Parsing&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;LR(0)&lt;/b&gt;: A의 &lt;u&gt;follower를 모두&lt;/u&gt; 고려&lt;br /&gt;&lt;b&gt;SLR:&amp;nbsp;&lt;/b&gt;&lt;u&gt;모든 terminal&lt;/u&gt; 고려&lt;br /&gt;&lt;b&gt;LR(1):&amp;nbsp;&lt;/b&gt;&lt;u&gt;lookahead symbol만&lt;/u&gt; 고려&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LR(1) item은 2개의 components를 가짐
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;Production&lt;/u&gt;&lt;b&gt;: A -&amp;gt; &lt;/b&gt;&lt;b&gt;&amp;alpha;.&amp;beta;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;parser position은 현재 분석이 어디까지 진행되었는지 나타냄&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Lookahead symbol:&lt;/u&gt;&lt;b&gt; x&amp;nbsp;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아이템이 적용될 수 있는 다음 input symbol&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ex) E -&amp;gt; T.+E, $ : T까지 분석을 완료했고, +E를 남겨두었으며, 해당 production은 input symbol이 $일 때 사용 가능하다는 뜻&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Basic Functions&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Closure&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qo2Hc/btsNi5mAfwp/nCwFrkc0rUB9NocrbRAmQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qo2Hc/btsNi5mAfwp/nCwFrkc0rUB9NocrbRAmQk/img.jpg&quot; style=&quot;width: 51.7884%; margin-right: 10px;&quot; width=&quot;567&quot; height=&quot;346&quot; data-widthpercent=&quot;52.4&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;1000&quot; data-origin-width=&quot;1639&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qo2Hc/btsNi5mAfwp/nCwFrkc0rUB9NocrbRAmQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqo2Hc%2FbtsNi5mAfwp%2FnCwFrkc0rUB9NocrbRAmQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1639&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/to7iC/btsNiBFinkO/eqxY1XLYqYOuj4o4bOI0J0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/to7iC/btsNiBFinkO/eqxY1XLYqYOuj4o4bOI0J0/img.jpg&quot; data-origin-width=&quot;1489&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.0488%;&quot; data-widthpercent=&quot;47.6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/to7iC/btsNiBFinkO/eqxY1XLYqYOuj4o4bOI0J0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fto7iC%2FbtsNiBFinkO%2FeqxY1XLYqYOuj4o4bOI0J0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1489&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;좌측: LR(0), 우측: LR(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; lookahead symbol인 z까지 고려,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;beta; is empty: FIRST(&amp;beta;z) = FIRST(z)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;&amp;beta; is nullable: FIRST(&amp;beta;z) = FIRST(&amp;beta;) &amp;cup; FIRST(z)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &amp;beta; is not nullable: FIRST(&amp;beta;)만 확인&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Goto&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmXEbR/btsNi3oODlt/j8QikCxKfGGTGKv9t3f3k1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmXEbR/btsNi3oODlt/j8QikCxKfGGTGKv9t3f3k1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;1000&quot; data-origin-width=&quot;1852&quot; style=&quot;width: 46.2472%; margin-right: 10px;&quot; data-widthpercent=&quot;46.79&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmXEbR/btsNi3oODlt/j8QikCxKfGGTGKv9t3f3k1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmXEbR%2FbtsNi3oODlt%2Fj8QikCxKfGGTGKv9t3f3k1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1852&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNjQAh/btsNjbm0WR4/4hHctEDCgTCOjmsmEbzpD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNjQAh/btsNjbm0WR4/4hHctEDCgTCOjmsmEbzpD1/img.jpg&quot; data-origin-width=&quot;2106&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 52.59%;&quot; data-widthpercent=&quot;53.21&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNjQAh/btsNjbm0WR4/4hHctEDCgTCOjmsmEbzpD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNjQAh%2FbtsNjbm0WR4%2F4hHctEDCgTCOjmsmEbzpD1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2106&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;좌측: LR(0), 우측: LR(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; LR(0)에서는 단순히 parser position 이동 후 closure 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; LR(1)에서는 parser position 이동 후 closure를 적용하는데, lookahead가 유지돼야 함&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Example&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) First State 빌드 - Closure 연산&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2260&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYIRVs/btsNjF81cFb/scXJf1cESx2AQ3pK0iV6Hk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYIRVs/btsNjF81cFb/scXJf1cESx2AQ3pK0iV6Hk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYIRVs/btsNjF81cFb/scXJf1cESx2AQ3pK0iV6Hk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYIRVs%2FbtsNjF81cFb%2FscXJf1cESx2AQ3pK0iV6Hk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2260&quot; height=&quot;1000&quot; data-origin-width=&quot;2260&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- V -&amp;gt; x, $과 V -&amp;gt; x, =는 다른 것으로 취급!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) Goto&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1941&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3xYzf/btsNjAT9XGZ/O6gokZjdgn7Uu7bxYj5zj1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3xYzf/btsNjAT9XGZ/O6gokZjdgn7Uu7bxYj5zj1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3xYzf/btsNjAT9XGZ/O6gokZjdgn7Uu7bxYj5zj1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3xYzf%2FbtsNjAT9XGZ%2FO6gokZjdgn7Uu7bxYj5zj1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1941&quot; height=&quot;1000&quot; data-origin-width=&quot;1941&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; $ sign이 나오는 경우에만 reduce 연산 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 기존 LR(0), SLR이 수행하던 범위보다 축소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; but, state 개수가 많아지고 구조가 복잡해짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R8Dyl/btsNkWBJVZP/vFa1jYcUCim2ObYETR5ek1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R8Dyl/btsNkWBJVZP/vFa1jYcUCim2ObYETR5ek1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R8Dyl/btsNkWBJVZP/vFa1jYcUCim2ObYETR5ek1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR8Dyl%2FbtsNkWBJVZP%2FvFa1jYcUCim2ObYETR5ek1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;588&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.4. LALR(1)&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;LR(1)의 table 크기가 너무 커지는 문제&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;production이 같은데, lookahead symbol이 다른 경우&lt;/u&gt;를 &lt;b&gt;merge&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LALR(1): Look-Ahead&lt;/b&gt; &lt;b&gt;LR(1)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEZuE5/btsNkuyU3pR/GfNY9pKYGSLZU9rqtqBgG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEZuE5/btsNkuyU3pR/GfNY9pKYGSLZU9rqtqBgG1/img.jpg&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 55.2222%; margin-right: 10px;&quot; data-widthpercent=&quot;55.87&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEZuE5/btsNkuyU3pR/GfNY9pKYGSLZU9rqtqBgG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEZuE5%2FbtsNkuyU3pR%2FGfNY9pKYGSLZU9rqtqBgG1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1884&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEKbcv/btsNkhGDjK1/JqCUdqd6DPirYjlrCGiVY1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEKbcv/btsNkhGDjK1/JqCUdqd6DPirYjlrCGiVY1/img.jpg&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 43.615%;&quot; data-widthpercent=&quot;44.13&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEKbcv/btsNkhGDjK1/JqCUdqd6DPirYjlrCGiVY1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEKbcv%2FbtsNkhGDjK1%2FJqCUdqd6DPirYjlrCGiVY1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1488&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.5. Parsing Power&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1563&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LHYkw/btsNkJvSy3g/PDhXDf6ssvK47mjZONUL80/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LHYkw/btsNkJvSy3g/PDhXDf6ssvK47mjZONUL80/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LHYkw/btsNkJvSy3g/PDhXDf6ssvK47mjZONUL80/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLHYkw%2FbtsNkJvSy3g%2FPDhXDf6ssvK47mjZONUL80%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1563&quot; height=&quot;1000&quot; data-origin-width=&quot;1563&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Real-world Parser Generators&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Parser Generator&lt;/b&gt;:&amp;nbsp;&lt;u&gt;문법만 정의&lt;/u&gt;해주면, 해당 문법에 맞는&amp;nbsp;&lt;u&gt;parser를 자동으로 생성&lt;/u&gt;해주는 프로그램&amp;nbsp;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;yacc, bison&lt;/b&gt;: &lt;u&gt;LALR&lt;/u&gt; parser generators for &lt;u&gt;C&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Parser Generator Specification
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Input&lt;/b&gt;: a set of&amp;nbsp;&lt;u&gt;context-free grammars&lt;/u&gt; specifying a parser&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;context-free grammar:&amp;nbsp;&lt;/b&gt;문맥에 상관 없이 어떤 Non-terminal이 들어와도, 그에 대한 production-rule이 존재하는 문법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Outputs&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;a &lt;u&gt;parser in target language&lt;/u&gt; -&amp;gt; 파서 코드 자동 생성&lt;/li&gt;
&lt;li&gt;a description of&amp;nbsp;&lt;u&gt;state machine&lt;/u&gt; -&amp;gt; 어떤 state에서 어떤 symbol을 만나면 어떻게 전이되는지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rules&lt;/b&gt;: &lt;u&gt;pattern &amp;amp; action&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;pattern:&amp;nbsp;&lt;/b&gt;context free grammar&lt;/li&gt;
&lt;li&gt;&lt;b&gt;action:&lt;/b&gt; 문법이 만족되었을 때 실행할 code fragment&lt;/li&gt;
&lt;li&gt;example) exp: exp PLUS exp { $$ = $1 + $2; }
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;exp PLUS exp라는 pattern -&amp;gt; { $$ = $1 + $2 ; }라는 코드 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Parser Generator Example: GNU Bison&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SMNgU/btsNjbACUPi/njWcz5UKuA4qle9SHGfXz1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SMNgU/btsNjbACUPi/njWcz5UKuA4qle9SHGfXz1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SMNgU/btsNjbACUPi/njWcz5UKuA4qle9SHGfXz1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSMNgU%2FbtsNjbACUPi%2FnjWcz5UKuA4qle9SHGfXz1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;1000&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; yyparse() 호출로 파서 실행&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;User Declaration&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;rules section&lt;/u&gt;에서 사용가능한 various values 정의&lt;/li&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;terminal&lt;/b&gt;, &lt;b&gt;non-terminal symbols&lt;/b&gt;, and thier&lt;b&gt; types&lt;/b&gt;&lt;/u&gt; 선언&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%token NUM&lt;/li&gt;
&lt;li&gt;%token &amp;lt;type&amp;gt; NUM&lt;/li&gt;
&lt;li&gt;%token &amp;lt;type&amp;gt; exp&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;precedences(우선순위)&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;선언 -&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;b&gt;shift-reduce conflicts&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;해결&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(optionally) specify start symbol&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;%start prog&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Rules&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;pattern &amp;amp; action -&amp;gt; pattern에 따라 어떤 action을 취할지&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Location&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;@$&lt;/b&gt;: location of the whole group&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;@1&lt;/b&gt;: location of the first subexpression&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3417&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLEYwu/btsNktfLfbo/O9mAjLJfPCWdUldi2qidIk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLEYwu/btsNktfLfbo/O9mAjLJfPCWdUldi2qidIk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLEYwu/btsNktfLfbo/O9mAjLJfPCWdUldi2qidIk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLEYwu%2FbtsNktfLfbo%2FO9mAjLJfPCWdUldi2qidIk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3417&quot; height=&quot;999&quot; data-origin-width=&quot;3417&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Ambigous Grammar&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Ambiguous Grammar:&amp;nbsp;&lt;/b&gt;같은 expression에 대해서 2개 이상의 parse tree가 존재하는 grammar&lt;/li&gt;
&lt;li&gt;example) 4 + 5 * 6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2725&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRUYAL/btsNi15Reth/qTszDdzdqGPoaOqdBvkKnK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRUYAL/btsNi15Reth/qTszDdzdqGPoaOqdBvkKnK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRUYAL/btsNi15Reth/qTszDdzdqGPoaOqdBvkKnK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRUYAL%2FbtsNi15Reth%2FqTszDdzdqGPoaOqdBvkKnK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2725&quot; height=&quot;1000&quot; data-origin-width=&quot;2725&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2671&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eIsCug/btsNiO6Nnhi/wDRXWucAzP2eLekatlZS61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eIsCug/btsNiO6Nnhi/wDRXWucAzP2eLekatlZS61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eIsCug/btsNiO6Nnhi/wDRXWucAzP2eLekatlZS61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeIsCug%2FbtsNiO6Nnhi%2FwDRXWucAzP2eLekatlZS61%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2671&quot; height=&quot;1000&quot; data-origin-width=&quot;2671&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1. Handling Ambiguous Grammar&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;YACC -&amp;gt;&amp;nbsp;&lt;b&gt;shift-reduce conflicts&lt;/b&gt;로 알림
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4 + 5 * 6
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stack에 expr + expr이 쌓인 상태에서, current token으로 *가 들어옴&lt;/li&gt;
&lt;li&gt;parser: expr -&amp;gt; expr + expr rule을 통해서&amp;nbsp;&lt;b&gt;reduce&amp;nbsp;&lt;/b&gt;or&amp;nbsp;&lt;b&gt;shift&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Prefer &lt;u&gt;shift&lt;/u&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4 + 5 + 6
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stack에 expr + expr이 쌓인 상태에서, current token으로 +가 들어옴&lt;/li&gt;
&lt;li&gt;parser: expr -&amp;gt; expr + expr rule을 통해서&amp;nbsp;&lt;b&gt;reduce&amp;nbsp;&lt;/b&gt;or&amp;nbsp;&lt;b&gt;shift&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Prefer&lt;u&gt; reduce&lt;/u&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbc15n/btsNkXm8kZX/9qHk8snNPcgg2e93JRNI7K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbc15n/btsNkXm8kZX/9qHk8snNPcgg2e93JRNI7K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbc15n/btsNkXm8kZX/9qHk8snNPcgg2e93JRNI7K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbc15n%2FbtsNkXm8kZX%2F9qHk8snNPcgg2e93JRNI7K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;495&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; shift 이후, 위에부터 reduce 진행하니까, 6 * 5를 먼저 reduce&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2. Directives&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Three Solutions
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Let&amp;nbsp;&lt;b&gt;YACC&amp;nbsp;&lt;/b&gt;complain, but &lt;u&gt;check if the choice (shift) is correct&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rewrite grammar&amp;nbsp;&lt;/b&gt;to&amp;nbsp;&lt;u&gt;eliminate ambiguity&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;Keep grammar, but add&amp;nbsp;&lt;b&gt;precedence directives&lt;/b&gt; -&amp;gt; conflicts가 해결되는 방향으로
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;%left, %right, %nonassoc&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;for this grammar -&amp;gt; &lt;b&gt;라인의 순서가 낮으면 우선순위가 높음&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;$left PLUS MINUS&amp;nbsp;&lt;/b&gt;-&amp;gt; PLUS MINUS 동등&lt;/li&gt;
&lt;li&gt;&lt;b&gt;$left MULT DIV&amp;nbsp;&lt;/b&gt;-&amp;gt; MULT DIV 동등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;u&gt;주어진 directives에 따라&lt;/u&gt;, YACC은 each terminal &amp;amp; rule에 precedence 부여&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;rightmost terminal&lt;/b&gt;과 &lt;b&gt;shift할 terminal&lt;/b&gt;의 precedence 비교&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I2ICM/btsNiyIDwCo/CTqgWKye2FeKoOUA7Tpo81/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I2ICM/btsNiyIDwCo/CTqgWKye2FeKoOUA7Tpo81/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I2ICM/btsNiyIDwCo/CTqgWKye2FeKoOUA7Tpo81/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI2ICM%2FbtsNiyIDwCo%2FCTqgWKye2FeKoOUA7Tpo81%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;477&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 shift-reduce conflict에 따라, YACC는 action 수행
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;reduce 수행할 rule&lt;/b&gt;과 &lt;b&gt;shift 수행할 terminal&lt;/b&gt;의 precedence find
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;prec(terminal)&lt;/b&gt; &amp;gt; prec(rule): &lt;b&gt;shift&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;prec(terminal) &amp;lt; &lt;b&gt;prec(rule)&lt;/b&gt;: &lt;b&gt;reduce&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;prec(terminal) &lt;b&gt;=&lt;/b&gt; prec(rule)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;assoc(terminal) = &lt;b&gt;left : reduce&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;assoc(terminal) = &lt;b&gt;right: shift&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;assoc(terminal) = &lt;b&gt;nonassoc : report error&amp;nbsp;&lt;/b&gt;-&amp;gt; 결합 불가(오류 처리)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;associativity(결합법칙):&amp;nbsp;&lt;/b&gt;연산자끼리 우선순위가 같을 때, 어느 방향으로 묶을 것인지 결정하는 규칙&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1933&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPPCiS/btsNkWhs3be/ui4YyV6jXtQk3s3TkaSDaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPPCiS/btsNkWhs3be/ui4YyV6jXtQk3s3TkaSDaK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPPCiS/btsNkWhs3be/ui4YyV6jXtQk3s3TkaSDaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPPCiS%2FbtsNkWhs3be%2Fui4YyV6jXtQk3s3TkaSDaK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1933&quot; height=&quot;1000&quot; data-origin-width=&quot;1933&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3. Dangling Else Problem&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Valid Program: if a then if b then S1 else S2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3721&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqcMYx/btsNhtOy1Jf/SqjPddekN4WJD7Xk7Hhbm0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqcMYx/btsNhtOy1Jf/SqjPddekN4WJD7Xk7Hhbm0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqcMYx/btsNhtOy1Jf/SqjPddekN4WJD7Xk7Hhbm0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqcMYx%2FbtsNhtOy1Jf%2FSqjPddekN4WJD7Xk7Hhbm0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3721&quot; height=&quot;1000&quot; data-origin-width=&quot;3721&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; if a then if b then s1 else s2 동작을 원하지만, S1이 stack의 top에 위치할 때&amp;nbsp;&lt;b&gt;shift-reduce conflict&lt;/b&gt; 발생&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;solution&lt;/b&gt;: eliminate ambiguity by&amp;nbsp;&lt;u&gt;&lt;b&gt;modifying grammar&lt;/b&gt;&lt;/u&gt;(matched/unmatched)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbFveE/btsNgxqqh7J/0FqvYUiIpSFfGcNo0CkTKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbFveE/btsNgxqqh7J/0FqvYUiIpSFfGcNo0CkTKK/img.jpg&quot; data-origin-width=&quot;2293&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 30.9153%; margin-right: 10px;&quot; data-widthpercent=&quot;31.28&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbFveE/btsNgxqqh7J/0FqvYUiIpSFfGcNo0CkTKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbFveE%2FbtsNgxqqh7J%2F0FqvYUiIpSFfGcNo0CkTKK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2293&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IfZoc/btsNiwRztr6/bxpDoEuJZY6leU3eIGvFzk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IfZoc/btsNiwRztr6/bxpDoEuJZY6leU3eIGvFzk/img.jpg&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;794&quot; data-is-animation=&quot;false&quot; style=&quot;width: 67.9219%;&quot; data-widthpercent=&quot;68.72&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IfZoc/btsNiwRztr6/bxpDoEuJZY6leU3eIGvFzk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIfZoc%2FbtsNiwRztr6%2FbxpDoEuJZY6leU3eIGvFzk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.4. Default Behavior&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Directives not specified&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;shift-reduce:&amp;nbsp;&lt;/b&gt;report error, &lt;u&gt;shift&lt;/u&gt; by default&lt;/li&gt;
&lt;li&gt;&lt;b&gt;reduce-reduce:&amp;nbsp;&lt;/b&gt;report error, &lt;u&gt;reduce by rule that occurs first&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;What to do&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;shift-reduce:&amp;nbsp;&lt;/b&gt;&lt;u&gt;acceptable in well defined class&lt;/u&gt;, 그러나 웬만하면 없애는 것이 좋음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;reduce-reduce:&amp;nbsp;&lt;/b&gt;&lt;u&gt;unacceptable&lt;/u&gt;, &lt;u&gt;&lt;b&gt;rewrite grammar&lt;/b&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.5. %prec Directive&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;commonly used for the&amp;nbsp;&lt;b&gt;unary minus&amp;nbsp;&lt;/b&gt;&lt;b&gt;problem&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%left PLUS MINUS&lt;/li&gt;
&lt;li&gt;%left MULT DIV&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;consider - 4 * 6&lt;/li&gt;
&lt;li&gt;&lt;b&gt;unary minus&lt;/b&gt;가 우선순위가 높을 것을 권장, but MINUS의 precedence가 MULT보다 낮음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-( 4 * 6 ) not ( -4 ) * 6&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;solution&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;%token NUM PLUS MINUS MULT DIV UMINUS&lt;/li&gt;
&lt;li&gt;%left PLUS MINUS&lt;/li&gt;
&lt;li&gt;%left MULT DIV&lt;/li&gt;
&lt;li&gt;%left UMINUS&lt;/li&gt;
&lt;li&gt;expr: MINUX expr %prec UMINUS {}&lt;br /&gt;|&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expr PLUS expr&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{}&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@legionary7931/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%96%B8%EC%96%B4-Context-Free-grammar&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@legionary7931/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%96%B8%EC%96%B4-Context-Free-grammar&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1744559157779&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[프로그래밍언어] - Context-Free grammar&quot; data-og-description=&quot;  Parser *   Parser의 역할* Parser는 scanner로부터 tokenized 된 word stream을 받아 syntax를 확인하고, 올바른 syntax라면 중간 표현(Intermediate Representation, IR)을 도출해내는 컴파&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@legionary7931/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%96%B8%EC%96%B4-Context-Free-grammar&quot; data-og-url=&quot;https://velog.io/@legionary7931/프로그래밍언어-Context-Free-grammar&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bi6Flr/hyYCha0KeV/LkSY4PSYQlx0x312GXVDi0/img.png?width=1594&amp;amp;height=211&amp;amp;face=0_0_1594_211,https://scrap.kakaocdn.net/dn/8HFY6/hyYChCKTRT/ZFNraaseyK0slKKTgKi5vk/img.png?width=1594&amp;amp;height=211&amp;amp;face=0_0_1594_211,https://scrap.kakaocdn.net/dn/1lUyq/hyYEImlLIM/zxBAjOmqmWoN5D9yzOJNf1/img.png?width=1657&amp;amp;height=722&amp;amp;face=0_0_1657_722&quot;&gt;&lt;a href=&quot;https://velog.io/@legionary7931/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%96%B8%EC%96%B4-Context-Free-grammar&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@legionary7931/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%96%B8%EC%96%B4-Context-Free-grammar&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bi6Flr/hyYCha0KeV/LkSY4PSYQlx0x312GXVDi0/img.png?width=1594&amp;amp;height=211&amp;amp;face=0_0_1594_211,https://scrap.kakaocdn.net/dn/8HFY6/hyYChCKTRT/ZFNraaseyK0slKKTgKi5vk/img.png?width=1594&amp;amp;height=211&amp;amp;face=0_0_1594_211,https://scrap.kakaocdn.net/dn/1lUyq/hyYEImlLIM/zxBAjOmqmWoN5D9yzOJNf1/img.png?width=1657&amp;amp;height=722&amp;amp;face=0_0_1657_722');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[프로그래밍언어] - Context-Free grammar&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  Parser *   Parser의 역할* Parser는 scanner로부터 tokenized 된 word stream을 받아 syntax를 확인하고, 올바른 syntax라면 중간 표현(Intermediate Representation, IR)을 도출해내는 컴파&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>4학년 1학기 전공/컴파일러</category>
      <author>시데브</author>
      <guid isPermaLink="true">https://sypdevlog.tistory.com/370</guid>
      <comments>https://sypdevlog.tistory.com/370#entry370comment</comments>
      <pubDate>Mon, 14 Apr 2025 02:31:27 +0900</pubDate>
    </item>
    <item>
      <title>Elasticsearch 기본 개념 + ELK stack</title>
      <link>https://sypdevlog.tistory.com/369</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Elasticsearch&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Elasticsearch:&amp;nbsp;&lt;/b&gt;Apache Lucene 라이브러리를 기반으로 하는&lt;u&gt;&lt;b&gt; 오픈 소스 검색 및 분석 엔진&lt;/b&gt;&lt;/u&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주로&amp;nbsp;&lt;u&gt;&lt;b&gt;대량의 데이터를 실시간으로 검색하고 분석&lt;/b&gt;&lt;/u&gt;하는 데에 사용 -&amp;gt; log, metric, full text ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;검색 엔진&lt;/b&gt;: 단순한 텍스트 매칭 검색이 아닌 전문 검색이 가능, 다양한 종류의 검색 쿼리를 지원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분산 처리&lt;/b&gt;: 데이터를 여러 노드에 분산 저장하여 검색이나 집계 작업 등을 수행할 때도 분산 처리 지원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고가용성 제공&lt;/b&gt;: 클러스터를 구성하고 있는 일부 노드에 장애가 발생해도, 복제본 데이터를 이용해 중단 없이 서비슬르 지속&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수평적 확장성&lt;/b&gt;: 더 많은 처리가 필요할 때, 새로운 노드에 elasticsearch를 설치하려 클러스터에 참여시키는 것만으로도 확장 가능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JSON 기반의 REST API 제공&lt;/b&gt;: JSON 형태의 문서를 저장, 색인, 검색하며, 작업 요청을 보낼 때도 JSON 기반의 REST API를 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 안정성&lt;/b&gt;: 데이터 색인 요청 후 200 OK를 받았다면 데이터는 확실히 Disk에 기록&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다양한 플러그인을 통한 기능 확장 지원&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;준실시간 검색:&amp;nbsp;&lt;/b&gt;최대 1초 정도의 시간이 걸림&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;트랜잭션 지원 X&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조인 연산 지원&lt;/b&gt; &lt;b&gt;X&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Apache&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Lucene?&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;Java로 작성된 무료 오픈 소스&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;&lt;b&gt;검색 엔진 라이브러리&lt;br /&gt;&lt;/b&gt;&lt;/u&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;-&amp;gt; 검색 기능을 가지고 있는 application을 개발할 때 사용 가능한 라이브러리 (자체 수집 기능 제공 X)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- 동작 방식&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 검색 대상 분석&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검색 대상 텍스트 확보&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- 내부적으로 수집 기능 제공 X&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- 외부에서 대상을 수집해서 전달해줌으로써 검색 대상 텍스트 확보&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;루씬 문서 생성&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- document: 루씬에서 사용하는 개별 단위&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- lucene document는 여러 개의 field로 구성됨&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;document 텍스트 분석&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- 텍스트 분석기를 사용하여 텍스트를&amp;nbsp;&lt;/span&gt;&lt;b&gt;token&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;이라 불리는 단위로 분리&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;index에 document 추가&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- indexing 과정이 끝난 해당 document를 index에 추가&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 검색 과정&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검색 화면 인터페이스를 통해 검색어 전달 받음&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;검색 질의 생성&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- 전달받은 검색어를 검색 엔진에서 인식하는 query 객체로 변&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;query를 통해 검색&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- query 객체에 해당하는 결과를 받아옴&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;순수 불리언 모델&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;: 지정된 질의에 문서가 해당하는지 여부 확인, 점수 계산 X&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;벡터 공간 모델&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;: 질의와 문서 모두 고차원 공간의 벡터로 표현, 거리를 계산하여 문서와 질의 사시의 연관도나 유사도 확인&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;- 두 모델을 필요에 따라 선택&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br3reC/btsNjkRfEnq/YGiKc9UsaoiSk6XWfOXKr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br3reC/btsNjkRfEnq/YGiKc9UsaoiSk6XWfOXKr0/img.png&quot; data-alt=&quot;apache lucene 검색 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br3reC/btsNjkRfEnq/YGiKc9UsaoiSk6XWfOXKr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr3reC%2FbtsNjkRfEnq%2FYGiKc9UsaoiSk6XWfOXKr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;694&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;apache lucene 검색 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ELK Stack&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/niD0U/btsNgfclqZn/ABHRiK9DULEazBTiQNx1SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/niD0U/btsNgfclqZn/ABHRiK9DULEazBTiQNx1SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/niD0U/btsNgfclqZn/ABHRiK9DULEazBTiQNx1SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FniD0U%2FbtsNgfclqZn%2FABHRiK9DULEazBTiQNx1SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;894&quot; height=&quot;617&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엘라스틱 서치는 단독으로 검색을 위해 사용하거나, ELK stack을 기반으로 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ELK stack&lt;/b&gt;: Elasticsearch + Logstash + Kibana + Beat
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Filebeat:&lt;/b&gt; 서버에서 생성하는 &lt;u&gt;log를 수집&lt;/u&gt;하여 logstash 서버로 log를 전송&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Logstash:&amp;nbsp;&lt;/b&gt;로그 및 트랜잭션 데이터를 수집하여 &lt;u&gt;집계 및 파싱(정제 및 전처리)&lt;/u&gt;을 하고 ES로 전달&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Elasticsearch:&amp;nbsp;&lt;/b&gt;logstash로부터 전달받은 &lt;u&gt;데이터를 저장&lt;/u&gt;하고, &lt;u&gt;검색 및 집계&lt;/u&gt; 등의 기능 제공&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kibana:&amp;nbsp;&lt;/b&gt;저장된 로그를 Elasticsearch의 빠른 검색을 통해 가져와 &lt;u&gt;시각화 및 모니터링&lt;/u&gt; 기능 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Elasticsearch 기본 구조&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vb6PN/btsNjyV3Kzb/n0LxDWz97D7WnRdtnCTtFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vb6PN/btsNjyV3Kzb/n0LxDWz97D7WnRdtnCTtFK/img.png&quot; data-alt=&quot;https://www.youtube.com/watch?v=B1Aq2GQ4E78&amp;amp;amp;ab_channel=MinsukHeo%ED%97%88%EB%AF%BC%EC%84%9D&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vb6PN/btsNjyV3Kzb/n0LxDWz97D7WnRdtnCTtFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVb6PN%2FbtsNjyV3Kzb%2Fn0LxDWz97D7WnRdtnCTtFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;508&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://www.youtube.com/watch?v=B1Aq2GQ4E78&amp;amp;ab_channel=MinsukHeo%ED%97%88%EB%AF%BC%EC%84%9D&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 각 document들을 미리 indexing하여 key, value 형태로 mapping&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 따라서 기존 rdbms보다 빠를 수 밖에 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;일반적으로 사용하는 아키텍처&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJBJbG/btsNjDwiK1w/c35recoVA9PuyrkQPcZsk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJBJbG/btsNjDwiK1w/c35recoVA9PuyrkQPcZsk0/img.png&quot; data-alt=&quot;https://sudarlife.tistory.com/entry/Elasticsearch-%EA%B0%84%EB%8B%A8-%EA%B0%9C%EB%85%90-%EC%9E%A5%EB%8B%A8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJBJbG/btsNjDwiK1w/c35recoVA9PuyrkQPcZsk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJBJbG%2FbtsNjDwiK1w%2Fc35recoVA9PuyrkQPcZsk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;863&quot; height=&quot;597&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;597&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://sudarlife.tistory.com/entry/Elasticsearch-%EA%B0%84%EB%8B%A8-%EA%B0%9C%EB%85%90-%EC%9E%A5%EB%8B%A8&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 서버에서 생성되는 데이터(일반적으로 log)를 RDBMS or Non-RDBMS에 저장하고, 검색 혹은 분석이 필요한 부분만을 데이터 추출하여 ES에 자동 저장&lt;/li&gt;
&lt;li&gt;이때 &lt;u&gt;DB에서 필요한 데이터를 추출하여 자동적으로 ES에 데이터를 전송&lt;/u&gt;하는 부분을 담당하는 것이 &lt;b&gt;Logstash&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;MongoDB에 ES를 연결하는 task에 특화된 &lt;b&gt;Monstache&lt;/b&gt;도 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://sudarlife.tistory.com/entry/MongoDB-ElasticSearch-Monstache-%EB%8F%84%EC%BB%A4-%EA%B8%B0%EB%B3%B8-%EC%85%8B%ED%8C%85%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sudarlife.tistory.com/entry/MongoDB-ElasticSearch-Monstache-%EB%8F%84%EC%BB%A4-%EA%B8%B0%EB%B3%B8-%EC%85%8B%ED%8C%85%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744462110427&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[ MongoDB + ElasticSearch + Monstache ] 도커 기본 셋팅을 해보자&quot; data-og-description=&quot;회사 내부에서 검색엔진을 적용하게 되면서 구글링을 해보니 생각보다 많은 정보가 없었다. 내가 추구하는 개발 환경은 Docker로 구축하는 것이었다. 국내 자료가 많이 없고 , 외국 자료 역시 그&quot; data-og-host=&quot;sudarlife.tistory.com&quot; data-og-source-url=&quot;https://sudarlife.tistory.com/entry/MongoDB-ElasticSearch-Monstache-%EB%8F%84%EC%BB%A4-%EA%B8%B0%EB%B3%B8-%EC%85%8B%ED%8C%85%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90&quot; data-og-url=&quot;https://sudarlife.tistory.com/entry/MongoDB-ElasticSearch-Monstache-%EB%8F%84%EC%BB%A4-%EA%B8%B0%EB%B3%B8-%EC%85%8B%ED%8C%85%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bA4AGt/hyYFCrAMwr/omtPpvSe12z3dEHqa5AyIk/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/G3yuA/hyYCmYa9yO/HVIxqNdeeA1C6kYBFgADU0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/fAG1j/hyYEIsD4lf/3k5z9gcNezvKu6LhKU1mB1/img.png?width=1052&amp;amp;height=861&amp;amp;face=0_0_1052_861&quot;&gt;&lt;a href=&quot;https://sudarlife.tistory.com/entry/MongoDB-ElasticSearch-Monstache-%EB%8F%84%EC%BB%A4-%EA%B8%B0%EB%B3%B8-%EC%85%8B%ED%8C%85%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sudarlife.tistory.com/entry/MongoDB-ElasticSearch-Monstache-%EB%8F%84%EC%BB%A4-%EA%B8%B0%EB%B3%B8-%EC%85%8B%ED%8C%85%EC%9D%84-%ED%95%B4%EB%B3%B4%EC%9E%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bA4AGt/hyYFCrAMwr/omtPpvSe12z3dEHqa5AyIk/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/G3yuA/hyYCmYa9yO/HVIxqNdeeA1C6kYBFgADU0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/fAG1j/hyYEIsD4lf/3k5z9gcNezvKu6LhKU1mB1/img.png?width=1052&amp;amp;height=861&amp;amp;face=0_0_1052_861');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[ MongoDB + ElasticSearch + Monstache ] 도커 기본 셋팅을 해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;회사 내부에서 검색엔진을 적용하게 되면서 구글링을 해보니 생각보다 많은 정보가 없었다. 내가 추구하는 개발 환경은 Docker로 구축하는 것이었다. 국내 자료가 많이 없고 , 외국 자료 역시 그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sudarlife.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MongoDB와 ES를 동기화하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@emily2307/MongoDB-Elasticsearch-%EB%8F%99%EA%B8%B0%ED%99%94-using-Monstache&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@emily2307/MongoDB-Elasticsearch-%EB%8F%99%EA%B8%B0%ED%99%94-using-Monstache&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744466565917&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MongoDB - Elasticsearch 동기화 (using Monstache)&quot; data-og-description=&quot;.&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@emily2307/MongoDB-Elasticsearch-%EB%8F%99%EA%B8%B0%ED%99%94-using-Monstache&quot; data-og-url=&quot;https://velog.io/@emily2307/MongoDB-Elasticsearch-동기화-using-Monstache&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YI89b/hyYFBsG5NB/qgS7kZxPMzXVMKao4glKW1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500&quot;&gt;&lt;a href=&quot;https://velog.io/@emily2307/MongoDB-Elasticsearch-%EB%8F%99%EA%B8%B0%ED%99%94-using-Monstache&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@emily2307/MongoDB-Elasticsearch-%EB%8F%99%EA%B8%B0%ED%99%94-using-Monstache&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YI89b/hyYFBsG5NB/qgS7kZxPMzXVMKao4glKW1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MongoDB - Elasticsearch 동기화 (using Monstache)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ES는&amp;nbsp;&lt;b&gt;transaction&lt;/b&gt;,&amp;nbsp;&lt;b&gt;ACID&lt;/b&gt; &lt;b&gt;속성&lt;/b&gt;&amp;nbsp;&lt;b&gt;보장 X&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;ES의 강점은 실시간에 가까운 검색이 가능하다는 것 -&amp;gt; 인덱싱 비용이 높기 때문에 데이터 입력이 많으면, 빠른 검색 기능 제대로 활용 불가능&lt;/li&gt;
&lt;li&gt;따라서, 메인 저장소로 MongoDB를 따로 두고, 검색과 분석에 필요한 필드만 커스텀 매핑으로 ES에 동기화&lt;/li&gt;
&lt;li&gt;대부분의 기업은 ES를 Main DB 보조하는 search engine으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Lucene in Action: Covers Apache Lucene V.3.0, Michael McCandless / Erik Hatcher / Otis Gospodnetic&amp;nbsp;&lt;span style=&quot;color: #666666;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;a style=&quot;color: #333333;&quot;&gt;Manning Publications&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2010년 07월 28일&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ibm.com/kr-ko/topics/elasticsearch&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.ibm.com/kr-ko/topics/elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1744451915467&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Elasticsearch란 무엇인가요? | IBM&quot; data-og-description=&quot;Elasticsearch는 애플리케이션을 강화하고 개발 및 관리 작업을 간소화하는 등 다양한 작업을 수행할 수 있는 오픈 소스 검색 및 분석 엔진입니다.&quot; data-og-host=&quot;www.ibm.com&quot; data-og-source-url=&quot;https://www.ibm.com/kr-ko/topics/elasticsearch&quot; data-og-url=&quot;https://www.ibm.com/kr-ko/topics/elasticsearch&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cmd8B4/hyYFFhwXs0/vtu6DtWsoAWMbKYyMlAV81/img.png?width=1280&amp;amp;height=259&amp;amp;face=0_0_1280_259,https://scrap.kakaocdn.net/dn/f4NPC/hyYEH01ArI/kmGmNkvRk94sHiKNySdNi1/img.png?width=1584&amp;amp;height=633&amp;amp;face=0_0_1584_633&quot;&gt;&lt;a href=&quot;https://www.ibm.com/kr-ko/topics/elasticsearch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.ibm.com/kr-ko/topics/elasticsearch&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cmd8B4/hyYFFhwXs0/vtu6DtWsoAWMbKYyMlAV81/img.png?width=1280&amp;amp;height=259&amp;amp;face=0_0_1280_259,https://scrap.kakaocdn.net/dn/f4NPC/hyYEH01ArI/kmGmNkvRk94sHiKNySdNi1/img.png?width=1584&amp;amp;height=633&amp;amp;face=0_0_1584_633');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Elasticsearch란 무엇인가요? | IBM&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Elasticsearch는 애플리케이션을 강화하고 개발 및 관리 작업을 간소화하는 등 다양한 작업을 수행할 수 있는 오픈 소스 검색 및 분석 엔진입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.ibm.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://steady-record.tistory.com/entry/Elasticsearch-%EA%B2%80%EC%83%89-%EC%97%94%EC%A7%84-ElasticsearchELK&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://steady-record.tistory.com/entry/Elasticsearch-%EA%B2%80%EC%83%89-%EC%97%94%EC%A7%84-ElasticsearchELK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1744452233779&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Elasticsearch] 검색 엔진 : Elasticsearch 설치하기(+ELK)&quot; data-og-description=&quot;Elasticsearch  자바로 만들어진 루씬 기반의 오픈 소스 검색 엔진이다. 다량의 데이터를 저장한다는 측면에서는 DB와 비슷해보이지만, 전혀 다르다. 주로 대량의 데이터를 실시간으로 검색하고 &quot; data-og-host=&quot;steady-record.tistory.com&quot; data-og-source-url=&quot;https://steady-record.tistory.com/entry/Elasticsearch-%EA%B2%80%EC%83%89-%EC%97%94%EC%A7%84-ElasticsearchELK&quot; data-og-url=&quot;https://steady-record.tistory.com/entry/Elasticsearch-%EA%B2%80%EC%83%89-%EC%97%94%EC%A7%84-ElasticsearchELK&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dVuiY9/hyYCihcdQ1/KiXs0lWqwyAvZtuXBJk6M1/img.png?width=800&amp;amp;height=495&amp;amp;face=0_0_800_495,https://scrap.kakaocdn.net/dn/PoxeR/hyYCc2laKd/S2fUd9YYBBMfYXSV68Wih0/img.png?width=800&amp;amp;height=495&amp;amp;face=0_0_800_495,https://scrap.kakaocdn.net/dn/x0eqx/hyYEIe1iGV/A9QKNItFQmMy4Ooi4Zm15K/img.png?width=1335&amp;amp;height=780&amp;amp;face=0_0_1335_780&quot;&gt;&lt;a href=&quot;https://steady-record.tistory.com/entry/Elasticsearch-%EA%B2%80%EC%83%89-%EC%97%94%EC%A7%84-ElasticsearchELK&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://steady-record.tistory.com/entry/Elasticsearch-%EA%B2%80%EC%83%89-%EC%97%94%EC%A7%84-ElasticsearchELK&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dVuiY9/hyYCihcdQ1/KiXs0lWqwyAvZtuXBJk6M1/img.png?width=800&amp;amp;height=495&amp;amp;face=0_0_800_495,https://scrap.kakaocdn.net/dn/PoxeR/hyYCc2laKd/S2fUd9YYBBMfYXSV68Wih0/img.png?width=800&amp;amp;height=495&amp;amp;face=0_0_800_495,https://scrap.kakaocdn.net/dn/x0eqx/hyYEIe1iGV/A9QKNItFQmMy4Ooi4Zm15K/img.png?width=1335&amp;amp;height=780&amp;amp;face=0_0_1335_780');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Elasticsearch] 검색 엔진 : Elasticsearch 설치하기(+ELK)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Elasticsearch  자바로 만들어진 루씬 기반의 오픈 소스 검색 엔진이다. 다량의 데이터를 저장한다는 측면에서는 DB와 비슷해보이지만, 전혀 다르다. 주로 대량의 데이터를 실시간으로 검색하고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;steady-record.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://jackjeong.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jackjeong.tistory.com/78&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1744453331819&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[루씬 인 액션] 1. 루씬(Lucene)의 개념 및 구조&quot; data-og-description=&quot;루씬이란? &amp;rarr; 루씬은 자바로 만들어진 고성능 정보 검색(IR : information retrieval) 라이브러리입니다 (IR : 문서를 검색하거나, 문서의 내용을 검색하거나, 문서와 연관된 메타 정보를 검색하는 과정&quot; data-og-host=&quot;jackjeong.tistory.com&quot; data-og-source-url=&quot;https://jackjeong.tistory.com/78&quot; data-og-url=&quot;https://jackjeong.tistory.com/entry/Lucene-In-Action-1-%EB%A3%A8%EC%94%ACLucene%EC%9D%98-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B5%AC%EC%A1%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b6XqNX/hyYEFJnWij/DCq9J1GfKZpEBjCunriMNK/img.jpg?width=385&amp;amp;height=512&amp;amp;face=239_113_276_154,https://scrap.kakaocdn.net/dn/cQlEuz/hyYB7tdyDn/5kVAOY1SzTYlRtFbZP3Mx1/img.jpg?width=385&amp;amp;height=512&amp;amp;face=239_113_276_154,https://scrap.kakaocdn.net/dn/ngULd/hyYEH02kXT/ig2e2BKHztyu5ytDIfDlM0/img.jpg?width=514&amp;amp;height=396&amp;amp;face=0_0_514_396&quot;&gt;&lt;a href=&quot;https://jackjeong.tistory.com/78&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jackjeong.tistory.com/78&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b6XqNX/hyYEFJnWij/DCq9J1GfKZpEBjCunriMNK/img.jpg?width=385&amp;amp;height=512&amp;amp;face=239_113_276_154,https://scrap.kakaocdn.net/dn/cQlEuz/hyYB7tdyDn/5kVAOY1SzTYlRtFbZP3Mx1/img.jpg?width=385&amp;amp;height=512&amp;amp;face=239_113_276_154,https://scrap.kakaocdn.net/dn/ngULd/hyYEH02kXT/ig2e2BKHztyu5ytDIfDlM0/img.jpg?width=514&amp;amp;height=396&amp;amp;face=0_0_514_396');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[루씬 인 액션] 1. 루씬(Lucene)의 개념 및 구조&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;루씬이란? &amp;rarr; 루씬은 자바로 만들어진 고성능 정보 검색(IR : information retrieval) 라이브러리입니다 (IR : 문서를 검색하거나, 문서의 내용을 검색하거나, 문서와 연관된 메타 정보를 검색하는 과정&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jackjeong.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@soyeon207/%EC%9D%B4%EB%A1%A0-Elasticsearch-%EB%9E%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@soyeon207/%EC%9D%B4%EB%A1%A0-Elasticsearch-%EB%9E%80&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1744453499134&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[ES] 1. Elasticsearch 와 루씬&quot; data-og-description=&quot;루씬(Lucene) 기반의 Java 오픈소스 분산 검색 엔진&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@soyeon207/%EC%9D%B4%EB%A1%A0-Elasticsearch-%EB%9E%80&quot; data-og-url=&quot;https://velog.io/@soyeon207/이론-Elasticsearch-란&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b27GEA/hyYFEiDA2K/NxDYNnwruodVefFEm4vOp0/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bmlkeg/hyYFCd3bpZ/klAut95e9Wt6Lobf2lcfuK/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b19dFj/hyYFD45QVV/1ov87dQ3OlAoSbo29iU7uk/img.jpg?width=1080&amp;amp;height=1440&amp;amp;face=0_0_1080_1440&quot;&gt;&lt;a href=&quot;https://velog.io/@soyeon207/%EC%9D%B4%EB%A1%A0-Elasticsearch-%EB%9E%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@soyeon207/%EC%9D%B4%EB%A1%A0-Elasticsearch-%EB%9E%80&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b27GEA/hyYFEiDA2K/NxDYNnwruodVefFEm4vOp0/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bmlkeg/hyYFCd3bpZ/klAut95e9Wt6Lobf2lcfuK/img.png?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b19dFj/hyYFD45QVV/1ov87dQ3OlAoSbo29iU7uk/img.jpg?width=1080&amp;amp;height=1440&amp;amp;face=0_0_1080_1440');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[ES] 1. Elasticsearch 와 루씬&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;루씬(Lucene) 기반의 Java 오픈소스 분산 검색 엔진&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div style=&quot;background-color: #ffffff; color: #555555; text-align: left;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://backtony.tistory.com/79&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://backtony.tistory.com/79&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1744459514967&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Elasticsearch - 기본 콘셉트와 구조도&quot; data-og-description=&quot;ElasticSearch 기본 콘셉트 루씬은 데이터를 색인하고 검색하는 기능을 제공하는 검색 엔진의 코어 라이브러리입니다. 엘라스틱서치는 루씬을 코어로 이용하여 JSON 문서의 저장, 색인, 검색 등의 작&quot; data-og-host=&quot;backtony.tistory.com&quot; data-og-source-url=&quot;https://backtony.tistory.com/79&quot; data-og-url=&quot;https://backtony.tistory.com/79&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Lrljs/hyYEG9piSf/2DFK3wFkM6q9ZBmG3NVeK1/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552,https://scrap.kakaocdn.net/dn/4lZcF/hyYFzIoJri/ItB6Ukxi4jISHkD2KkcGU1/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552,https://scrap.kakaocdn.net/dn/8fyFr/hyYCboPDqh/tTXrmSwU9J4Ok3mzTg48V0/img.png?width=2418&amp;amp;height=1188&amp;amp;face=0_0_2418_1188&quot;&gt;&lt;a href=&quot;https://backtony.tistory.com/79&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://backtony.tistory.com/79&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Lrljs/hyYEG9piSf/2DFK3wFkM6q9ZBmG3NVeK1/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552,https://scrap.kakaocdn.net/dn/4lZcF/hyYFzIoJri/ItB6Ukxi4jISHkD2KkcGU1/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552,https://scrap.kakaocdn.net/dn/8fyFr/hyYCboPDqh/tTXrmSwU9J4Ok3mzTg48V0/img.png?width=2418&amp;amp;height=1188&amp;amp;face=0_0_2418_1188');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Elasticsearch - 기본 콘셉트와 구조도&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;ElasticSearch 기본 콘셉트 루씬은 데이터를 색인하고 검색하는 기능을 제공하는 검색 엔진의 코어 라이브러리입니다. 엘라스틱서치는 루씬을 코어로 이용하여 JSON 문서의 저장, 색인, 검색 등의 작&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;backtony.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@shinychan95/Elasticsearch-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@shinychan95/Elasticsearch-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1744461567913&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Elasticsearch 기본 개념 및 특징 정리&quot; data-og-description=&quot;What is Elasticsearch?&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@shinychan95/Elasticsearch-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AC&quot; data-og-url=&quot;https://velog.io/@shinychan95/Elasticsearch-기본-개념-및-특징-정리&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/D8mSY/hyYExYVS10/XTauYs1lMAAym7QT9SH4K1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/MO43j/hyYCjf6XWx/HSaAK0hDb1cE0jFmXOdTok/img.png?width=1576&amp;amp;height=590&amp;amp;face=0_0_1576_590,https://scrap.kakaocdn.net/dn/bmDx5e/hyYB86IqNU/2N1o03k8VNqJVnTo76VkKk/img.png?width=1568&amp;amp;height=448&amp;amp;face=0_0_1568_448&quot;&gt;&lt;a href=&quot;https://velog.io/@shinychan95/Elasticsearch-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@shinychan95/Elasticsearch-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/D8mSY/hyYExYVS10/XTauYs1lMAAym7QT9SH4K1/img.png?width=950&amp;amp;height=500&amp;amp;face=0_0_950_500,https://scrap.kakaocdn.net/dn/MO43j/hyYCjf6XWx/HSaAK0hDb1cE0jFmXOdTok/img.png?width=1576&amp;amp;height=590&amp;amp;face=0_0_1576_590,https://scrap.kakaocdn.net/dn/bmDx5e/hyYB86IqNU/2N1o03k8VNqJVnTo76VkKk/img.png?width=1568&amp;amp;height=448&amp;amp;face=0_0_1568_448');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Elasticsearch 기본 개념 및 특징 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;What is Elasticsearch?&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>GDGoC KHU 1th</category>
      <author>시데브</author>
      <guid isPermaLink="true">https://sypdevlog.tistory.com/369</guid>
      <comments>https://sypdevlog.tistory.com/369#entry369comment</comments>
      <pubDate>Sat, 12 Apr 2025 23:05:52 +0900</pubDate>
    </item>
    <item>
      <title>[컴파일러] Chapter 3. Syntax Analysis(Part 1)</title>
      <link>https://sypdevlog.tistory.com/368</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;경희대학교 허선영 교수님의 컴파일러 수업을 기반으로 정리한 글입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Front-end Compilation&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- Lexical Analysis&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문장을&amp;nbsp;&lt;b&gt;토큰&amp;nbsp;&lt;/b&gt;단위로 분류하는 과정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정규&lt;/b&gt;&amp;nbsp;&lt;b&gt;표현식&lt;/b&gt;을 사용하여 문장을 의미 단위로 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- Syntax Analysis&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Lexical Analysis 과정에서 생성된 토큰을 기반으로 parse tree를 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tWaVs/btsNbLIx7p2/3UKuQ8gdOzdGJCLDF1BmH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tWaVs/btsNbLIx7p2/3UKuQ8gdOzdGJCLDF1BmH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tWaVs/btsNbLIx7p2/3UKuQ8gdOzdGJCLDF1BmH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtWaVs%2FbtsNbLIx7p2%2F3UKuQ8gdOzdGJCLDF1BmH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;635&quot; height=&quot;414&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- Semantic Analysis&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램의 선언과 진술이&amp;nbsp;&lt;b&gt;의미론적으로 정확한지 확인&lt;/b&gt;하는 작업&lt;/li&gt;
&lt;li&gt;syntax analysis와 달리&amp;nbsp;&lt;b&gt;type checking&lt;/b&gt; 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Syntax Analysis&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Abstract Syntax Tree(AST)&lt;/b&gt;를 빌드 -&amp;gt;&amp;nbsp;&lt;u&gt;token stream이&amp;nbsp;&lt;b&gt;valid&lt;/b&gt;한지 체크&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;if the&amp;nbsp;&lt;u&gt;token stream is not valid&lt;/u&gt; -&amp;gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;b&gt;syntax error &amp;amp; recover&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;ex) c++에서는 if 다음에 () 괄호 구조가 등장하지 않으면 문법 오류 -&amp;gt; syntax error&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3999&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEj8Il/btsNcGfozpQ/NlqNUeKKRd9rpZOVzgtMZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEj8Il/btsNcGfozpQ/NlqNUeKKRd9rpZOVzgtMZk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEj8Il/btsNcGfozpQ/NlqNUeKKRd9rpZOVzgtMZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEj8Il%2FbtsNcGfozpQ%2FNlqNUeKKRd9rpZOVzgtMZk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3999&quot; height=&quot;760&quot; data-origin-width=&quot;3999&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;expression:&amp;nbsp;&lt;/b&gt;&lt;u&gt;value&lt;/u&gt;를 가지는 표현&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 + 2 -&amp;gt; 3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;statement:&amp;nbsp;&lt;/b&gt;명령, side-effect
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;c = 1 -&amp;gt; 명령 자체가 따로 값을 가지진 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ex) print(&quot;x&quot;)라는 명령어 자체는 expression X, but x라는 string은 expression&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3159&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dq6aWc/btsNcpEO6Jw/lQY8rBXMYLHF6OL5YvcAnK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dq6aWc/btsNcpEO6Jw/lQY8rBXMYLHF6OL5YvcAnK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dq6aWc/btsNcpEO6Jw/lQY8rBXMYLHF6OL5YvcAnK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdq6aWc%2FbtsNcpEO6Jw%2FlQY8rBXMYLHF6OL5YvcAnK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3159&quot; height=&quot;999&quot; data-origin-width=&quot;3159&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 토큰의 가장 말단에는 token이 위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; IF-THEN-ELSE도 어떤 값을 가지는 건 아니므로 statement&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Why do we need a parser in addiotion to a lexer? -&amp;gt; 왜 Lexer에서는 문법을 체킹하지 못하는가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;몇몇 프로그램은&amp;nbsp;&lt;b&gt;recursive structures&lt;/b&gt;를 가질 수 있음&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Finite automata는 recursive contructs를 잡아내지 못함&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;ex) digits = [0-9]+, expr = {digits} | &quot;(&quot; {expr} &quot;+&quot; {expr} &quot;)&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(((1+2)+3)+4)와 같은 구조는 괄호가 얼마나 깊게 중첩되었는지 기억해야 함 -&amp;gt; but N개의 상태를 가지는 Finite Automata는 N보다 더 깊게 괄호가 중첩되면 기억이 불가능함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Context-Free Grammar&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Regular Expressions:&lt;/b&gt; 토큰의 &lt;u&gt;lexical structure&lt;/u&gt; 결정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Context-Free Grammars(CFG): &lt;/b&gt;프로그램의&amp;nbsp;&lt;u&gt;syntactic structure&lt;/u&gt; 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3568D/btsNcTsG2Ck/UJn6SirEFhz2CsVbKeijLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3568D/btsNcTsG2Ck/UJn6SirEFhz2CsVbKeijLk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3568D/btsNcTsG2Ck/UJn6SirEFhz2CsVbKeijLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3568D%2FbtsNcTsG2Ck%2FUJn6SirEFhz2CsVbKeijLk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;754&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VcGJJ/btsNdWWd5dh/MnqPPzNE6dVi6pskK12XJK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VcGJJ/btsNdWWd5dh/MnqPPzNE6dVi6pskK12XJK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VcGJJ/btsNdWWd5dh/MnqPPzNE6dVi6pskK12XJK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVcGJJ%2FbtsNdWWd5dh%2FMnqPPzNE6dVi6pskK12XJK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;754&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Grammar:&amp;nbsp;&lt;/b&gt;set of &lt;u&gt;&lt;b&gt;productions&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;production&lt;/b&gt;: 하나의 symbol이 여러 개의 symbol로 확장되는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Symbol&lt;/b&gt;에는 2가지 종류가 존재
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Terminal:&amp;nbsp;&lt;/b&gt;lexical anlysis에서 정의한&amp;nbsp;&lt;u&gt;Token&lt;/u&gt; -&amp;gt; &lt;u&gt;확장이 불가능한&lt;/u&gt; symbol&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Nonterminal:&amp;nbsp;&lt;/b&gt;production의 left-side에 위치한 symbol -&amp;gt; &lt;u&gt;확장이 가능한&lt;/u&gt; symbol&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;One of the nonterminals가 grammar의 start symbol이 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- example: Syntax for Straight-line program&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;straight-line program: &lt;/b&gt;하나의&amp;nbsp;statement 당 세미콜론으로 한 줄씩 존재하는 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgcbCa/btsNb8Eaeh4/mPT1yFg9FgnXA49kkgajKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgcbCa/btsNb8Eaeh4/mPT1yFg9FgnXA49kkgajKk/img.jpg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1318&quot; data-is-animation=&quot;false&quot; style=&quot;width: 57.5611%; margin-right: 10px;&quot; data-widthpercent=&quot;58.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgcbCa/btsNb8Eaeh4/mPT1yFg9FgnXA49kkgajKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgcbCa%2FbtsNb8Eaeh4%2FmPT1yFg9FgnXA49kkgajKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;1318&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uVeLh/btsNdUj5b4v/tysSTgTSw7KO0RdK2IVCJ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uVeLh/btsNdUj5b4v/tysSTgTSw7KO0RdK2IVCJ0/img.jpg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1838&quot; data-is-animation=&quot;false&quot; style=&quot;width: 41.2761%;&quot; data-widthpercent=&quot;41.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uVeLh/btsNdUj5b4v/tysSTgTSw7KO0RdK2IVCJ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuVeLh%2FbtsNdUj5b4v%2FtysSTgTSw7KO0RdK2IVCJ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;1838&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. Derivation&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Derivation(Execution of Parsing)&lt;/b&gt;&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;start symbol&lt;/b&gt;에서 시작&lt;/li&gt;
&lt;li&gt;&lt;b&gt;nonterminal을&lt;/b&gt; &lt;u&gt;right-hand sides&lt;/u&gt;를 이용하여 &lt;b&gt;교체&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Derivation을 수행하는 2가지 방식&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Leftmost Derivation:&amp;nbsp;&lt;/b&gt;&lt;u&gt;leftmost nonterminal 교체&lt;/u&gt; in each step&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rightmost Derivation:&amp;nbsp;&lt;/b&gt;&lt;u&gt;rightmost nonterminal 교체&lt;/u&gt; in each step&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2631&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sH83s/btsNdjrnxnG/ggdQAlBFvgswXQRpDUtfNK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sH83s/btsNdjrnxnG/ggdQAlBFvgswXQRpDUtfNK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sH83s/btsNdjrnxnG/ggdQAlBFvgswXQRpDUtfNK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsH83s%2FbtsNdjrnxnG%2FggdQAlBFvgswXQRpDUtfNK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2631&quot; height=&quot;1000&quot; data-origin-width=&quot;2631&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; leftmost or rightmost derivation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; Start Symbol에서 시작해서 주어진 program과 동일하게 derivation 성공 시에&amp;nbsp;&lt;b&gt;well-formed program&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mdeD6/btsNest64Y6/1WGcYD7GpeeGfIzKv5eON1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mdeD6/btsNest64Y6/1WGcYD7GpeeGfIzKv5eON1/img.jpg&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.6627%; margin-right: 10px;&quot; data-widthpercent=&quot;51.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mdeD6/btsNest64Y6/1WGcYD7GpeeGfIzKv5eON1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmdeD6%2FbtsNest64Y6%2F1WGcYD7GpeeGfIzKv5eON1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1690&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA4kHx/btsNdVcy7UK/5FfMAZGjn79lu0uv8yVkKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA4kHx/btsNdVcy7UK/5FfMAZGjn79lu0uv8yVkKK/img.jpg&quot; data-origin-width=&quot;1607&quot; data-origin-height=&quot;1000&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.1745%;&quot; data-widthpercent=&quot;48.74&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA4kHx/btsNdVcy7UK/5FfMAZGjn79lu0uv8yVkKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA4kHx%2FbtsNdVcy7UK%2F5FfMAZGjn79lu0uv8yVkKK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1607&quot; height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; leftmost derivation, rightmost derivation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. Parse Tree&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;derivation의 시각적 표현&lt;/li&gt;
&lt;li&gt;&lt;b&gt;internal node&lt;/b&gt;(leaf nodes를 제외한 nodes):&lt;b&gt;&amp;nbsp;nonterminal&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;leaf node:&lt;/b&gt;&amp;nbsp;&lt;b&gt;terminal&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1987&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBFa6/btsNcRIXfq2/HFapFsGwyrcdM6BEGQCIkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBFa6/btsNcRIXfq2/HFapFsGwyrcdM6BEGQCIkK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBFa6/btsNcRIXfq2/HFapFsGwyrcdM6BEGQCIkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBFa6%2FbtsNcRIXfq2%2FHFapFsGwyrcdM6BEGQCIkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1987&quot; height=&quot;1000&quot; data-origin-width=&quot;1987&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.3. Ambiguous Grammars&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;parse tree를 통해서 grammar가 ambiguous한지 판단&lt;/li&gt;
&lt;li&gt;&lt;u&gt;같은 프로그램을 2개 이상의 parsing trees로 유도&lt;/u&gt; 가능 -&amp;gt;&amp;nbsp;A grammar is&amp;nbsp;&lt;b&gt;ambiguous&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3411&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cILnf9/btsNdXg7Sjt/Bmk58LKNnu9LMjS4iXR4o1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cILnf9/btsNdXg7Sjt/Bmk58LKNnu9LMjS4iXR4o1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cILnf9/btsNdXg7Sjt/Bmk58LKNnu9LMjS4iXR4o1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcILnf9%2FbtsNdXg7Sjt%2FBmk58LKNnu9LMjS4iXR4o1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3411&quot; height=&quot;1000&quot; data-origin-width=&quot;3411&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; grammar 재작성 필요!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Problem&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Different parse trees&amp;nbsp;&lt;/b&gt;may have&amp;nbsp;&lt;b&gt;different meanings&amp;nbsp;&lt;/b&gt;-&amp;gt; resulting in different interpreted results&lt;/li&gt;
&lt;li&gt;example) 1 + 2 * 3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2139&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zLpPd/btsNcTGK67J/nAyFkNo7Cxkwu0BYlcLMk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zLpPd/btsNcTGK67J/nAyFkNo7Cxkwu0BYlcLMk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zLpPd/btsNcTGK67J/nAyFkNo7Cxkwu0BYlcLMk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzLpPd%2FbtsNcTGK67J%2FnAyFkNo7Cxkwu0BYlcLMk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2139&quot; height=&quot;1000&quot; data-origin-width=&quot;2139&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 둘의 결과가 다름!!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Solution: &lt;b&gt;문법의 재정의&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;operators에 &lt;b&gt;상대적 우선순위&lt;/b&gt; 부여
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;*는 +보다 높은 우선순위 가짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;같은 우선순위를 가지는 경우에는&amp;nbsp;&lt;b&gt;associativity&lt;/b&gt;로 묶기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 + 2 + 3 -&amp;gt; ( 1 + 2 ) + 3 or 1 + ( 2 + 3 )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.4. Inefficiency in Parse Tree&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Concrete parse tree&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;internal node - nonterminal&lt;/li&gt;
&lt;li&gt;leaf node - terminal&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Concrete parse tree는 사용 불편
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;불필요한 터미널이 많아짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Make parse trees&amp;nbsp;&lt;b&gt;simple&lt;/b&gt; -&amp;gt; &lt;b&gt;Abstract Syntax Tree(AST)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LUhmM/btsNcmJbFQ0/kxzDKNh6qtuJqkVc03ilm0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LUhmM/btsNcmJbFQ0/kxzDKNh6qtuJqkVc03ilm0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LUhmM/btsNcmJbFQ0/kxzDKNh6qtuJqkVc03ilm0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLUhmM%2FbtsNcmJbFQ0%2FkxzDKNh6qtuJqkVc03ilm0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2144&quot; height=&quot;1000&quot; data-origin-width=&quot;2144&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; tree 구조가 완성되고 나서는 (, ), ;, := 등의 symbol 정보는 필요없어짐&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Abstract Syntax Tree(Abstract Parse Tree):&amp;nbsp;&lt;/b&gt;concrete parse tree에서 불필요한 토큰 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2714&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sjy8P/btsNd9IoCir/XyIbuJ5zpJ3LKOzfc9lLM1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sjy8P/btsNd9IoCir/XyIbuJ5zpJ3LKOzfc9lLM1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sjy8P/btsNd9IoCir/XyIbuJ5zpJ3LKOzfc9lLM1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsjy8P%2FbtsNd9IoCir%2FXyIbuJ5zpJ3LKOzfc9lLM1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2714&quot; height=&quot;999&quot; data-origin-width=&quot;2714&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;example)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1395&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bntING/btsNdbtCWXA/jBXOkGPzW4A40HAA59UCRk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bntING/btsNdbtCWXA/jBXOkGPzW4A40HAA59UCRk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bntING/btsNdbtCWXA/jBXOkGPzW4A40HAA59UCRk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbntING%2FbtsNdbtCWXA%2FjBXOkGPzW4A40HAA59UCRk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1395&quot; height=&quot;1000&quot; data-origin-width=&quot;1395&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.5. End-of-File Marker&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;parsing의 종료를 위해서는 EOF 존재해야 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;program이 file 형태로 존재하기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;EOF marker:&amp;nbsp;&lt;b&gt;$&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;b&gt;S' -&amp;gt; S$&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Recursive Descent Parsing(Predictive Parsing)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;다음 입력 심볼&lt;/u&gt;만 보고, &lt;u&gt;어떤 production을 적용할지 결정&lt;/u&gt;하는 기법&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LL(k) parsing&amp;nbsp;&lt;/b&gt;-&amp;nbsp;&lt;u&gt;token을 보고 미리 예측&lt;/u&gt;, k는 token의 개수&lt;/li&gt;
&lt;li&gt;각 subexpression의 첫 번째 terminal symbol만 보고, 어떤 production을 사용해야 할지 결정할 수 있을 때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Example&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRvj1q/btsNdAt9538/qxYwe2y2TPlpbCXIuk2JP1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRvj1q/btsNdAt9538/qxYwe2y2TPlpbCXIuk2JP1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRvj1q/btsNdAt9538/qxYwe2y2TPlpbCXIuk2JP1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRvj1q%2FbtsNdAt9538%2FqxYwe2y2TPlpbCXIuk2JP1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;651&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;651&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2492&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wbxC9/btsNfPizTQn/1SFOLX23sankk9z4oUifw1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wbxC9/btsNfPizTQn/1SFOLX23sankk9z4oUifw1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wbxC9/btsNfPizTQn/1SFOLX23sankk9z4oUifw1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwbxC9%2FbtsNfPizTQn%2F1SFOLX23sankk9z4oUifw1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2492&quot; height=&quot;1000&quot; data-origin-width=&quot;2492&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; Lookahead symbol이 IF면 if E ...로, BEGIN이면 begin S L로 확장&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;eat()&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;: 현재 토큰이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;expected token과 일치&lt;/u&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하면, 그 토큰을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;소비(consume)&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;다음 토큰으로&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;넘어가는 함수&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;consume?&lt;/b&gt; ['number', '+', 'number'] 상태에서, 파서가 처음에는 tokens[0]를 pointer로 가리키고 있다가, consume 처리 시에 해당 토큰을 처리됐다고 보고 &lt;u&gt;포인터를 다음 토큰으로&lt;/u&gt; 이동 &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;4.1. Contructing a Parser&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- Basic Functions&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;nullable(X):&lt;/b&gt; X로부터&lt;u&gt; empty string(&lt;/u&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;&lt;u&gt;&amp;epsilon;) 유도가 가능&lt;/u&gt;하면, X는 nullable&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;production에 존재하는 모든 symbol이 nullable -&amp;gt; 해당 Symbol은 nullable&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7u37f/btsNeRhokfD/3NxlwRKK0RWFVzVChpTIG0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7u37f/btsNeRhokfD/3NxlwRKK0RWFVzVChpTIG0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7u37f/btsNeRhokfD/3NxlwRKK0RWFVzVChpTIG0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7u37f%2FbtsNeRhokfD%2F3NxlwRKK0RWFVzVChpTIG0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;840&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; Z가 terminal이 되려면 반드시 d로 확장해야 함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;FIRST( )&lt;/b&gt;:&amp;nbsp; 로부터 유도된 strings의 시작점에 위치할 수 있는 모든 terminals의 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2067&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzaMum/btsNetuh7cw/LpKH5t9hegw0JgwplUymWk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzaMum/btsNetuh7cw/LpKH5t9hegw0JgwplUymWk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzaMum/btsNetuh7cw/LpKH5t9hegw0JgwplUymWk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzaMum%2FbtsNetuh7cw%2FLpKH5t9hegw0JgwplUymWk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2067&quot; height=&quot;1000&quot; data-origin-width=&quot;2067&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A -&amp;gt; B C D일 때
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;B -&amp;gt; &amp;epsilon; | b&lt;/li&gt;
&lt;li&gt;C -&amp;gt; c&lt;/li&gt;
&lt;li&gt;D -&amp;gt; d&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;FIRST(B)는 FIRST(A)에 포함, 추가적으로 B가 nullable이므로 B 자리가 비고, 그 자리에 C가 들어갈 수도 있으므로 FIRST(C) 또한 FIRST(A)에 포함됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjBUyA/btsNdT1khO2/wG8J3SZCrvJgT7hb2dWVk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjBUyA/btsNdT1khO2/wG8J3SZCrvJgT7hb2dWVk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjBUyA/btsNdT1khO2/wG8J3SZCrvJgT7hb2dWVk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjBUyA%2FbtsNdT1khO2%2FwG8J3SZCrvJgT7hb2dWVk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2632&quot; height=&quot;1000&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;FOLLOW(X):&amp;nbsp;&lt;/b&gt;derivation 후에 X 뒤에 위치할 수 있는 모든 terminal symobols의 집합
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Z -&amp;gt; XYZ(Z가 start symbol)&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;X -&amp;gt; Y: FIRST(Y)는 FOLLOW(X)에 포함&lt;/li&gt;
&lt;li&gt;Y가 nullable이므로, FIRST(Z)는 FOLLOW(Z)에 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;X -&amp;gt;  Y&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;FOLLOW(X)는 FOLLOW(Y)에 포함&lt;/b&gt;, Y의 마지막과 X의 마지막이 동일하기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;  &amp;rarr;  &lt;span&gt;1&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span&gt;FIRST( 2)는 FOLLOW(Y)에 포함&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;u&gt; 2가 nullable&lt;/u&gt;일 때, &lt;b&gt;FOLLOW(X)는 FOLLOW(Y)에 포함&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2727&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DNikW/btsNea2ZE1E/fx7LeOloLsEZTwgBxmnsmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DNikW/btsNea2ZE1E/fx7LeOloLsEZTwgBxmnsmk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DNikW/btsNea2ZE1E/fx7LeOloLsEZTwgBxmnsmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDNikW%2FbtsNea2ZE1E%2Ffx7LeOloLsEZTwgBxmnsmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2727&quot; height=&quot;1000&quot; data-origin-width=&quot;2727&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2446&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/su4JZ/btsNja85vc9/Vqq1itl00qPY0k4dvK7ckk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/su4JZ/btsNja85vc9/Vqq1itl00qPY0k4dvK7ckk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/su4JZ/btsNja85vc9/Vqq1itl00qPY0k4dvK7ckk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsu4JZ%2FbtsNja85vc9%2FVqq1itl00qPY0k4dvK7ckk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2446&quot; height=&quot;1000&quot; data-origin-width=&quot;2446&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Example&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) Initial&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3371&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lEhip/btsNjEohNw4/CZqDO3JvqbpnwfxXnB5WUk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lEhip/btsNjEohNw4/CZqDO3JvqbpnwfxXnB5WUk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lEhip/btsNjEohNw4/CZqDO3JvqbpnwfxXnB5WUk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlEhip%2FbtsNjEohNw4%2FCZqDO3JvqbpnwfxXnB5WUk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3371&quot; height=&quot;1000&quot; data-origin-width=&quot;3371&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) Interation 1&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3282&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJpQgF/btsNjG7t7nh/6HnxxLj1mPopocgOTubtsK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJpQgF/btsNjG7t7nh/6HnxxLj1mPopocgOTubtsK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJpQgF/btsNjG7t7nh/6HnxxLj1mPopocgOTubtsK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJpQgF%2FbtsNjG7t7nh%2F6HnxxLj1mPopocgOTubtsK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3282&quot; height=&quot;1000&quot; data-origin-width=&quot;3282&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) Iteration 2&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2240&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eqvJ7z/btsNjNyw1mD/BZKqkqt2oRpFA0rDDbDY3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eqvJ7z/btsNjNyw1mD/BZKqkqt2oRpFA0rDDbDY3K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eqvJ7z/btsNjNyw1mD/BZKqkqt2oRpFA0rDDbDY3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeqvJ7z%2FbtsNjNyw1mD%2FBZKqkqt2oRpFA0rDDbDY3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2240&quot; height=&quot;1000&quot; data-origin-width=&quot;2240&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) constructing a parser&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;nullable, first, follow 계산 이후&lt;/u&gt; contructing a parser&lt;/li&gt;
&lt;li&gt;nullable, first, follow -&amp;gt;&lt;b&gt;&amp;nbsp;predictive parsing table&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;S -&amp;gt;  
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;if   is nullable -&amp;gt; row: S, &lt;b&gt;col: FOLLOW( )에 포함되는 모든 요소&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;if   is not nullable -&amp;gt; row: S, &lt;b&gt;col: FIRST( )에 포함되는 모든 요소&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2491&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y8eZD/btsNiLa3AGD/TW8ypS0NH3VU4ZxnsL8YW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y8eZD/btsNiLa3AGD/TW8ypS0NH3VU4ZxnsL8YW0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y8eZD/btsNiLa3AGD/TW8ypS0NH3VU4ZxnsL8YW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY8eZD%2FbtsNiLa3AGD%2FTW8ypS0NH3VU4ZxnsL8YW0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2491&quot; height=&quot;1000&quot; data-origin-width=&quot;2491&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;837&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UJqJx/btsNi0yEWTh/kHtimT4LNzSL1mKePLWeqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UJqJx/btsNi0yEWTh/kHtimT4LNzSL1mKePLWeqk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UJqJx/btsNi0yEWTh/kHtimT4LNzSL1mKePLWeqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUJqJx%2FbtsNi0yEWTh%2FkHtimT4LNzSL1mKePLWeqk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;837&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;837&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tMQlt/btsNkvqD75l/ZPbJ0EKt6XFpXiPIONsIgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tMQlt/btsNkvqD75l/ZPbJ0EKt6XFpXiPIONsIgK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tMQlt/btsNkvqD75l/ZPbJ0EKt6XFpXiPIONsIgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtMQlt%2FbtsNkvqD75l%2FZPbJ0EKt6XFpXiPIONsIgK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4000&quot; height=&quot;831&quot; data-origin-width=&quot;4000&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Another Example&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBxn3M/btsNjA0yqNp/iDXjygOKfRsTcmr9VsIqm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBxn3M/btsNjA0yqNp/iDXjygOKfRsTcmr9VsIqm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBxn3M/btsNjA0yqNp/iDXjygOKfRsTcmr9VsIqm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBxn3M%2FbtsNjA0yqNp%2FiDXjygOKfRsTcmr9VsIqm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1130&quot; height=&quot;146&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;nullable, first, follow table
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;간단한 것들(소문자 symbols) 위주로 테이블에 삽입&lt;/li&gt;
&lt;li&gt;이후 대문자 symbols 사이의 관계 rules 정립 -&amp;gt; 테이블 반영&lt;/li&gt;
&lt;li&gt;정립한 rules가 table 내에서 모두 성립하는지 점검&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;each production에 대해서 predictive parsing table 빌드&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1724&quot; data-origin-height=&quot;999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bncB1h/btsNi6r83ua/Rbk1RNU7WgJCnbyYcrVBgk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bncB1h/btsNi6r83ua/Rbk1RNU7WgJCnbyYcrVBgk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bncB1h/btsNi6r83ua/Rbk1RNU7WgJCnbyYcrVBgk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbncB1h%2FbtsNi6r83ua%2FRbk1RNU7WgJCnbyYcrVBgk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1724&quot; height=&quot;999&quot; data-origin-width=&quot;1724&quot; data-origin-height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 고유한 row, col에 대해서 중복되는 production 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;b&gt;LL(1)으로 parsing 불가능한 Grammar&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2. Left-Recursion Problem&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- problem&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2813&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfEbh9/btsNi1Lba78/XfMiEUvuuM8K66xSchzR61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfEbh9/btsNi1Lba78/XfMiEUvuuM8K66xSchzR61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfEbh9/btsNi1Lba78/XfMiEUvuuM8K66xSchzR61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfEbh9%2FbtsNi1Lba78%2FXfMiEUvuuM8K66xSchzR61%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2813&quot; height=&quot;1000&quot; data-origin-width=&quot;2813&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- solution: X를  X'으로 변환&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN4e7f/btsNiuAC5db/zkncCIk5qanv705T6IwTj0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN4e7f/btsNiuAC5db/zkncCIk5qanv705T6IwTj0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN4e7f/btsNiuAC5db/zkncCIk5qanv705T6IwTj0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN4e7f%2FbtsNiuAC5db%2FzkncCIk5qanv705T6IwTj0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1909&quot; height=&quot;1000&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3. Left Factoring&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- problem: 2개의 productions가 같은 symbol로 시작&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S -&amp;gt; &lt;b&gt;if E then A&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;S -&amp;gt; &lt;b&gt;if E then A&lt;/b&gt; else A&lt;/li&gt;
&lt;li&gt;FIRST(if E then A) = FIRST(if E then A else A)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- solution:&amp;nbsp;&lt;b&gt;Left Factoring&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;S -&amp;gt; &lt;b&gt;if E then A&lt;/b&gt; V
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;V -&amp;gt; &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;epsilon;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;V -&amp;gt; else A&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-1.Lexical-Analysis&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-1.Lexical-Analysis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1744047060719&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;컴파일러 (1.Lexical Analysis)&quot; data-og-description=&quot;주어진&amp;nbsp;언어로 작성된 컴퓨터 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 프로세스이다.보통 high-level 프로그래밍 언어를 실행 프로그램으로 만들기 위한 lower level언어(어셈블리어,&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-1.Lexical-Analysis&quot; data-og-url=&quot;https://velog.io/@dbstjd0924/컴파일러-1.Lexical-Analysis&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ipor7/hyYA7Ng0bT/YZDBMKHdAukpmHvKQUqUi0/img.png?width=910&amp;amp;height=453&amp;amp;face=0_0_910_453,https://scrap.kakaocdn.net/dn/fsOqh/hyYCfDFh6j/9Uc4zYuRlnGdjB0iHdFkB1/img.png?width=910&amp;amp;height=453&amp;amp;face=0_0_910_453,https://scrap.kakaocdn.net/dn/cy0IjP/hyYClcN7h0/w2JhNeXHfImgVrCPzxG961/img.png?width=910&amp;amp;height=453&amp;amp;face=0_0_910_453&quot;&gt;&lt;a href=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-1.Lexical-Analysis&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-1.Lexical-Analysis&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ipor7/hyYA7Ng0bT/YZDBMKHdAukpmHvKQUqUi0/img.png?width=910&amp;amp;height=453&amp;amp;face=0_0_910_453,https://scrap.kakaocdn.net/dn/fsOqh/hyYCfDFh6j/9Uc4zYuRlnGdjB0iHdFkB1/img.png?width=910&amp;amp;height=453&amp;amp;face=0_0_910_453,https://scrap.kakaocdn.net/dn/cy0IjP/hyYClcN7h0/w2JhNeXHfImgVrCPzxG961/img.png?width=910&amp;amp;height=453&amp;amp;face=0_0_910_453');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;컴파일러 (1.Lexical Analysis)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주어진&amp;nbsp;언어로 작성된 컴퓨터 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 프로세스이다.보통 high-level 프로그래밍 언어를 실행 프로그램으로 만들기 위한 lower level언어(어셈블리어,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-2.Syntax-Analysis&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-2.Syntax-Analysis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1744047170010&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;컴파일러 (2.Syntax Analysis)&quot; data-og-description=&quot;쉽게 말하면 lexical analysis의 결과로 만들어진 token들을 문법에 따라 분석하는 parsing 작업을 수행해서 parse tree를 구성하는 작업이다.parse tree를 만들기 위해서 사용하는 문법이다.여기서 문법을 쉽&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-2.Syntax-Analysis&quot; data-og-url=&quot;https://velog.io/@dbstjd0924/컴파일러-2.Syntax-Analysis&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZzoAk/hyYBg33BcZ/WDMKAtVwBRLY6jkeZfRqsK/img.png?width=676&amp;amp;height=178&amp;amp;face=0_0_676_178,https://scrap.kakaocdn.net/dn/QmYx2/hyYCfXXzAY/bQnfPNEgyA2303BQJbXkzk/img.png?width=676&amp;amp;height=178&amp;amp;face=0_0_676_178,https://scrap.kakaocdn.net/dn/bxXL1r/hyYB9Kddvf/634kU35rwTSsZ9mkl5G4JK/img.png?width=711&amp;amp;height=312&amp;amp;face=0_0_711_312&quot;&gt;&lt;a href=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-2.Syntax-Analysis&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-2.Syntax-Analysis&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZzoAk/hyYBg33BcZ/WDMKAtVwBRLY6jkeZfRqsK/img.png?width=676&amp;amp;height=178&amp;amp;face=0_0_676_178,https://scrap.kakaocdn.net/dn/QmYx2/hyYCfXXzAY/bQnfPNEgyA2303BQJbXkzk/img.png?width=676&amp;amp;height=178&amp;amp;face=0_0_676_178,https://scrap.kakaocdn.net/dn/bxXL1r/hyYB9Kddvf/634kU35rwTSsZ9mkl5G4JK/img.png?width=711&amp;amp;height=312&amp;amp;face=0_0_711_312');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;컴파일러 (2.Syntax Analysis)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말하면 lexical analysis의 결과로 만들어진 token들을 문법에 따라 분석하는 parsing 작업을 수행해서 parse tree를 구성하는 작업이다.parse tree를 만들기 위해서 사용하는 문법이다.여기서 문법을 쉽&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-3.Sematic-Analysis&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-3.Sematic-Analysis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1744047274052&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;컴파일러 (3.Sematic Analysis)&quot; data-og-description=&quot;의미 분석이란, 프로그램의 선언과 진술이 의미론적으로 정확한지 확인하는 작업이다.즉, 프로그램의 의미가 명확하고 제어 구조와 데이터 형식을 사용해야 하는 방식과 일치하는지 확인하는 &quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-3.Sematic-Analysis&quot; data-og-url=&quot;https://velog.io/@dbstjd0924/컴파일러-3.Sematic-Analysis&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Q1ze7/hyYCmW4IVV/nASab9vHYvip4tt0dpItNK/img.png?width=767&amp;amp;height=480&amp;amp;face=0_0_767_480,https://scrap.kakaocdn.net/dn/byvtc6/hyYCgvNlal/eNYdzokSxZc1lTIfdpc841/img.png?width=767&amp;amp;height=480&amp;amp;face=0_0_767_480,https://scrap.kakaocdn.net/dn/mcHd1/hyYCk52us7/AO32RuhDL7H5jXkCU8DqK1/img.png?width=2000&amp;amp;height=1424&amp;amp;face=0_0_2000_1424&quot;&gt;&lt;a href=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-3.Sematic-Analysis&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@dbstjd0924/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-3.Sematic-Analysis&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Q1ze7/hyYCmW4IVV/nASab9vHYvip4tt0dpItNK/img.png?width=767&amp;amp;height=480&amp;amp;face=0_0_767_480,https://scrap.kakaocdn.net/dn/byvtc6/hyYCgvNlal/eNYdzokSxZc1lTIfdpc841/img.png?width=767&amp;amp;height=480&amp;amp;face=0_0_767_480,https://scrap.kakaocdn.net/dn/mcHd1/hyYCk52us7/AO32RuhDL7H5jXkCU8DqK1/img.png?width=2000&amp;amp;height=1424&amp;amp;face=0_0_2000_1424');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;컴파일러 (3.Sematic Analysis)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;의미 분석이란, 프로그램의 선언과 진술이 의미론적으로 정확한지 확인하는 작업이다.즉, 프로그램의 의미가 명확하고 제어 구조와 데이터 형식을 사용해야 하는 방식과 일치하는지 확인하는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>4학년 1학기 전공/컴파일러</category>
      <author>시데브</author>
      <guid isPermaLink="true">https://sypdevlog.tistory.com/368</guid>
      <comments>https://sypdevlog.tistory.com/368#entry368comment</comments>
      <pubDate>Sat, 12 Apr 2025 17:51:53 +0900</pubDate>
    </item>
    <item>
      <title>[컴파일러] Assignment 1. Lexical Analysis</title>
      <link>https://sypdevlog.tistory.com/367</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;경희대학교 허선영 교수님의 컴파일러 수업을 기반으로 정리한 글입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Goals of this Assignment&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Build a&amp;nbsp;&lt;b&gt;lexical analyzer for a new language&lt;/b&gt;, using a lexer generator for OCaml(ocamllex)&lt;/li&gt;
&lt;li&gt;know &lt;b&gt;how to write a regular expression&lt;/b&gt; &lt;u&gt;to represent a given set of strings&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;Understand &lt;b&gt;how to write and debug ocamllex&lt;/b&gt; specification&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxmq0c/btsNi3g1NYq/zwgRznHvKUSuVKfR7Zdzp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxmq0c/btsNi3g1NYq/zwgRznHvKUSuVKfR7Zdzp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxmq0c/btsNi3g1NYq/zwgRznHvKUSuVKfR7Zdzp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxmq0c%2FbtsNi3g1NYq%2FzwgRznHvKUSuVKfR7Zdzp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2072&quot; height=&quot;400&quot; data-origin-width=&quot;2072&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ocamllex&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ocamllex:&lt;/b&gt; lexer generator for OCaml&lt;/li&gt;
&lt;li&gt;ocamllex specification consists of three parts as shown in the example in Snippet 1.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;User Declarations:&amp;nbsp;&lt;/b&gt;auxiliary(보조자) values &amp;amp; types 작성&amp;nbsp;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Line 0 to 5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Lex Definitions:&amp;nbsp;&lt;/b&gt;regular expression 정의
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Line 7&lt;/li&gt;
&lt;li&gt;Format: let ident = regexp ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rules:&amp;nbsp;&lt;/b&gt;rules for lexical anlysis 포함&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Line 9 to 11&lt;/li&gt;
&lt;li&gt;Format: rule entrypoint [arg1 ... argn] = parse regexp { action } | ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUNjQF/btsNjz7CMGK/KOaDuEKMIBMDBzCRJeLIl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUNjQF/btsNjz7CMGK/KOaDuEKMIBMDBzCRJeLIl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUNjQF/btsNjz7CMGK/KOaDuEKMIBMDBzCRJeLIl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUNjQF%2FbtsNjz7CMGK%2FKOaDuEKMIBMDBzCRJeLIl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1670&quot; height=&quot;454&quot; data-origin-width=&quot;1670&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ocamllex provides&amp;nbsp;&lt;b&gt;predefined special operations&lt;/b&gt; for lexical analysis
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Lexing.lexeme lexbuf:&amp;nbsp;&lt;/b&gt;return the &lt;u&gt;matched string&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Lexing.lexeme_char lexbuf n:&amp;nbsp;&lt;/b&gt;return the&lt;u&gt; n-th character in the matched string&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Lexing.lexeme_start lexbuf:&amp;nbsp;&lt;/b&gt;return the &lt;u&gt;start position of the matched string&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Lexing.lexeme_end lexbuf:&amp;nbsp;&lt;/b&gt;return the&amp;nbsp;&lt;u&gt;end position of the matched string&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;in addition, ocammlex allowss to define&amp;nbsp;&lt;b&gt;multiple entry points&lt;/b&gt; for rules
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;can switch to another entry point by calling&amp;nbsp;&lt;b&gt;entrypoint&amp;nbsp;&lt;/b&gt;lexbuf.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEOKx0/btsNjzfxX1X/ylHudRVKf72Btzrm7S59vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEOKx0/btsNjzfxX1X/ylHudRVKf72Btzrm7S59vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEOKx0/btsNjzfxX1X/ylHudRVKf72Btzrm7S59vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEOKx0%2FbtsNjzfxX1X%2FylHudRVKf72Btzrm7S59vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1622&quot; height=&quot;278&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;The Fun Language&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Fun:&amp;nbsp;&lt;/b&gt;new programming language introducedd in this course&lt;/li&gt;
&lt;li&gt;&lt;b&gt;goal of the assignments:&lt;/b&gt; to build a compiler for the Fun language&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- Specification of the language&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Reserved words:&amp;nbsp;&lt;/b&gt;fun, in, let, while, do, if, then, else, ref, not&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Identifiers&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;An identifier is a&amp;nbsp;&lt;b&gt;sequence of letters, digits, and underscores, starting with a letter&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Upper-case letters are distinguished from lower-case letters&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Numbers&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Each number is a&lt;b&gt; sequence of digits&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;minus sign&lt;/b&gt; should be &lt;b&gt;lexed as a separate token&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Other Tokens&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAgnXk/btsNjhe9iu9/TfkQNPVgwG20DmmwIKyMe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAgnXk/btsNjhe9iu9/TfkQNPVgwG20DmmwIKyMe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAgnXk/btsNjhe9iu9/TfkQNPVgwG20DmmwIKyMe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAgnXk%2FbtsNjhe9iu9%2FTfkQNPVgwG20DmmwIKyMe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1502&quot; height=&quot;232&quot; data-origin-width=&quot;1502&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Comments&lt;/b&gt;: start with /* and end with */&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Whitespaces:&amp;nbsp;&lt;/b&gt;Newlines(\n), carriage-returns(\r), tabs(\t)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Lexical Analyzer for Fun&lt;/h2&gt;
&lt;pre id=&quot;code_1742555373075&quot; class=&quot;ocaml&quot; data-ke-language=&quot;highlight.js&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(* CSE322 Compiler Assignment 1 *)
{
exception Eof

(* create a tuple of the start and end positions *)
let make_pos buf = (Lexing.lexeme_start buf, Lexing.lexeme_end buf)
}

let alpha = ['A'-'Z''a'-'z']
let digit = ['0'-'9']
let projnum = '0' | ['1'-'9'] digit*
let ident = alpha ( alpha | digit | '_')*

rule initial = parse
  | &quot;fun&quot;  { Tokens.tok_fun(make_pos lexbuf) }
  | &quot;-&amp;gt;&quot;   { Tokens.tok_arrow(make_pos lexbuf) }
  | &quot;in&quot;   { Tokens.tok_in(make_pos lexbuf) }
  | &quot;let&quot;  { Tokens.tok_let(make_pos lexbuf) }
  | &quot;else&quot; { Tokens.tok_else(make_pos lexbuf) }
  | &quot;then&quot; { Tokens.tok_then(make_pos lexbuf) }
  | &quot;if&quot;   { Tokens.tok_if(make_pos lexbuf) }
  | &quot;assign&quot;   { Tokens.tok_assign(make_pos lexbuf) }
  | &quot;!&quot;    { Tokens.tok_bang(make_pos lexbuf) }
  | &quot;ref&quot;  { Tokens.tok_ref(make_pos lexbuf) }
  | &quot;do&quot;   { Tokens.tok_do(make_pos lexbuf) }
  | &quot;while&quot;    { Tokens.tok_while(make_pos lexbuf) }
  | &quot;||&quot;   { Tokens.tok_or(make_pos lexbuf) }
  | &quot;not&quot;  { Tokens.tok_not(make_pos lexbuf) }
  | &quot;&amp;amp;&quot;    { Tokens.tok_and(make_pos lexbuf) }
  | &quot;&amp;gt;&quot;    { Tokens.tok_gt(make_pos lexbuf) }
  | &quot;=&quot;    { Tokens.tok_eq(make_pos lexbuf) }
  | &quot;&amp;lt;&quot;    { Tokens.tok_lt(make_pos lexbuf) }
  | &quot;*&quot;    { Tokens.tok_times(make_pos lexbuf) }
  | &quot;-&quot;    { Tokens.tok_minus(make_pos lexbuf) } 
  | &quot;+&quot;    { Tokens.tok_plus(make_pos lexbuf) }
  | &quot;)&quot;    { Tokens.tok_rparen(make_pos lexbuf) }
  | &quot;(&quot;    { Tokens.tok_lparen(make_pos lexbuf) }
  | &quot;:&quot;    { Tokens.tok_colon(make_pos lexbuf) }
  | &quot;;&quot;    { Tokens.tok_semicolon(make_pos lexbuf) }
  | &quot;,&quot;    { Tokens.tok_comma(make_pos lexbuf) }

  | &quot;#&quot; projnum as s   { Tokens.tok_proj(make_pos lexbuf, int_of_string (String.sub s 1 (String.length s - 1))) } 

  | ident as id { Tokens.tok_id(make_pos lexbuf, id) } 
  | digit+ as num { Tokens.tok_num(make_pos lexbuf, int_of_string num) } (* num 처리 *)

  | [' ' '\t' '\r'] { initial lexbuf }
  | &quot;\n&quot; { Errormsg.new_line(make_pos lexbuf); initial lexbuf }

  | &quot;/*&quot; { comment 1 lexbuf }

  | eof    { raise Eof }

  | _ {
      let msg = Printf.sprintf &quot;Unexpected character: %s&quot; (Lexing.lexeme lexbuf) in
      Errormsg.impossible msg
    }

and comment depth = parse
  | &quot;/*&quot; { comment (depth + 1) lexbuf }
  | &quot;*/&quot; { if depth = 1 then initial lexbuf else comment (depth - 1) lexbuf }
  | eof  { Errormsg.impossible &quot;Unclosed comment&quot; }
  | _    { comment depth lexbuf }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>4학년 1학기 전공/컴파일러</category>
      <author>시데브</author>
      <guid isPermaLink="true">https://sypdevlog.tistory.com/367</guid>
      <comments>https://sypdevlog.tistory.com/367#entry367comment</comments>
      <pubDate>Sat, 12 Apr 2025 14:48:55 +0900</pubDate>
    </item>
  </channel>
</rss>