<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>   BokHub</title>
    <link>https://ybdeveloper.tistory.com/</link>
    <description>공부한 것 기록하기 </description>
    <language>ko</language>
    <pubDate>Mon, 6 Jul 2026 02:15:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>융복</managingEditor>
    <image>
      <title>   BokHub</title>
      <url>https://tistory1.daumcdn.net/tistory/3496435/attach/100c0b4eeadd4af6ad80d1c412eaa379</url>
      <link>https://ybdeveloper.tistory.com</link>
    </image>
    <item>
      <title>[컴퓨터 구조] 2의 보수, 1의 보수</title>
      <link>https://ybdeveloper.tistory.com/139</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1의 보수&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;각&amp;nbsp;자릿수의 값이 모두 1인 수에서 주어진 2진수를 빼면 1의 보수를 얻을 수 있다.&lt;/li&gt;
&lt;li&gt;2진수 1010의 1의 보수 : 1111-1010 = 0101&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;​&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2의 보수&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;1의 보수에 1을 더한 값과 같다.&lt;/li&gt;
&lt;li&gt;0101 + 0001 = 0110&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://st-lab.tistory.com/189&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://st-lab.tistory.com/189&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/컴퓨터 구조</category>
      <author>융복</author>
      <guid isPermaLink="true">https://ybdeveloper.tistory.com/139</guid>
      <comments>https://ybdeveloper.tistory.com/139#entry139comment</comments>
      <pubDate>Sat, 13 Nov 2021 01:54:23 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 페이지 교체 알고리즘</title>
      <link>https://ybdeveloper.tistory.com/138</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;페이지 교체 알고리즘이란?&amp;nbsp;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;메모리에 필요한 페이지가 부재할 경우, 새로운 페이지를 할당해야 하는데 이때 현재 메모리에 존재하는 페이지 중 어떤 페이지를 교체할지 결정하는 알고리즘이다.&lt;/span&gt;&lt;/blockquote&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; 이때 기왕이면 수정이 되지 않는 페이지를 선택해야 좋다. 만약 수정이 된 페이지를 꺼내게 되면 하드디스크에 기록을 해야 하므로 오버헤드가 크다.&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;페이지 교체 알고리즘 종류&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;FIFO 알고리즘&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;First-in-First-out으로 메모리에 먼저 올라온 페이지를 먼저 내보내는 알고리즘이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;처음 프로세스 실행시에 최초 초기화하는 작업만 수행하는 부분을 제외시킬 때 적절한 방법이다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OPT 알고리즘&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Optimal 알고리즘으로 앞으로 사용하지 않을 페이지를 가장 우선적으로 내보내는 알고리즘이다.&lt;/li&gt;
&lt;li&gt;FIFO에 비해 페이지 폴트의 횟수를 현저히 감소시킬 수 있지만 애초에 사용하지 않을 페이지라는 보장이 없기에 실현시킬 수 없는 알고리즘이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;LRU 알고리즘&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Least-Recently-Used로 최근에 사용하지 않은 페이지를 가장 먼저 내보내는 알고리즘이다.&lt;/li&gt;
&lt;li&gt;최근에 사용하지 않았으면 나중에도 사용하지 않을 것이라는 가정하에 만들어진 알고리즘이다.&lt;/li&gt;
&lt;li&gt;OPT 보다는 많은 페이지 폴트가 발생하지만, 실제로 사용 가능한 페이지 교체 알고리즘 중에서는 페이지 폴트가 가장 적다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;교체 방식&amp;nbsp;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Global 교체 : 메모리 상의 모든 프로세스의 페이지가 victim page 후보가 되는 교체 방법&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Local 교체 : 메모리 상의 자기 프로세스 페이지만 victim page 후보가 되는 교체 방법&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gyoogle.dev/blog/computer-science/operating-system/Page%20Replacement%20Algorithm.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gyoogle.dev/blog/computer-science/operating-system/Page%20Replacement%20Algorithm.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636730667184&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;페이지 교체 알고리즘 |  &amp;zwj;  Tech Interview&quot; data-og-description=&quot;페이지 교체 알고리즘 페이지 부재 발생 &amp;rarr; 새로운 페이지를 할당해야 함 &amp;rarr; 현재 할당된 페이지 중 어떤 것 교체할 지 결정하는 방법 좀 더 자세하게 생각해보면? 가상 메모리는 요구 페이지 기&quot; data-og-host=&quot;gyoogle.dev&quot; data-og-source-url=&quot;https://gyoogle.dev/blog/computer-science/operating-system/Page%20Replacement%20Algorithm.html&quot; data-og-url=&quot;https://gyoogle.dev/blog/computer-science/operating-system/Page%20Replacement%20Algorithm.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/imG4N/hyMkyoyEvf/FLcM6vGiGdxBDkOGO02R11/img.png?width=780&amp;amp;height=304&amp;amp;face=0_0_780_304,https://scrap.kakaocdn.net/dn/bz41Qm/hyMkw5l6nj/xhE2fJNpINskgKkf3PwhmK/img.png?width=763&amp;amp;height=297&amp;amp;face=0_0_763_297,https://scrap.kakaocdn.net/dn/cVhuAB/hyMkE3nHwD/U2jzBntLNf7Xvqyc3b8xU1/img.png?width=759&amp;amp;height=296&amp;amp;face=0_0_759_296&quot;&gt;&lt;a href=&quot;https://gyoogle.dev/blog/computer-science/operating-system/Page%20Replacement%20Algorithm.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gyoogle.dev/blog/computer-science/operating-system/Page%20Replacement%20Algorithm.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/imG4N/hyMkyoyEvf/FLcM6vGiGdxBDkOGO02R11/img.png?width=780&amp;amp;height=304&amp;amp;face=0_0_780_304,https://scrap.kakaocdn.net/dn/bz41Qm/hyMkw5l6nj/xhE2fJNpINskgKkf3PwhmK/img.png?width=763&amp;amp;height=297&amp;amp;face=0_0_763_297,https://scrap.kakaocdn.net/dn/cVhuAB/hyMkE3nHwD/U2jzBntLNf7Xvqyc3b8xU1/img.png?width=759&amp;amp;height=296&amp;amp;face=0_0_759_296');&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;페이지 교체 알고리즘 |  &amp;zwj;  Tech Interview&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;페이지 교체 알고리즘 페이지 부재 발생 &amp;rarr; 새로운 페이지를 할당해야 함 &amp;rarr; 현재 할당된 페이지 중 어떤 것 교체할 지 결정하는 방법 좀 더 자세하게 생각해보면? 가상 메모리는 요구 페이지 기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gyoogle.dev&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>
      <author>융복</author>
      <guid isPermaLink="true">https://ybdeveloper.tistory.com/138</guid>
      <comments>https://ybdeveloper.tistory.com/138#entry138comment</comments>
      <pubDate>Sat, 13 Nov 2021 00:26:11 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] CPU 스케줄링</title>
      <link>https://ybdeveloper.tistory.com/137</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;CPU 스케줄링이란?&amp;nbsp;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;여러 프로세스가 실행되고 있는 경우 CPU를 효율적으로 사용하기 위해 프로세스를 잘 배정하도록 하는 것&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;오버헤드는 줄이고, 사용률은 늘리고 기아 현상은 발생하지 않도록 하는 것&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Batch System : 가능하면 많은 일을 수행, 처리량이 중요하다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Interactive System : 빠른 응답시간 == 적은 대기 시간&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Real-time System : 데드라인 맞추기&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;선점과 비선점 스케줄링&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;선점 스케줄링 : OS가 CPU의 사용권을 프로세스에게 뺏을 수 있는 경우&amp;nbsp;&lt;/li&gt;
&lt;li&gt;비선점 스케줄링 : 프로세스가 종료되거나 I/O가 발생하는 경우를 제외하고는 실행 보장&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;CPU 스케줄링의 종류&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;비선점 스케줄링 : FCFS (Fist Come First Served)&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;FIFO(First In First Out)라고도 불리는 알고리즘, 말 그대로 가장 먼저 들어온 프로세스가 가장 먼저 CPU를 할당받는다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;만약 처리하는데 오랜 시간이 걸리는 프로세스가 앞쪽으로 오게 되면 평균 대기 시간이 길어진다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;비선점 스케줄링 : SJF (Shortest Job First)&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;FCFS의 대기시간이 크다는 문제를 해결하기 위해 나온 알고리즘이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;FCFS가 수행시간이 긴 프로세스가 앞으로 오게 되면 평균 대기시간이 길어진다는 점을 방지하기 위해 수행시간이 짧은 프로세스를 먼저 CPU를 할당시키도록 하는 것이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;FCFS보다 평균 대기 시간이 감소했지만, 짧은 작업에 유리하다는 단점이 존재하다.&lt;/li&gt;
&lt;li&gt;하지만 CPU가 프로세스를 처리하기 전에 프로세스의 수행시간을 알 수 있는 방법이 없었기에 실제로 적용시키는 어려운 알고리즘이다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;비선점 스케줄링 : HRN (Hightest Response-ratio Next)&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;우선순위를 공식을 이용하여 계산하여 SJF의 단점인 점유 불평등(짧은 작업에 유리)를 보완한 방법이다.&lt;/li&gt;
&lt;li&gt;우선순위 = (대기시간 + 실행시간) / 실행시간&amp;nbsp;&lt;/li&gt;
&lt;li&gt;오랫동안 대기하는 프로세스의 우선순위를 증가시킴으로서 기아 문제도 해결할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;선점 스케줄링 : Priority Scheduling&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;준비 큐에 프로세스가 도착하면, 도착한 프로세스의 우선순위와 현재 실행 중인 프로세스의 우선순위를 비교하여 우선순위가 가장 높은 프로세스에게 CPU를 할당한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;만약 동일한 우선순위를 가지고 있다면 먼저 들어온 프로세스가 우선적으로 처리된다.&lt;/li&gt;
&lt;li&gt;우선 순위가 낮은 프로세스가 무한정 기다리는 기아 상태가 발생 할수도 있다.&lt;/li&gt;
&lt;li&gt;대기 시간에 비례하여 우선순위를 부여하는 에이징 기법을 적용하여 기아 상태를 방지할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;선점 스케줄링 : Round Robin&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;FCFS와 동일하게 처리되지만 각 프로세스는 동일한 시간의 타임 퀀텀 만큼 CPU를 할당 받는다.&lt;/li&gt;
&lt;li&gt;만약 타임 퀀텀이 크면 FCFS와 동일해지고, 작으면 Context Switching이 잦아져서 오버헤드가 증가하게 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;선점 스케줄링 : Multilevel-Queue&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7vXQ5/btrkGNasZwL/Dhr2JyxcP2KCB2j2iaJRt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7vXQ5/btrkGNasZwL/Dhr2JyxcP2KCB2j2iaJRt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7vXQ5/btrkGNasZwL/Dhr2JyxcP2KCB2j2iaJRt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7vXQ5%2FbtrkGNasZwL%2FDhr2JyxcP2KCB2j2iaJRt1%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;300&quot; height=&quot;217&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;217&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;프로세스의 그룹에 따라 큐를 여러 개로 분리해놓고 큐 별로 스케줄링 알고리즘(보통 RR or FCFS)을 지정하는 것이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;foreground(Interactive Processes, System Processes)는 Round Robin 스케줄링을 적용시켜 Interactive하게 만들고 background는(Batch Processes) 프로세스들은 FCFS 스케줄링을 적용시킨다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;특정 큐에 들어가면 프로세스는 다른 큐로 이동하지 못한다.&lt;/li&gt;
&lt;li&gt;대기열 간의 스케줄링은 두가지 방법이 존재한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;고정 우선 순위 선점형 스케줄링 방법&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 큐는 우선 순위가 낮은 큐보다 절대적으로 높은 우선순위를 가지게 된다. 따라서 3번 큐는 1,2번 큐가 모든 프로세스를 완료할 때 까지 절대로 프로세스를 처리할 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;타임 슬라이싱&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;선점 스케줄링 : Multilevel-Feedback-Queue&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t0oGd/btrkHnI8mqx/1HbphUhGColEfqkKpV91JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t0oGd/btrkHnI8mqx/1HbphUhGColEfqkKpV91JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t0oGd/btrkHnI8mqx/1HbphUhGColEfqkKpV91JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft0oGd%2FbtrkHnI8mqx%2F1HbphUhGColEfqkKpV91JK%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;300&quot; height=&quot;269&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;269&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;Multilevel Queue와 다르게 프로세스의 큐 간 이동이 허용된다.&lt;/li&gt;
&lt;li&gt;우선순위는 중요도를 판단하여 지정되지만 이것이 절대적이지 않을수도 있다, Multilevel Queue는 우선순위가 잘못된 것을 알아도 수정하지 못하지만 Multilevel Feedback Queue는 잘못된 것을 알면 피드백이 가능하다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;피드백을 위해 높은 우선순위 큐로 격상시키는 시기 결정 알고리즘과 격하시키는 시기 결정 알고리즘 마지막으로 프로세스들이 어느 큐에 들어갈지 결정하는 알고리즘이 존재한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;낮은 우선 순위 큐의 프로세스는 높은 우선 순위 큐가 비어 있는 경우에만 실행이 가능하며, 높은 우선 순위 큐에 새로운 프로세스가 들어오면 낮은 우선 순위 큐에서 실행 중이던 프로세스는 중단된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;동작 방식&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;
&lt;pre id=&quot;code_1636727984916&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1. 프로세스가 실행을 시작하면 먼저 큐1에 들어간다.
2. 큐 1에서 프로세스는 퀀텀 4로 실행되고 퀀텀 4를 통해 완료되거나 I/O작업을 수행하게 되는 경우에는 우선 순위가 변경되지 않고 다시 큐1에서 실행하게 된다.
3. 만약 퀀텀 4로 완료되지 않으면 큐2로 이동한다.
4. 2,3번 과정도 큐2에서 반복되지만 퀀텀 8로 실행되며, 만약 퀀텀8로 완료되지 않으면 큐3으로 이동하게 된다.
5. 마지막 대기열 프로세스는 FCFS 방식으로 실행되게 된다.&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스케줄링의 성능을 측정할 수 있는 기준&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Response Time : 작업이 처음 실행되기까지 걸린 시간&lt;/li&gt;
&lt;li&gt;Turnaroudn TIme : 실행 시간과 대기 시간을 모두 합한 시간으로 작업이 완료될 때 까지 걸린 시간&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/multilevel-queue-mlq-cpu-scheduling/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.geeksforgeeks.org/multilevel-queue-mlq-cpu-scheduling/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636722415727&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;Multilevel Queue (MLQ) CPU Scheduling - GeeksforGeeks&quot; data-og-description=&quot;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&quot; data-og-host=&quot;www.geeksforgeeks.org&quot; data-og-source-url=&quot;https://www.geeksforgeeks.org/multilevel-queue-mlq-cpu-scheduling/&quot; data-og-url=&quot;https://www.geeksforgeeks.org/multilevel-queue-mlq-cpu-scheduling/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dFrail/hyMkCxBZo4/lCUTnK4I4mq5P7NJjoTeyk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/bHpHK2/hyMkF8U6RH/UhW0XthT3Uh1FdPgiZy3A0/img.png?width=300&amp;amp;height=217&amp;amp;face=0_0_300_217,https://scrap.kakaocdn.net/dn/fd85x/hyMkuzzoPP/UpJOgzkmfyyK1OzRU9cu70/img.png?width=596&amp;amp;height=178&amp;amp;face=0_0_596_178&quot;&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/multilevel-queue-mlq-cpu-scheduling/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.geeksforgeeks.org/multilevel-queue-mlq-cpu-scheduling/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dFrail/hyMkCxBZo4/lCUTnK4I4mq5P7NJjoTeyk/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/bHpHK2/hyMkF8U6RH/UhW0XthT3Uh1FdPgiZy3A0/img.png?width=300&amp;amp;height=217&amp;amp;face=0_0_300_217,https://scrap.kakaocdn.net/dn/fd85x/hyMkuzzoPP/UpJOgzkmfyyK1OzRU9cu70/img.png?width=596&amp;amp;height=178&amp;amp;face=0_0_596_178');&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;Multilevel Queue (MLQ) CPU Scheduling - GeeksforGeeks&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.geeksforgeeks.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gyoogle.dev/blog/computer-science/operating-system/CPU%20Scheduling.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gyoogle.dev/blog/computer-science/operating-system/CPU%20Scheduling.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636722427093&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;CPU Scheduling |  &amp;zwj;  Tech Interview&quot; data-og-description=&quot;CPU Scheduling 1. 스케줄링 CPU 를 잘 사용하기 위해 프로세스를 잘 배정하기 조건 : 오버헤드 &amp;darr; / 사용률 &amp;uarr; / 기아 현상 &amp;darr; 목표 Batch System: 가능하면 많은 일을 수행. 시간(time) 보단 처리량(throughout)&quot; data-og-host=&quot;gyoogle.dev&quot; data-og-source-url=&quot;https://gyoogle.dev/blog/computer-science/operating-system/CPU%20Scheduling.html&quot; data-og-url=&quot;https://gyoogle.dev/blog/computer-science/operating-system/CPU%20Scheduling.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://gyoogle.dev/blog/computer-science/operating-system/CPU%20Scheduling.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gyoogle.dev/blog/computer-science/operating-system/CPU%20Scheduling.html&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;CPU Scheduling |  &amp;zwj;  Tech Interview&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CPU Scheduling 1. 스케줄링 CPU 를 잘 사용하기 위해 프로세스를 잘 배정하기 조건 : 오버헤드 &amp;darr; / 사용률 &amp;uarr; / 기아 현상 &amp;darr; 목표 Batch System: 가능하면 많은 일을 수행. 시간(time) 보단 처리량(throughout)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gyoogle.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/multilevel-feedback-queue-scheduling-mlfq-cpu-scheduling/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.geeksforgeeks.org/multilevel-feedback-queue-scheduling-mlfq-cpu-scheduling/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636727554117&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;Multilevel Feedback Queue Scheduling (MLFQ) CPU Scheduling - GeeksforGeeks&quot; data-og-description=&quot;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&quot; data-og-host=&quot;www.geeksforgeeks.org&quot; data-og-source-url=&quot;https://www.geeksforgeeks.org/multilevel-feedback-queue-scheduling-mlfq-cpu-scheduling/&quot; data-og-url=&quot;https://www.geeksforgeeks.org/multilevel-feedback-queue-scheduling-mlfq-cpu-scheduling/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/9XVWR/hyMky9UuPt/GkuObMakuSKB2M30xFKaV0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/bk9jlq/hyMkr31xCt/UmMFzX1Pnqt5Xla84MafR0/img.png?width=300&amp;amp;height=269&amp;amp;face=0_0_300_269&quot;&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/multilevel-feedback-queue-scheduling-mlfq-cpu-scheduling/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.geeksforgeeks.org/multilevel-feedback-queue-scheduling-mlfq-cpu-scheduling/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/9XVWR/hyMky9UuPt/GkuObMakuSKB2M30xFKaV0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200,https://scrap.kakaocdn.net/dn/bk9jlq/hyMkr31xCt/UmMFzX1Pnqt5Xla84MafR0/img.png?width=300&amp;amp;height=269&amp;amp;face=0_0_300_269');&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;Multilevel Feedback Queue Scheduling (MLFQ) CPU Scheduling - GeeksforGeeks&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.geeksforgeeks.org&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>Computer Science/운영체제</category>
      <author>융복</author>
      <guid isPermaLink="true">https://ybdeveloper.tistory.com/137</guid>
      <comments>https://ybdeveloper.tistory.com/137#entry137comment</comments>
      <pubDate>Fri, 12 Nov 2021 23:40:03 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 트리와 이진트리</title>
      <link>https://ybdeveloper.tistory.com/136</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;트리란?&amp;nbsp;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;그래프의 한 종류이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;트리는 노드로 이루어진 자료 구조이며 다음과 같은 특성을 가지고 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;트리는 하나의 루트 노드를 갖는다.&lt;/li&gt;
&lt;li&gt;루트 노드는 0개 이상의 자식 노드를 가지고 있으며 그 자식들도 모두 마찬가지이다.&lt;/li&gt;
&lt;li&gt;노드들과 노드들을 연결하는 엣지들로 구성되어 있으며 이 연결된 엣지들은 절대로 사이클이 존재하지 않는다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;사이클이 존재하지 않기 때문에 간선수는 무조건 노드의 수 - 1 을 만족한다.&lt;/li&gt;
&lt;li&gt;루트 노드를 제외한 모든 노드들은 단 하나의 부모노드를 가진다.&lt;/li&gt;
&lt;li&gt;루트에서 어떤 노드로 가는 경로는 Unique하다.&lt;/li&gt;
&lt;/ol&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;depth : 루트에서 어떤 노드에 도달하기 위해 거쳐야 하는 엣지의 수를 말한다.&lt;/li&gt;
&lt;li&gt;height : 루트노드에서 잎새노드에 이르는 가장 긴 경로의 엣지 수를 의미한다.&lt;/li&gt;
&lt;li&gt;Level : 이때 특정 높이를 가지는 노드들의 집합을 Level이라고 부른다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Leaf node : 여기서 Leaf node는 자식노드가 없는 최하단의 노드들을 의미한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;internal node : Leaf node가 아닌 노드들을 말한다.&lt;/li&gt;
&lt;li&gt;degree : 각 노드가 지닌 가지의 수를 말한다.&lt;/li&gt;
&lt;li&gt;degree of tree : 트리의 최대 차수를 말한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;이진트리란?&amp;nbsp;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;자식노드가 최대 두 개인 노드들로 구성된 트리를 말한다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;이진트리는 full binary tree, complete binary tree, perfect binary tree 등이 있다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eA0UDr/btrktc2c573/TuzonyQMfmPuaxrExBetBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eA0UDr/btrktc2c573/TuzonyQMfmPuaxrExBetBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eA0UDr/btrktc2c573/TuzonyQMfmPuaxrExBetBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeA0UDr%2Fbtrktc2c573%2FTuzonyQMfmPuaxrExBetBk%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;1597&quot; height=&quot;402&quot; data-origin-width=&quot;1597&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;full binary tree&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 노드가 0개 또는 2개의 자식 노드를 가지는 트리&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;complete binary tree&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 Level을 제외한 모든 Level에 위치한 노드들이 꽉 채워진 이진트리이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무조건 데이터는 왼쪽에서 오른쪽으로 채워져야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Perfect binary tree&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;full binary tree이면서 완전 이진 트리인 경우를 말한다.&amp;nbsp; 즉, 모든 노드들이 두개의 자식 노드를 가지며 모든 Leaf Node가 동일한 Level을 가지고 있어야 한다. 각 높이 h마다 노드의 개수가 정확히 2^(h-1) 이여야 한다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;그래프 vs 트리&amp;nbsp;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;트리는 그래프의 한 종류이기도 하다. 그렇다면 일반적인 그래프와 차이점이 무엇일까?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;우선 트리는 그래프와 다르게 무방향인 경우가 존재하지 않다. 다음으로 가장 중요한 차이점은 트리는 사이클이 불가능하며, 자체 간선도 불가능하고 이를 정리하자면 비순환 그래프의 특징을 가지고 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;그래프는 루트 노드라는 개념이 존재하지 않지만, 트리는 루트 노드를 꼭 가지고 있어야만 한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;트리는 그래프와 다르게 부모-자식 개념도 존재한다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&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;p data-ke-size=&quot;size16&quot;&gt;트리순회란 트리의 모든 노드를 특정 방법으로 방문하는 과정을 말한다. 트리 순회에는 부모, 자식노드들을 방문하는 순서에 따라 전위순회, 중위순회, 후위순회 3가지로 분류된다.&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;preorder (전위순회)&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노드 -&amp;gt; 왼쪽 서브트리 -&amp;gt; 오른쪽 서브트리 순으로 방문하는 방식&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1636560833508&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    void preorder(TreeNode currentNode) {
        if(currentNode != null) {
            System.out.print(currentNode.data);
            inorder(currentNode.left);
            inorder(currentNode.right);
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;inorder (중위순회)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 서브트리 -&amp;gt; 노드 -&amp;gt; 오른쪽 서브트리 순으로 방문하는 방식&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1636560850446&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    void inorder(TreeNode currentNode) {
        if(currentNode != null) {
            inorder(currentNode.left);
            System.out.print(currentNode.data);
            inorder(currentNode.right);
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;postorder (후위순회)&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 서브트리 -&amp;gt; 오른쪽 서브트리 -&amp;gt; 노드 순으로 방문하는 방식&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1636560867848&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    void postorder(TreeNode currentNode) {
        if(currentNode != null) {
            inorder(currentNode.left);
            inorder(currentNode.right);
            System.out.print(currentNode.data);
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ratsgo.github.io/data%20structure&amp;amp;algorithm/2017/10/21/tree/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ratsgo.github.io/data%20structure&amp;amp;algorithm/2017/10/21/tree/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636558319597&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;트리(tree)와 이진트리(binary tree) &amp;middot; ratsgo's blog&quot; data-og-description=&quot;이번 글에서는 다양한 분야에서 널리 쓰이고 있는 자료구조인 트리(tree)와 트리의 일종인 이진트리(binary tree)에 대해 살펴보도록 하겠습니다. 힙 정렬이 뭔지 알아보려면 여러가지 개념을 먼저 &quot; data-og-host=&quot;ratsgo.github.io&quot; data-og-source-url=&quot;https://ratsgo.github.io/data%20structure&amp;amp;algorithm/2017/10/21/tree/&quot; data-og-url=&quot;https://ratsgo.github.io/data%20structure&amp;amp;algorithm/2017/10/21/tree/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ratsgo.github.io/data%20structure&amp;amp;algorithm/2017/10/21/tree/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ratsgo.github.io/data%20structure&amp;amp;algorithm/2017/10/21/tree/&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;트리(tree)와 이진트리(binary tree) &amp;middot; ratsgo's blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 다양한 분야에서 널리 쓰이고 있는 자료구조인 트리(tree)와 트리의 일종인 이진트리(binary tree)에 대해 살펴보도록 하겠습니다. 힙 정렬이 뭔지 알아보려면 여러가지 개념을 먼저&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ratsgo.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/08/12/data-structure-tree.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gmlwjd9405.github.io/2018/08/12/data-structure-tree.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636558670925&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;[자료구조] 트리(Tree)란 - Heee's Development Blog&quot; data-og-description=&quot;Step by step goes a long way.&quot; data-og-host=&quot;gmlwjd9405.github.io&quot; data-og-source-url=&quot;https://gmlwjd9405.github.io/2018/08/12/data-structure-tree.html&quot; data-og-url=&quot;http://gmlwjd9405.github.io/2018/08/12/data-structure-tree.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/08/12/data-structure-tree.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gmlwjd9405.github.io/2018/08/12/data-structure-tree.html&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;[자료구조] 트리(Tree)란 - Heee's Development Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Step by step goes a long way.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gmlwjd9405.github.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>Computer Science/자료구조</category>
      <author>융복</author>
      <guid isPermaLink="true">https://ybdeveloper.tistory.com/136</guid>
      <comments>https://ybdeveloper.tistory.com/136#entry136comment</comments>
      <pubDate>Thu, 11 Nov 2021 01:16:33 +0900</pubDate>
    </item>
    <item>
      <title>[정렬] 힙 정렬</title>
      <link>https://ybdeveloper.tistory.com/135</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;힙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙정렬을 이해하기 전에 힙에 대한 이해가 필요하다.&amp;nbsp; 힙을 이해하기 위해선 다음 포스트를 확인해보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ybdeveloper.tistory.com/132&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ybdeveloper.tistory.com/132&lt;/a&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;힙 정렬이란?&amp;nbsp;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;Max Heap, Min Heap을 구성해 정렬하는 방법이다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;내림차순 정렬을 위해서는 Max Heap, 오름차순 정렬을 위해서는 Min Heap을 구성하면 된다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;즉, 데이터들을 Max Heap이나 Min Heap 형태로 유지한 채 루트 노드의 데이터를 뽑아내 정렬을 하는 방식이다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;힙 정렬 구현 (내림차순)&amp;nbsp;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. n개의 데이터에 대해 반복한다.&amp;nbsp; O(n)&amp;nbsp;&lt;br /&gt;&amp;nbsp; 1-1. 배열에 데이터를 삽입하며 Max-Heap 특성을 만족하도록 조정한다. O(lgn)&lt;br /&gt;2. Max-Heap에 데이터가 존재하지 않을 때 까지 데이터를 뽑아낸다.&amp;nbsp; O(n) &amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;힙 정렬 JAVA로 구현하기&lt;/h4&gt;
&lt;pre id=&quot;code_1636555100170&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public void insert(int n) {
        heap[idx] = n;
        int parent = idx/2;
        int child = idx;
        while(child &amp;gt;= 2 &amp;amp;&amp;amp; heap[parent] &amp;lt; heap[child]) {
            SWAP(parent, child);
            child = parent;
            parent = child/2;
        }
        idx++;
    }

    public int delete() {
        int data = heap[1];
        heap[1] = heap[idx--];
        int parent = 1;
        int child = 2;
        while(child &amp;lt;= idx &amp;amp;&amp;amp; heap[parent] &amp;lt; heap[child]) {
            SWAP(parent, child);
            parent = child;
            child = heap[heap[parent * 2] &amp;lt; heap[parent * 2 + 1] ? parent * 2 + 1 : parent * 2];
        }
        return data;
    }

    public void SWAP(int idx1, int idx2) {
        int temp = heap[idx1];
        heap[idx1] = heap[idx2];
        heap[idx2] = temp;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 Max Heap을 구현한 코드이다. Max Heap은 데이터를 삽입하거나, 삭제해도 특성을 유지하고 최상단 루트 노드에는 가장 큰 값을 가진 노드가 위치하게 된다. 따라서 힙 정렬을 구현하기 위해서는 단순히 힙의 특성을 활용하여 가장 맨 위에 있는 루트 노드의 데이터를 가져와 출력 시켜주기만 하면 정렬된 데이터를 얻을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 구현한 코드는 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1636556675240&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public void sort() {
        int temp = heapSize;
        for(int i=0; i&amp;lt;temp; i++) {
            System.out.print(delete() + &quot; &quot;);
        }
    }&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;힙정렬의 시간 복잡도&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;데이터 삽입&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 삽입하는 작업은 최악의 경우 모든 Level의 노드에 대해 비교 연산을 진행해야 하므로 O(lgn)이다.&amp;nbsp; 그런데 데이터 삽입 작업을 모든 데이터에 대해 반복하므로 O(n * lgn) 이라고 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;데이터 삭제&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 삭제하는 작업은 최악, 최선 모두 O(1)의 시간 복잡도를 가지고 있다.&amp;nbsp; 데이터 삭제 작업 또한 모든 데이터에 대해 반복하므로 O(n * 1) 이지만, 데이터가 무한대로 커진다면 O(n)은 O(n * lgn)에 비해 큰 영향을 주지 못하므로 생략이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;따라서 힙 정렬의 시간 복잡도는 O(n * lgn)이다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/알고리즘</category>
      <author>융복</author>
      <guid isPermaLink="true">https://ybdeveloper.tistory.com/135</guid>
      <comments>https://ybdeveloper.tistory.com/135#entry135comment</comments>
      <pubDate>Thu, 11 Nov 2021 00:24:26 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 힙</title>
      <link>https://ybdeveloper.tistory.com/132</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;우선순위&amp;nbsp;큐란?&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;326&quot; width=&quot;707&quot; height=&quot;268&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmDeRR/btrkja49EzL/NOzzCbDXmEqAjdekH9CkVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmDeRR/btrkja49EzL/NOzzCbDXmEqAjdekH9CkVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmDeRR/btrkja49EzL/NOzzCbDXmEqAjdekH9CkVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmDeRR%2Fbtrkja49EzL%2FNOzzCbDXmEqAjdekH9CkVK%2Fimg.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;326&quot; width=&quot;707&quot; height=&quot;268&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;우선순위의 개념을 큐에 도입한 자료 구조&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;데이터들이 우선순위를 가지고 있고 우선순위가 높은 데이터가 먼저 나간다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;우선순위&amp;nbsp;큐는&amp;nbsp;배열,&amp;nbsp;연결리스트,&amp;nbsp;힙&amp;nbsp;으로&amp;nbsp;구현이&amp;nbsp;가능하다.&amp;nbsp;이&amp;nbsp;중에서&amp;nbsp;힙(heap)으로&amp;nbsp;구현하는&amp;nbsp;것이&amp;nbsp;가장&amp;nbsp;효율적이다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;힙이란?&amp;nbsp;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;완전이진트리 구조&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;최댓값과 최솟값을 뽑아낼 때 사용하기 좋은 자료구조이다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;힙은 완전히 정렬된 상태를 유지하는 것이 아닌 Level에 따른 정렬만 이루어져 느슨한 정렬상태를 유지한다.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;(Max Heap인 경우 부모가 자식보다 큰 값을 가지고 있고, Min Heap인 경우 부모가 자식보다 작은 값을 가지고 있어야 함)&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;힙의 종류&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Max Heap&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;루트 노드에는 항상 가장 큰 값이 위치하고 있으며, 부모 노드가 자식 노드들보다 무조건 값이 커야한다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Min Heap&lt;/h4&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;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;힙의 구현&amp;nbsp;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;힙은 보통 배열을 이용하여 구현하며, 부모 노드와 자식 노드를 구분하는 방식은 다음과 같다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;부모의 인덱스를 i라고 했을때 왼쪽 자식의 인덱스는 2 * i, 오른쪽 자식의 인덱스는 2 * i + 1 이다.&lt;/li&gt;
&lt;/ol&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;가장 마지막 위치에 삽입할 데이터를 삽입한다.&lt;/li&gt;
&lt;li&gt;힙의 특성에 맞게 데이터들의 위치를 조정한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;힙의 삭제 연산&amp;nbsp;&lt;/h4&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;마지막 노드를 루트 노드의 위치로 옮긴다.&lt;/li&gt;
&lt;li&gt;힙의 특성에 맞게 데이터들의 위치를 조정한다.&lt;/li&gt;
&lt;/ol&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;pre id=&quot;code_1636557769360&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public void insert(int n) {
        heap[++heapSize] = n;
        int parent = heapSize/2;
        int child = heapSize;
        while(child &amp;gt;= 2 &amp;amp;&amp;amp; heap[parent] &amp;lt; heap[child]) {
            SWAP(parent, child);
            child = parent;
            parent = child/2;
        }
    }

    public int delete() {
        int data = heap[1];
        heap[1] = heap[heapSize--];
        int parent = 1;
        int child = 2;
        while(child &amp;lt;= heapSize &amp;amp;&amp;amp; heap[parent] &amp;lt; heap[child]) {
            SWAP(parent, child);
            parent = child;
            child = heap[heap[parent * 2] &amp;lt; heap[parent * 2 + 1] ? parent * 2 + 1 : parent * 2];
        }
        return data;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636462121588&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;[자료구조] 힙(heap)이란 - Heee's Development Blog&quot; data-og-description=&quot;Step by step goes a long way.&quot; data-og-host=&quot;gmlwjd9405.github.io&quot; data-og-source-url=&quot;https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html&quot; data-og-url=&quot;http://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gmlwjd9405.github.io/2018/05/10/data-structure-heap.html&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;[자료구조] 힙(heap)이란 - Heee's Development Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Step by step goes a long way.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gmlwjd9405.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://aerocode.net/193&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://aerocode.net/193&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1636462133972&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;우선순위 큐 ADT&quot; data-og-description=&quot;이 블로그의 모든 예제코드는 깃허브에서도 볼 수 있습니다. 아래의 포스트는 개인적인 용도로 내용을 요약한 것 입니다. https://github.com/AeroCodeX/ 우선순위 큐 ADT 데이터에 우선순위가 존재하여,&quot; data-og-host=&quot;aerocode.net&quot; data-og-source-url=&quot;https://aerocode.net/193&quot; data-og-url=&quot;https://aerocode.net/193&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lVdpX/hyMh8Q6gqi/VRgmlHKLCqLQSUQsVIYfV1/img.png?width=394&amp;amp;height=399&amp;amp;face=0_0_394_399,https://scrap.kakaocdn.net/dn/b5VZBr/hyMiddM8d4/zyXrPmuAd0opuRc0xbQBY0/img.png?width=394&amp;amp;height=399&amp;amp;face=0_0_394_399,https://scrap.kakaocdn.net/dn/mgrL9/hyMidx5GcL/rkP8TbLqqhQPiIku8CJKp1/img.png?width=651&amp;amp;height=529&amp;amp;face=0_0_651_529&quot;&gt;&lt;a href=&quot;https://aerocode.net/193&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://aerocode.net/193&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lVdpX/hyMh8Q6gqi/VRgmlHKLCqLQSUQsVIYfV1/img.png?width=394&amp;amp;height=399&amp;amp;face=0_0_394_399,https://scrap.kakaocdn.net/dn/b5VZBr/hyMiddM8d4/zyXrPmuAd0opuRc0xbQBY0/img.png?width=394&amp;amp;height=399&amp;amp;face=0_0_394_399,https://scrap.kakaocdn.net/dn/mgrL9/hyMidx5GcL/rkP8TbLqqhQPiIku8CJKp1/img.png?width=651&amp;amp;height=529&amp;amp;face=0_0_651_529');&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;우선순위 큐 ADT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이 블로그의 모든 예제코드는 깃허브에서도 볼 수 있습니다. 아래의 포스트는 개인적인 용도로 내용을 요약한 것 입니다. https://github.com/AeroCodeX/ 우선순위 큐 ADT 데이터에 우선순위가 존재하여,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;aerocode.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/자료구조</category>
      <author>융복</author>
      <guid isPermaLink="true">https://ybdeveloper.tistory.com/132</guid>
      <comments>https://ybdeveloper.tistory.com/132#entry132comment</comments>
      <pubDate>Tue, 9 Nov 2021 22:20:57 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] *다익스트라 알고리즘</title>
      <link>https://ybdeveloper.tistory.com/131</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;다익스트라 알고리즘이 뭘까?&lt;/h3&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 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 data-ke-size=&quot;size16&quot;&gt;다익스트라 알고리즘의 메인 아이디어는 다이나믹 프로그래밍(DP)이다. 다익스트라 알고리즘은 기존에 구해놓은 최단 거리를 이용하여 최단 거리를 갱신해나가는 메인 아이디어를 가지고 있다.&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt; (최단 경로는 최단 경로들의 집합으로 이루어져 있다)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;다익스트라 알고리즘의 복잡도 (좀 더 자세히 알아볼 것)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 다익스트라 알고리즘은 O(V^2)의 시간 복잡도를 가지고 있었지만 우선순위 큐를 활용한 발전된 아이디어가 제공되면서 O(E * lgV)의 시간복잡도를 가진 알고리즘으로 개선되었다.&amp;nbsp; (V는 노드의 수, E는 간선의 수)&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;다익스트라 알고리즘 로직&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 시작 노드를 선택하여, 우선 순위큐에 삽입한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1-1. 시작 노드의 최단 경로를 0으로 초기화 하고, 나머지 노드는 무한대 값으로 초기화한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 우선 순위 큐(Min Heap)에서 가장 작은 비용을 가진 노드를 꺼낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2-1. 꺼낸 노드와 연결된 노드들을 가져와 반복한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-1-1. u가 출발 노드 v가 목적지라고 할 때, &lt;b&gt;최단 경로 비용[v] = Math.min(최단 경로 비용[v], 최단 경로 비용[u] + 경로 비용[u][v]) &lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;(s -&amp;gt; v, s -&amp;gt; u -&amp;gt; v) 을 비교하는 것&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 2번을 우선 순위 큐에 노드가 존재하지 않을 때 까지 반복한다.&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;다익스트라 알고리즘 구현&lt;/h3&gt;
&lt;pre id=&quot;code_1636380010203&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private void dijkstra(int start) {
        boolean[] check = new boolean[adjArray.length+1];
        PriorityQueue&amp;lt;int[]&amp;gt; queue = new PriorityQueue&amp;lt;&amp;gt;(Comparator.comparingInt(o -&amp;gt; o[1]));

        Arrays.fill(distance, Integer.MAX_VALUE);
        distance[start] = 0;

        queue.add(new int[]{start, 0});
        while(!queue.isEmpty()) {
            int[] u = queue.poll();
            if(distance[u[0]] &amp;lt; u[1]) continue;;
            LinkedList&amp;lt;Integer&amp;gt; connectedNodes = findConnectedNode(u[0]);
            for(int v : connectedNodes) {
                if(distance[v] &amp;gt; distance[u[0]] + adjArray[u[0]][v]) {
                    distance[v] =  distance[u[0]] + adjArray[u[0]][v];
                    queue.add(new int[]{v, distance[v]});
                }
            }
        }
    }

    private LinkedList&amp;lt;Integer&amp;gt; findConnectedNode(int u) {
        LinkedList&amp;lt;Integer&amp;gt; connectedNodes = new LinkedList&amp;lt;&amp;gt;();
        int[] adjLine = adjArray[u];
        for(int i=1; i&amp;lt;adjLine.length; i++) {
            if(adjLine[i] != 0) connectedNodes.add(i);
        }
        return connectedNodes;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;Q1. if(distance[u[0]] &amp;lt; u[1])) continue; 는 왜 하는걸까요?&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다익스트라 알고리즘의 메인 아이디어는 기존의 최단 경로를 활용하여 최단 경로를 구하는 로직인데, 최단 경로가 아니라면 굳이 그것을 이용하여 갱신을 시도할 필요가 없기 때문에 하는겁니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Q2. if(distance[v] &amp;gt; distance[u[0]] + adjArray[u[0]][v]) 여야 queue에 노드를 넣는건가요?&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 질문의 대답처럼 최단 경로를 이용하여 새로운 최단 경로를 구하는 로직인데, 갱신이 되지 않은 (최소가 아닌) 경로를 활용할 필요는 없기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/알고리즘</category>
      <category>다익스트라</category>
      <author>융복</author>
      <guid isPermaLink="true">https://ybdeveloper.tistory.com/131</guid>
      <comments>https://ybdeveloper.tistory.com/131#entry131comment</comments>
      <pubDate>Mon, 8 Nov 2021 22:29:30 +0900</pubDate>
    </item>
    <item>
      <title>[데이터베이스] Anomaly (이상)</title>
      <link>https://ybdeveloper.tistory.com/130</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;테이블에 대해 정규화를 해야하는 이유는 Anomaly(이상 현상)이 나타나기 때문이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;삽입 이상&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;556&quot; width=&quot;699&quot; height=&quot;338&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHp866/btrj89ql1ve/cWDf6Tnnhxh3uj68cIZEik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHp866/btrj89ql1ve/cWDf6Tnnhxh3uj68cIZEik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHp866/btrj89ql1ve/cWDf6Tnnhxh3uj68cIZEik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHp866%2Fbtrj89ql1ve%2FcWDf6Tnnhxh3uj68cIZEik%2Fimg.png&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;556&quot; width=&quot;699&quot; height=&quot;338&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;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;Faculty and Courses 테이블에 Course Code가 없는 Faculty인 경우 어떻게 삽입해야 할까?&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&amp;rarr; 없음을 표시하는 불필요한 정보가 삽입 되어야함!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;갱신 이상&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;382&quot; width=&quot;621&quot; height=&quot;237&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6A6RY/btrj7SoQKFS/Ky8MopepUl7rpHGJrGIKq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6A6RY/btrj7SoQKFS/Ky8MopepUl7rpHGJrGIKq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6A6RY/btrj7SoQKFS/Ky8MopepUl7rpHGJrGIKq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6A6RY%2Fbtrj7SoQKFS%2FKy8MopepUl7rpHGJrGIKq1%2Fimg.png&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;382&quot; width=&quot;621&quot; height=&quot;237&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;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;김사랑 &amp;rarr; 김소연으로 바꾸는 경우 모든 김사랑이 김소연으로 바뀌어야만 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&amp;rarr; 첫번째 튜플과 세번째 튜플 간의 데이터 불일치 발생&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;삭제 이상&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;482&quot; width=&quot;613&quot; height=&quot;245&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blnZly/btrj88StX6W/nbuRq5K9licbB6OfsqnCaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blnZly/btrj88StX6W/nbuRq5K9licbB6OfsqnCaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blnZly/btrj88StX6W/nbuRq5K9licbB6OfsqnCaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblnZly%2Fbtrj88StX6W%2FnbuRq5K9licbB6OfsqnCaK%2Fimg.png&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;482&quot; width=&quot;613&quot; height=&quot;245&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;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;ENG-206 강의를 제거하려고 389번 튜플을 제거했더니 Dr.Giddens의 정보도 삭제되었다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;&amp;rarr; 꼭 필요 했던 Dr.Giddens의 정보도 함께 삭제되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/데이터베이스</category>
      <author>융복</author>
      <guid isPermaLink="true">https://ybdeveloper.tistory.com/130</guid>
      <comments>https://ybdeveloper.tistory.com/130#entry130comment</comments>
      <pubDate>Sun, 7 Nov 2021 19:44:49 +0900</pubDate>
    </item>
    <item>
      <title>[정렬] 기수 정렬</title>
      <link>https://ybdeveloper.tistory.com/129</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;기수 정렬이란?&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;낮은 자리수부터 비교하여 정렬해가는 알고리즘이며 비교 연산이 불필요한 정렬이다.&amp;nbsp;&lt;br /&gt;자릿수에 해당되는 값에 따라 버킷에 데이터들을 삽입하기 때문에 비교 연산이 불필요하지만 자릿수만큼의 추가적인 메모리 공간이 필요하다.&amp;nbsp; (또한 자릿수만큼의 추가적인 로직도 필요하다)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&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;h3 data-ke-size=&quot;size23&quot;&gt;구현과 시간 복잡도&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자바를 이용한 구현&lt;/h4&gt;
&lt;pre id=&quot;code_1636213833410&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public static void main(String[] args) {
        RadixSort radixSort = new RadixSort();

        for(int i=0; i&amp;lt;10; i++) {
            buckets.add(new LinkedList&amp;lt;&amp;gt;());
        }

        // 1
        int digit = radixSort.getMaximumDigit();
        // 2
        for(int i=1; i&amp;lt;=digit; i++) {
            // 2-1
            for (int number : numbers) {
                // 2-1-1
                int digitValue = radixSort.getDigitValue(number, i);
                // 2-1-2
                buckets.get(digitValue).offer(number);
            }

			/ 2-2
            int idx = 0;
            for (LinkedList&amp;lt;Integer&amp;gt; bucket : buckets) {
                while (!bucket.isEmpty()) {
                    numbers[idx++] = bucket.poll();
                }
            }
        }

        System.out.println(Arrays.toString(numbers));

    }

    private int getMaximumDigit() {
        int max = 0;
        for (int number : numbers) {
            max = Math.max((int) Math.log10(number)+1, max);
        }
        return max;
    }

    private int getDigitValue(int number, int digit) {
        return (int) (number / Math.pow(10, digit-1)) % 10;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 자릿수를 구한다. (digit)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 1의 자리부터 digit 자리까지 반복한다. &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;O(d)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2-1. 모든 데이터에 대해서 반복한다. &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;O(n)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-1-1. 자릿수에 해당되는 데이터를 뽑아낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-1-2. 뽑아낸 데이터를 이용하여 해당되는 Bucket에 데이터를 삽입한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 2-2. bucket에 들어간 순서대로 데이터를 정렬한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시간 복잡도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 자릿수에 대해 반복하기 때문에 &lt;i&gt;O(자릿수)&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 자릿수마다 모든 데이터에 대해 정렬을 수행하기 때문에 &lt;i&gt;O(데이터 수)&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 기수 정렬의 시간 복잡도는 &lt;i&gt;O(자릿수 * 데이터 수) &lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;i&gt;O(dn) (d는 최대 자릿수)&lt;/i&gt; 이다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/알고리즘</category>
      <author>융복</author>
      <guid isPermaLink="true">https://ybdeveloper.tistory.com/129</guid>
      <comments>https://ybdeveloper.tistory.com/129#entry129comment</comments>
      <pubDate>Sun, 7 Nov 2021 01:00:11 +0900</pubDate>
    </item>
    <item>
      <title>GCD(최대 공약수), LCM(최소 공배수) 구하기</title>
      <link>https://ybdeveloper.tistory.com/128</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;최대 공약수 구하기&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;유클리드 알고리즘이란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대 공약수(GCD)를 구할 수 있는 알고리즘으로, &lt;i&gt;gcd(a,b)&lt;/i&gt;와 (&lt;i&gt;r=a%b&lt;/i&gt;라고 할 때), &lt;i&gt;gcd(b,r)&lt;/i&gt;의 최대 공약수는&amp;nbsp;같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;i&gt;gcd(a,b) == gcd(b,r)&lt;/i&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 성질에 따라 &lt;i&gt;gcd(a,b) == gcd(b, a%b) == gcd(a%b, (a%b)%b)....&lt;/i&gt; 반복하여 나머지가 0이 되었을 때 나뉘어지는 수가 a와 b의 최대공약수가 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하자면&amp;nbsp;&lt;i&gt;gcd(a,b) -&amp;gt; cdg(a, a%b) .... -&amp;gt; gcd(x, 0)&lt;/i&gt;이면 a와 b의 최대 공약수는 x이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;구현&lt;/h4&gt;
&lt;pre id=&quot;code_1635858923960&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private static int gcd(int a, int b) {
        if(b == 0) return a;
        return gcd(b, a%b);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최소 공배수를 구하는 방법&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;최대공약수와 최소공배수의 관계&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A,B의 최대공약수 = G, 최소공배수 = L이라고 하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;A = Ga, B = Gb&lt;/i&gt; (a와 b는 서로소이다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;L = Gab = AB/G&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;GL = ab&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 최소 공배수 &lt;i&gt;L = a*b/G&lt;/i&gt; 이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;구현&lt;/h4&gt;
&lt;pre id=&quot;code_1635858953053&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private static int gcd(int a, int b) {
        if(b == 0) return a;
        return gcd(b, a%b);
    }

    private static int lcm(int a, int b) {
        return a * b / gcd(a,b);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/알고리즘</category>
      <category>GCD</category>
      <category>LCM</category>
      <author>융복</author>
      <guid isPermaLink="true">https://ybdeveloper.tistory.com/128</guid>
      <comments>https://ybdeveloper.tistory.com/128#entry128comment</comments>
      <pubDate>Tue, 2 Nov 2021 22:19:08 +0900</pubDate>
    </item>
  </channel>
</rss>