<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>회고록 </title>
    <link>https://ribblestudy.tistory.com/</link>
    <description>ribblestudy 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 11 Jun 2026 11:48:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>RꞮbble</managingEditor>
    <item>
      <title>[개인 프로젝트] ProjectA - 인터페이스, 클래스</title>
      <link>https://ribblestudy.tistory.com/116</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;IState&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public&amp;nbsp;interface&amp;nbsp;IState &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;Enter(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;Update(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;Exit(); &lt;br /&gt;}&lt;/p&gt;
&lt;/div&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;span style=&quot;letter-spacing: 0px;&quot;&gt;모든 상태들의 인터페이스&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;모든 상태는 진입 시점과 탈출 시점이 있으므로, Enter()와 Exit()를 추가했다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;모든 상태는 매 프레임마다 체크할 로직이 필요할 수 있으므로, Update()를 추가했다.&amp;nbsp;&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;b&gt;BaseState&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class BaseState : IState&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; // 공통 기능 컴포넌트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; protected AnimationController animationController;&lt;/span&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; &amp;nbsp; public virtual void Enter() { }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; public virtual void Update() { }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; public virtual void Exit() { }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;/div&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;span style=&quot;letter-spacing: 0px;&quot;&gt;모든 상태들의 최상위 부모가 되는 클래스&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;IState 인터페이스를 상속받아 Enter(), Update(), Exit()를 강제로 구현하도록 했다.&lt;/li&gt;
&lt;li&gt;모든 상태들의 최상위 부모이므로, 공통적으로 사용되는 컴포넌트를 가지고 있으면 되겠다.&amp;nbsp;&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;b&gt;PlayerState&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class PlayerState : BaseState&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; // 플레이어 공통 기능 컴포넌트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; protected InputReader inputReader;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; protected PlayerMovement playerMovement;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; protected VerticalVelocity verticalVelocity;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; public override void Enter()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; base.Enter();&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; public override void Update()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; base.Update();&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; public override void Exit()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; base.Exit();&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;/div&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;/li&gt;
&lt;li&gt;BaseState를 상속받아 Enter(), Update(), Exit()를 재정의 하도록 했고,&lt;/li&gt;
&lt;li&gt;플레이어 상태들의 부모이므로, 플레이어 상태들에서 공통적으로 사용되는 컴포넌트를 가지고 있으면 되겠다.&amp;nbsp;&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;b&gt;PlayerGroundState&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class PlayerGroundState : PlayerState&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; // 플레이어가 땅에 있을 때 사용되는 기능 컴포넌트&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt; &lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt; public override void Enter()&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; base.Enter();&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; public override void Update()&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; base.Update();&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; public override void Exit()&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; base.Exit();&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;/div&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;/li&gt;
&lt;li&gt;PlayerState를 상속받아 Enter(), Update(), Exit()를 재정의 하도록 했다.&lt;/li&gt;
&lt;li&gt;대기/걷기/뛰기 상태들의 부모이므로, 땅에 있을 때 공통적으로 사용되는 컴포넌트를 가지고 있으면 되겠다.&amp;nbsp;&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;b&gt;PlayerAirState&lt;/b&gt;&lt;/h4&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;public class PlayerAirState : PlayerState&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; // 플레이어가 공중에 있을 때 사용되는 기능 컴포넌트&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;public override void Enter()&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; base.Enter();&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; public override void Update()&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; base.Update();&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; public override void Exit()&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; base.Exit();&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fafafa; color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;/div&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;/li&gt;
&lt;li&gt;PlayerState를 상속받아 Enter(), Update(), Exit()를 재정의 하도록 했다.&lt;/li&gt;
&lt;li&gt;점프 시작/중/착지 상태들의 부모이므로, 공중에 있을 때 공통적으로 사용되는 컴포넌트를 가지고 있으면 되겠다.&amp;nbsp;&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;</description>
      <category>개인 프로젝트/ProjectA</category>
      <author>RꞮbble</author>
      <guid isPermaLink="true">https://ribblestudy.tistory.com/116</guid>
      <comments>https://ribblestudy.tistory.com/116#entry116comment</comments>
      <pubDate>Mon, 8 Jun 2026 22:28:53 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트] Programmers - H Index (실패)</title>
      <link>https://ribblestudy.tistory.com/115</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;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42747&quot;&gt;코딩테스트 연습 - H-Index | 프로그래머스 스쿨&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1780919327606&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;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42747&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ch5JYd/dJMb82eUUPn/7FEIR4vxsIkjW6pRA6EKv0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/GOYHN/dJMb86n5vVb/fKvPLQkqBsq7Ti2beMnGNK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42747&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42747&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ch5JYd/dJMb82eUUPn/7FEIR4vxsIkjW6pRA6EKv0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/GOYHN/dJMb86n5vVb/fKvPLQkqBsq7Ti2beMnGNK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[문제]&lt;/b&gt; &lt;br /&gt;H-Index는&amp;nbsp;과학자의&amp;nbsp;생산성과&amp;nbsp;영향력을&amp;nbsp;나타내는&amp;nbsp;지표 &lt;br /&gt;어느&amp;nbsp;과학자의&amp;nbsp;H_Index를&amp;nbsp;나타내는&amp;nbsp;값인&amp;nbsp;h를&amp;nbsp;구해야&amp;nbsp;한다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;H_index&amp;nbsp;구하는&amp;nbsp;방법 &lt;br /&gt;논문&amp;nbsp;n편&amp;nbsp;중,&amp;nbsp;h번&amp;nbsp;이상&amp;nbsp;인용된&amp;nbsp;논문이&amp;nbsp;h편&amp;nbsp;이상이고&amp;nbsp; &lt;br /&gt;나머지&amp;nbsp;논문이&amp;nbsp;h번&amp;nbsp;이하&amp;nbsp;인용되었다.&amp;nbsp; &lt;br /&gt;이때&amp;nbsp;h의&amp;nbsp;최댓값이&amp;nbsp;H_index이다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[입력]&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;논문의&amp;nbsp;인용&amp;nbsp;횟수&amp;nbsp;배열&amp;nbsp;citations&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[출력]&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;과학자의&amp;nbsp;H_index&amp;nbsp;반환&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[제한사항]&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;1편&amp;nbsp;&amp;lt;=&amp;nbsp;발표한&amp;nbsp;논문의&amp;nbsp;수&amp;nbsp;&amp;lt;=&amp;nbsp;1,000편 &lt;br /&gt;-&amp;nbsp;0회&amp;nbsp;&amp;lt;=&amp;nbsp;논문별&amp;nbsp;인용&amp;nbsp;횟수&amp;nbsp;&amp;lt;=&amp;nbsp;10,000회&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[입출력&amp;nbsp;예]&lt;/b&gt; &lt;br /&gt;citations&amp;nbsp;=&amp;nbsp;[3,&amp;nbsp;0,&amp;nbsp;6,&amp;nbsp;1,&amp;nbsp;5]] &lt;br /&gt;&lt;br /&gt;논문의&amp;nbsp;수&amp;nbsp;=&amp;nbsp;5 &lt;br /&gt;3번&amp;nbsp;이상&amp;nbsp;인용된&amp;nbsp;논문이&amp;nbsp;3편&amp;nbsp;(h번&amp;nbsp;이상&amp;nbsp;인용된&amp;nbsp;논문이&amp;nbsp;h편&amp;nbsp;이상) &lt;br /&gt;나머지&amp;nbsp;논문은&amp;nbsp;3번&amp;nbsp;이하&amp;nbsp;인용되었다.&amp;nbsp;(나머지&amp;nbsp;논문은&amp;nbsp;h번&amp;nbsp;이하&amp;nbsp;인용) &lt;br /&gt;H-Index&amp;nbsp;=&amp;nbsp;3&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[풀이]&lt;/b&gt; &lt;br /&gt;1 &lt;br /&gt;i번째&amp;nbsp;논문이&amp;nbsp;citations[i]번&amp;nbsp;이상&amp;nbsp;인용된&amp;nbsp;논문이&amp;nbsp;citations[i]편이고 &lt;br /&gt;나머지&amp;nbsp;논문은&amp;nbsp;citations[i]번&amp;nbsp;이하&amp;nbsp;인용되었는지&amp;nbsp;확인.&amp;nbsp; &lt;br /&gt;이&amp;nbsp;과정을&amp;nbsp;citations&amp;nbsp;길이만큼&amp;nbsp;반복 &lt;br /&gt;조건을&amp;nbsp;만족하면&amp;nbsp;H-index를&amp;nbsp;반환&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;코드1 - 오답&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780919421102&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

public class Solution {
    public int solution(int[] citations) 
    {
        int count1 = 0; 
        int count2 = 0; 
        int max = -1;
        
        for(int i = 0; i &amp;lt; citations.Length; i++)
        {
            for(int j = 0; j &amp;lt; citations.Length; j++)
            {
                if(citations[j] &amp;gt;= citations[i])
                    count1++;
                
                else
                    count2++;
            }
            
            if(count1 &amp;gt;= citations[i] &amp;amp;&amp;amp; count2 &amp;lt;= citations[i])
                max = citations[i] &amp;gt; max ? citations[i] : max;
                
            count1 = 0; 
            count2 = 0; 
            
        }
        
        return max;
    }
}&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;뭐 때문에 틀렸는지 전혀 감이 오지 않아서 llm을 사용해서 내 코드에 대한 피드백을 받아봤다.&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;이 문제에서 h는 citations[i]이어야 한다는 말은 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 h가 citations[i]라고 보고 문제를 풀었다. h의 후보군을 citations 원소값으로 줄이니 오답이 나왔던 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;h는 범위가 딱히 정해져 있지 않으므로, h는 0부터 검사하면 된다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;코드 2 - 정답&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780920071461&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;

public class Solution {
    public int solution(int[] citations) 
    {
        int count1 = 0; 
        int count2 = 0; 
        int max = 0; 

        for(int h = 0; h &amp;lt;= citations.Length; h++)
        {
            for(int j = 0; j &amp;lt; citations.Length; j++)
            {
                if(citations[j] &amp;gt;= h)
                    count1++;
                
                if(citations[j] &amp;lt;= h)
                    count2++;
            }

            if(count1 &amp;gt;= h &amp;amp;&amp;amp; count2 &amp;lt;= h) 
            {
                max = h &amp;gt; max ? h : max;
            }

            count1 = 0; 
            count2 = 0; 
        }

        return max;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조, 코딩테스트</category>
      <category>C#</category>
      <category>코딩테스트</category>
      <author>RꞮbble</author>
      <guid isPermaLink="true">https://ribblestudy.tistory.com/115</guid>
      <comments>https://ribblestudy.tistory.com/115#entry115comment</comments>
      <pubDate>Mon, 8 Jun 2026 21:12:54 +0900</pubDate>
    </item>
    <item>
      <title>[개인 프로젝트] ProjectA - 이동 구현 설계</title>
      <link>https://ribblestudy.tistory.com/114</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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동 상태들을 여러 스크립트로 분리하고, 상태머신으로 각각의 상태들을 관리한다면, 추후 새로운 상태를 넣을 때 상태 스크립트를 작성하고 상태머신에 등록만 하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동은 상태패턴으로 구현하겠다.&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;b&gt;상태패턴&lt;/b&gt;으로 &lt;u&gt;상태 흐름을 관리&lt;/u&gt;하고, 실제 &lt;b&gt;기능 수행&lt;/b&gt;은 &lt;u&gt;기능 컴포넌트로&lt;/u&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인터페이스/클래스 구조&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGptyi/dJMcaip3x7s/iapXq1fwZ7RKkkRyQzQFD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGptyi/dJMcaip3x7s/iapXq1fwZ7RKkkRyQzQFD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGptyi/dJMcaip3x7s/iapXq1fwZ7RKkkRyQzQFD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGptyi%2FdJMcaip3x7s%2FiapXq1fwZ7RKkkRyQzQFD0%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;1780&quot; height=&quot;551&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;551&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인터페이스/클래스별 역할 정리&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;IState&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;/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;BaseState&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IState를 구현&lt;/li&gt;
&lt;li&gt;모든 상태가 가져야 할 기능 컴포넌트를 가진다.&amp;nbsp;&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;PlayerGroundState&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BaseState를 상속받는 클래스&amp;nbsp;&lt;/li&gt;
&lt;li&gt;땅에서 공통적으로 처리해야 하는 기능 컴포넌트를 가진다.&amp;nbsp;&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;PlayerAirState&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BaseState를 상속받는 클래스&amp;nbsp;&lt;/li&gt;
&lt;li&gt;공중에서 공통적으로 처리해야 하는 기능 컴포넌트를 가진다.&amp;nbsp;&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;PlayerIdleState, PlayerWalkState, PlayerRunState&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PlayerGroundState를 상속받는 클래스&lt;/li&gt;
&lt;li&gt;대기, 걷기, 뛰기 처리에 필요한 기능 컴포넌트를 가진다.&amp;nbsp;&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;PlayerJumpStartState, PlayerJumpLoopState, PlayerJumpLandState&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PlayerAirState를 상속받는 클래스&amp;nbsp;&lt;/li&gt;
&lt;li&gt;점프 시작/중/착지에 필요한 기능 컴포넌트를 가진다.&amp;nbsp;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기능 컴포넌트&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유지보수를 위해 &quot;이동하기&quot;, &quot;점프하기&quot;, &quot;애니메이션 재생하기&quot;와 같이 특정 기능을 수행하는 것을 클래스로 분리시켜 봤다.&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;PlayerMovement&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;플레이어 이동 = 대기, 걷기, 뛰기&amp;nbsp;&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;h4 data-ke-size=&quot;size20&quot;&gt;VerticalVelocity&lt;/h4&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;수직 이동 = 중력 이동, 점프 이동&amp;nbsp;&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;h4 data-ke-size=&quot;size20&quot;&gt;AnimationController&lt;/h4&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;애니메이션 처리 = 애니메이션 재생, 애니메이션 재생 완료 여부 판단&amp;nbsp;&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;h4 data-ke-size=&quot;size20&quot;&gt;InputReader&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;플레이어 입력 처리 클래스&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;플레이어 입력 = w, a, s, d, 마우스 좌클릭, 마우스 우클릭&amp;nbsp;&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;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;</description>
      <category>개인 프로젝트/ProjectA</category>
      <author>RꞮbble</author>
      <guid isPermaLink="true">https://ribblestudy.tistory.com/114</guid>
      <comments>https://ribblestudy.tistory.com/114#entry114comment</comments>
      <pubDate>Sun, 7 Jun 2026 23:28:30 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트] Programmers - 주식가격 (실패)</title>
      <link>https://ribblestudy.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42584?language=csharp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42584?language=csharp&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;프로그래머스&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42584?language=csharp&quot; data-og-image=&quot;https://blog.kakaocdn.net/dna/rZ9wd/dJMb85vWPkD/AAAAAAAAAAAAAAAAAAAAAP56WYjMOKXv8q3sPN6f9Rh7CRT-LdVxo4BVejI5XbvO/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1782831599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=6WoscFyPhLXJTxtjavhtObqRh0c%3D&quot; data-og-url=&quot;https://programmers.co.kr/&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42584?language=csharp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://blog.kakaocdn.net/dna/rZ9wd/dJMb85vWPkD/AAAAAAAAAAAAAAAAAAAAAP56WYjMOKXv8q3sPN6f9Rh7CRT-LdVxo4BVejI5XbvO/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1782831599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=6WoscFyPhLXJTxtjavhtObqRh0c%3D');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[문제]&lt;/b&gt; &lt;br /&gt;초 단위로 기록된 주식가격 배열 prices가 주어진다.&amp;nbsp; &lt;br /&gt;가격이 떨어지지 않은 기간은 몇 초인지 return 하라.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;문제는 무슨 말인지 알겠는데, 입출력 예시가 이해가 안 간다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[풀이]&lt;/b&gt; &lt;br /&gt;간단한 방법은 prices[i] 뒤에 있는 숫자가 prices [i]보다 작지 않은 경우를 헤아리기.&amp;nbsp; &lt;br /&gt;그 개수가 가격이 떨어지지 않은 시간이다.&amp;nbsp; &lt;br /&gt;이중 for문을 사용하니, O(N^2) = 100,000 제곱 = 10,000,000,000 == 100억 = 1초 넘어간다.&amp;nbsp; &lt;br /&gt;O(N^2) 풀이로 못 푼다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;문제 유형이 스택/큐다. 스택/큐 풀이를 생각해야 한다.&amp;nbsp;&lt;br /&gt;그런데 전혀 감이 안 온다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;다른 사람 코드&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;

public class Solution {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int[] solution(int[] prices) 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int[] answer = new int[prices.Length];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stack&amp;lt;int&amp;gt; stack = new Stack&amp;lt;int&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i = 0; i &amp;lt; prices.Length; i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 가격이 내려가면 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(stack.Count &amp;gt; 0 &amp;amp;&amp;amp; prices[stack.Peek()] &amp;gt; prices[i])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int index = stack.Pop();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer[index] =&amp;nbsp;&amp;nbsp;i - index;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stack.Push(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(stack.Count &amp;gt; 0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int index = stack.Pop();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;answer[index] = (prices.Length - 1) - index;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return answer;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;스택을 활용한 풀이다.&amp;nbsp;&lt;br /&gt;스택에 주식의 인덱스를 넣는다. 그러다가 주식 가격이 내려가는 순간, 스택에 있던 원소들을 꺼내면서, 꺼낸 주식의 가격이 현재 주식 가격보다 큰 경우, 가격이 떨어지지 않은 기간을 계산한다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;스택에 여전히 주식 가격 인덱스가 남아 있다는 건 해당 주식은 가격이 내려가지 않았다는 것이다.&amp;nbsp;&lt;br /&gt;그러니 이들은 자기들 기준으로 가격이 떨어지지 않는 기간을 계산해 주면 된다.&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;배운점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난 스택을 단순히 탑처럼 쌓고, 마지막 넣은 것부터 빼내는 자료구조로만 이해하고 있었다.&amp;nbsp;&lt;br /&gt;이 문제를 푸니, 스택은 단순 데이터를 넣고 빼는 자료구조가 아니라, Pop을 이용해서 이전 원소들을 비교할 수 있다는 것을 알게 된 것 같다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;해결해야 할 문제를 한 가지로 보지 않고, 쪼개서 보는 것 또한 중요한 것 같다. &lt;br /&gt;이 문제의 경우 주식 가격이 내려가는 순간의 주식의 시간을 계산하는 것, 주식 가격이 오르는 순간의 주식의 시간을 계산하는 것. 이렇게 두 가지로 문제를 나누었다. &lt;br /&gt;꼭 해결해야 할 문제를 한 가지로 볼 필요는 없다. 쪼갤 수 있다면 쪼개서 문제를 해결하는 것도 좋은 방법인 것 같다. &lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조, 코딩테스트/스택(Stack)</category>
      <category>C#</category>
      <category>코딩테스트</category>
      <author>RꞮbble</author>
      <guid isPermaLink="true">https://ribblestudy.tistory.com/113</guid>
      <comments>https://ribblestudy.tistory.com/113#entry113comment</comments>
      <pubDate>Sun, 7 Jun 2026 17:52:25 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 힙 삭제</title>
      <link>https://ribblestudy.tistory.com/112</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;힙 삭제&lt;/b&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;/li&gt;
&lt;li&gt;O(log N)&lt;/li&gt;
&lt;li&gt;최소 힙(Min Heap) 삭제, 최대 힙(Max Heap) 삭제가 있다.&amp;nbsp;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;최소 힙(Min Heap) 삭제&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;그래프가 최소 힙인지 아닌지 확인
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;완전 이진 트리인지 확인&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;각 노드의 값이 자식 노드의 값보다 작거나 같은지 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;힙의 가장 아래에 있는 리프 노드값을 루트 노드에 덮어씌운다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;힙 가장 아래에 있는 리프 노드값을 삭제한다.&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;수정된 루트 노드가 최소 힙 조건을 만족하는지 확인한다.&amp;nbsp;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;루트 노드가 최소 힙 조건을 만족하지 않으면, 자식 노드와 위치를 바꾼다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;바뀐 위치에서 최소 힙 조건을 만족하는지 확인한다.&amp;nbsp;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;바뀐 위치에서 최소 힙 조건을 만족하지 않으면, 자식 노드와 위치를 바꾼다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&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;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNaCmi/dJMcajoSePQ/mETTZSgvfp7iagY1kQ5Kt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNaCmi/dJMcajoSePQ/mETTZSgvfp7iagY1kQ5Kt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNaCmi/dJMcajoSePQ/mETTZSgvfp7iagY1kQ5Kt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNaCmi%2FdJMcajoSePQ%2FmETTZSgvfp7iagY1kQ5Kt0%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;259&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rckcf/dJMcaffQlvt/RwumAqMpawSx8gApkCQxTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rckcf/dJMcaffQlvt/RwumAqMpawSx8gApkCQxTk/img.png&quot; data-alt=&quot;루트노드 값을 10으로 덮어씌우기.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rckcf/dJMcaffQlvt/RwumAqMpawSx8gApkCQxTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frckcf%2FdJMcaffQlvt%2FRwumAqMpawSx8gApkCQxTk%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;454&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;루트노드 값을 10으로 덮어씌우기.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dg9TUU/dJMcag6PNfq/o3Te3tO22tDtKY8iWCmtLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dg9TUU/dJMcag6PNfq/o3Te3tO22tDtKY8iWCmtLK/img.png&quot; data-alt=&quot;리프 노드 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dg9TUU/dJMcag6PNfq/o3Te3tO22tDtKY8iWCmtLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdg9TUU%2FdJMcag6PNfq%2Fo3Te3tO22tDtKY8iWCmtLK%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;460&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;리프 노드 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EiIb3/dJMcaayOYtD/T4nvKpNWAy3NbVtbzQjQkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EiIb3/dJMcaayOYtD/T4nvKpNWAy3NbVtbzQjQkk/img.png&quot; data-alt=&quot;루트 노드 값과 자식 노드 값 바꾸기.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EiIb3/dJMcaayOYtD/T4nvKpNWAy3NbVtbzQjQkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEiIb3%2FdJMcaayOYtD%2FT4nvKpNWAy3NbVtbzQjQkk%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;480&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;루트 노드 값과 자식 노드 값 바꾸기.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEbvj/dJMb990ZvPL/5374IfdKojHUdfKGdFhGEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEbvj/dJMb990ZvPL/5374IfdKojHUdfKGdFhGEK/img.png&quot; data-alt=&quot;루트 노드 값과 자식 노드 값 바꾸기.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEbvj/dJMb990ZvPL/5374IfdKojHUdfKGdFhGEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEbvj%2FdJMb990ZvPL%2F5374IfdKojHUdfKGdFhGEK%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;282&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;루트 노드 값과 자식 노드 값 바꾸기.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;b&gt;최대 힙(Max Heap) 삭제&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&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;/li&gt;
&lt;li&gt;힙 가장 아래에 있는 리프 노드 값을 루트 노드에 덮어씌운다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;힙 가장 아래에 있는 리프 노드 값을 삭제한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;수정된 루트 노드가 최대 힙 조건을 만족하는지 확인한다.&amp;nbsp;
&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;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;/li&gt;
&lt;/ol&gt;
&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;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rVPJ4/dJMcaaFBX2s/JK13qbIYtCmW7CZhIpDFQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rVPJ4/dJMcaaFBX2s/JK13qbIYtCmW7CZhIpDFQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rVPJ4/dJMcaaFBX2s/JK13qbIYtCmW7CZhIpDFQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrVPJ4%2FdJMcaaFBX2s%2FJK13qbIYtCmW7CZhIpDFQK%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;291&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JwfXe/dJMcag6PNgl/3NoLDAthbxCMrZj1C87Tt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JwfXe/dJMcag6PNgl/3NoLDAthbxCMrZj1C87Tt0/img.png&quot; data-alt=&quot;루트노드 값을 4으로 덮어씌우기.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JwfXe/dJMcag6PNgl/3NoLDAthbxCMrZj1C87Tt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJwfXe%2FdJMcag6PNgl%2F3NoLDAthbxCMrZj1C87Tt0%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;295&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;루트노드 값을 4으로 덮어씌우기.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccGuRv/dJMcada8Hgy/g5wYhvfNlkYE0dsIZL5klK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccGuRv/dJMcada8Hgy/g5wYhvfNlkYE0dsIZL5klK/img.png&quot; data-alt=&quot;리프 노드 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccGuRv/dJMcada8Hgy/g5wYhvfNlkYE0dsIZL5klK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccGuRv%2FdJMcada8Hgy%2Fg5wYhvfNlkYE0dsIZL5klK%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;252&quot; data-origin-width=&quot;342&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;리프 노드 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cK3sfY/dJMcabdlr1U/TLdJIaHyidcxFLnpbZmGNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cK3sfY/dJMcabdlr1U/TLdJIaHyidcxFLnpbZmGNk/img.png&quot; data-alt=&quot;루트 노드 값과 자식 노드 값 바꾸기.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cK3sfY/dJMcabdlr1U/TLdJIaHyidcxFLnpbZmGNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcK3sfY%2FdJMcabdlr1U%2FTLdJIaHyidcxFLnpbZmGNk%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;234&quot; data-origin-width=&quot;386&quot; data-origin-height=&quot;301&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;루트 노드 값과 자식 노드 값 바꾸기.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조, 코딩테스트/힙(Heap)</category>
      <category>heap</category>
      <category>자료구조</category>
      <category>힙</category>
      <author>RꞮbble</author>
      <guid isPermaLink="true">https://ribblestudy.tistory.com/112</guid>
      <comments>https://ribblestudy.tistory.com/112#entry112comment</comments>
      <pubDate>Sun, 7 Jun 2026 12:18:22 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트] Programmers - 다리를 지나는 트럭 (실패)</title>
      <link>https://ribblestudy.tistory.com/111</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;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42583&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42583&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1780748409669&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;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42583&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nC6dv/dJMb8SpPKjR/RK8V4YXqOjO8F4HPbcgDi0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/crKP5L/dJMb9iIOACh/1rFjUBrsKtxvvQC8FArX2k/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42583&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42583&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nC6dv/dJMb8SpPKjR/RK8V4YXqOjO8F4HPbcgDi0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/crKP5L/dJMb9iIOACh/1rFjUBrsKtxvvQC8FArX2k/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 문제는 문제를 이해하는데 엄청 오래 걸렸다. 2시간 넘게 풀었지만 통과하지 못했다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;코드 1 - 오답&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780748045075&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class 다리를_지나는_트럭
{
    public int solution(int bridge_length, int weight, int[] truck_weights)  {
        int answer = 0;
        Queue&amp;lt;int&amp;gt; queue = new Queue&amp;lt;int&amp;gt;(bridge_length);
        
        for(int i = 0; i &amp;lt; truck_weights.Length; i++)
        {
            if(truck_weights[i] + queue.Sum() &amp;lt;= weight &amp;amp;&amp;amp; queue.Count &amp;lt; bridge_length) 
            {
                queue.Enqueue(truck_weights[i]);
                answer += (bridge_length); // 건너는 시간 
            }
            else
            {
                // answer += ((queue.Count * bridge_length) + queue.Count);
                // answer += ((queue.Count * 1) + queue.Count);
                // answer += ((queue.Count * 1) + 1);
                // answer += ((weight / queue.Count) + 1);
                queue.Clear();
                // answer += 1; // 지나는 시간 

                queue.Enqueue(truck_weights[i]);
                answer += (bridge_length); // 건너는 시간 
            }
        }
        
        // if(queue.Count &amp;gt; 0)
        //     answer += ((queue.Count * bridge_length) + queue.Count);
            // answer += ((queue.Count * 1) + queue.Count);
            // answer += ((queue.Count * 1) + 1);
            // answer += ((weight / queue.Count) + 1);
        
        return answer;
    }

    static void Main(string[] args)
    {
        다리를_지나는_트럭 p = new 다리를_지나는_트럭();

        int bridge_length = 100;
        int weight = 100;
        int[] truck_weights = {10,10,10,10,10,10,10,10,10,10};

        Console.WriteLine(p.solution(bridge_length, weight, truck_weights));
    }
}&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;&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;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;코드 2 - 정답&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780747955732&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Collections.Generic;
using System.Linq;

public class 다리를_지나는_트럭
{
    public int solution(int bridge_length, int weight, int[] truck_weights) 
    {
        int answer = 0;
        Queue&amp;lt;int&amp;gt; bridge = new Queue&amp;lt;int&amp;gt;();
        
        // 처음에는 다리 길이만큼 빈 공간(0)을 채워 넣습니다. (컨베이어 벨트 세팅)
        for (int i = 0; i &amp;lt; bridge_length; i++)
        {
            bridge.Enqueue(0);
        }
        
        int current_weight = 0; // 현재 다리 위의 총 무게를 실시간으로 추적
        int truck_idx = 0;      // 출발할 트럭의 인덱스
        
        // 모든 트럭이 다리를 통과할 때까지 반복
        while (truck_idx &amp;lt; truck_weights.Length)
        {
            answer++; // 1초가 흐릅니다.
            
            // 1. 다리의 맨 끝에서 트럭(또는 0)이 나갑니다.
            current_weight -= bridge.Dequeue();
            
            // 2. 새 트럭이 들어올 수 있는지 검사합니다.
            if (current_weight + truck_weights[truck_idx] &amp;lt;= weight)
            {
                // 들어올 수 있다면 트럭을 진입시키고, 무게를 더해줍니다.
                bridge.Enqueue(truck_weights[truck_idx]);
                current_weight += truck_weights[truck_idx];
                truck_idx++; // 다음 트럭을 대기시킵니다.
            }
            else
            {
                // 무게 초과로 못 들어온다면, 다리를 전진시키기 위해 빈 공간(0)을 넣습니다.
                bridge.Enqueue(0);
            }
        }
        
        // 마지막 트럭이 다리에 '진입'하면서 while문이 끝납니다. 
        // 그 마지막 트럭이 다리를 완전히 '통과'하는 데 걸리는 시간(다리 길이)을 더해줍니다.
        return answer + bridge_length;
    }
}&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;시간에 대한 정보가 없어서 어떻게 풀지도 잘 모르겠고 도저히 혼자서 못 풀 것 같아 llm에게 물어봤다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이가 bridge_length인 큐를 만들고, 이 큐에 트럭을 넣으면서 시간을 계산하는 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조, 코딩테스트/큐(Queue)</category>
      <category>C#</category>
      <category>코딩테스트</category>
      <author>RꞮbble</author>
      <guid isPermaLink="true">https://ribblestudy.tistory.com/111</guid>
      <comments>https://ribblestudy.tistory.com/111#entry111comment</comments>
      <pubDate>Sat, 6 Jun 2026 21:20:12 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 힙 삽입</title>
      <link>https://ribblestudy.tistory.com/110</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;우선순위 큐 구현에서 힙 자료구조의 시간복잡도가 O(log N)이므로, 힙으로 우선순위 큐를 구현해야 한다고 배웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열, 연결리스트에 삽입, 삭제, 탐색, 순회가 있듯 힙에도 삽입 기능이 있다.&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;b&gt;힙 삽입&lt;/b&gt;&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;/li&gt;
&lt;li&gt;O(log N)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;최소 힙(min heap) 삽입, 최대 힙(max heap) 삽입이 있다.&amp;nbsp;&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;b&gt;최소 힙(min heap) 삽입&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&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;/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;부모노드와 비교해서 최소 힙 조건을 만족하는지 확인&lt;/li&gt;
&lt;li&gt;최소 힙 조건을 만족하지 않으면 부모 노드와 스왑&amp;nbsp;&lt;/li&gt;
&lt;/ol&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJIG2f/dJMcafz6SXd/0Z1Z3rhKRWuOOCkKeHyjF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJIG2f/dJMcafz6SXd/0Z1Z3rhKRWuOOCkKeHyjF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJIG2f/dJMcafz6SXd/0Z1Z3rhKRWuOOCkKeHyjF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJIG2f%2FdJMcafz6SXd%2F0Z1Z3rhKRWuOOCkKeHyjF0%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;271&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;442&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;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;각 노드의 값은 자식 노드의 값보다 작거나 같아야 한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 노드는 자식 노드를 0 ~ 2개를 가지고, 3층 노드들은 왼쪽 노드부터 채워져 있으므로, 완전 이진 트리가 맞다.&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;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;p data-ke-size=&quot;size16&quot;&gt;5를 삽입해보자.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GOGry/dJMcajiaWDO/rsufY9NSYu23ES7uSXzTKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GOGry/dJMcajiaWDO/rsufY9NSYu23ES7uSXzTKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GOGry/dJMcajiaWDO/rsufY9NSYu23ES7uSXzTKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGOGry%2FdJMcajiaWDO%2FrsufY9NSYu23ES7uSXzTKK%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;244&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;완전 이진 트리를 만족해야 하므로, 5는 9의 왼쪽 자식 노드로 들어간다.&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;p data-ke-size=&quot;size16&quot;&gt;9는 5보다 크므로, 최소힙 조건을 만족하지 않는다.&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;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/barIRh/dJMcagTjXzJ/QG3Hre8KXY1vsjK1BaPbfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/barIRh/dJMcagTjXzJ/QG3Hre8KXY1vsjK1BaPbfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/barIRh/dJMcagTjXzJ/QG3Hre8KXY1vsjK1BaPbfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbarIRh%2FdJMcagTjXzJ%2FQG3Hre8KXY1vsjK1BaPbfK%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;257&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;425&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;3은 5보다 작으므로, 최소힙 조건을 만족한다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;최대 힙(max heap) 삽입&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&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;/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;부모노드와 비교해서 최대 힙 조건을 만족하는지 확인&lt;/li&gt;
&lt;li&gt;최대 힙 조건을 만족하지 않으면 부모 노드와 스왑&amp;nbsp;&lt;/li&gt;
&lt;/ol&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnHJIj/dJMcaaldSMv/BA5xy9fNg14ooYmkKA6xfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnHJIj/dJMcaaldSMv/BA5xy9fNg14ooYmkKA6xfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnHJIj/dJMcaaldSMv/BA5xy9fNg14ooYmkKA6xfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnHJIj%2FdJMcaaldSMv%2FBA5xy9fNg14ooYmkKA6xfk%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;256&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;416&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;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;/li&gt;
&lt;li&gt;각 노드의 값은 자식 노드의 값보다 크거나 같아야 한다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;각 노드는 자식 노드를 0 ~ 2개를 가지고, 3층 노드들은 왼쪽 노드부터 채워져 있으므로, 완전 이진 트리가 맞다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;각 노드의 값은 자식 노드의 값보다 큰 값을 가지므로, 최대 힙이 맞다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;15를 삽입해보자.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCjFRH/dJMcaiXPkEW/ZOCvKvIIoteoPM6EX3z3t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCjFRH/dJMcaiXPkEW/ZOCvKvIIoteoPM6EX3z3t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCjFRH/dJMcaiXPkEW/ZOCvKvIIoteoPM6EX3z3t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCjFRH%2FdJMcaiXPkEW%2FZOCvKvIIoteoPM6EX3z3t0%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;405&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;405&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;완전 이진 트리를 만족해야 하므로, 15는 5의 오른쪽 자식 노드로 들어간다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;최대 힙은 노드의 값이 자식 노드의 값보다 크거나 같아야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5는 15보다 작으므로, 최대힙 조건을 만족하지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 둘의 위치를 바꿔야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCTolK/dJMcaftjIrQ/OTgDCs1kpkmlaXQPiyafZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCTolK/dJMcaftjIrQ/OTgDCs1kpkmlaXQPiyafZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCTolK/dJMcaftjIrQ/OTgDCs1kpkmlaXQPiyafZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCTolK%2FdJMcaftjIrQ%2FOTgDCs1kpkmlaXQPiyafZk%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;257&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;411&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;10은 15보다 작으므로, 최대 힙 조건을 만족하지 않는다.&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;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcIiX5/dJMcagyY9KZ/tKeeQq435fjCM5vW92v4F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcIiX5/dJMcagyY9KZ/tKeeQq435fjCM5vW92v4F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcIiX5/dJMcagyY9KZ/tKeeQq435fjCM5vW92v4F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcIiX5%2FdJMcagyY9KZ%2FtKeeQq435fjCM5vW92v4F0%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;387&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;387&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조, 코딩테스트/힙(Heap)</category>
      <category>heap</category>
      <category>자료구조</category>
      <category>힙</category>
      <author>RꞮbble</author>
      <guid isPermaLink="true">https://ribblestudy.tistory.com/110</guid>
      <comments>https://ribblestudy.tistory.com/110#entry110comment</comments>
      <pubDate>Sat, 6 Jun 2026 15:39:03 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트] Programmers - 모의고사 (실패)</title>
      <link>https://ribblestudy.tistory.com/107</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;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42840&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42840&lt;/a&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;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제&lt;/b&gt; =&amp;nbsp;1번&amp;nbsp;~&amp;nbsp;마지막&amp;nbsp;문제까지&amp;nbsp;정답이&amp;nbsp;들은&amp;nbsp;배열&amp;nbsp;answer가&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;가장&amp;nbsp;많은&amp;nbsp;문제를&amp;nbsp;맞힌&amp;nbsp;사람을&amp;nbsp;배열에&amp;nbsp;담아&amp;nbsp;반환 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;b&gt;제한 조건&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;span style=&quot;letter-spacing: 0px;&quot;&gt;answer 배열 길이는 최대 10,000&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;문제 정답은 1 ~ 5 중 하나&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;가장 높은 점수 받은 사람이 여럿일 경우, return 값을 오름차순 정렬하기.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&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;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번&amp;nbsp;수포자&amp;nbsp;=&amp;nbsp;(1&amp;nbsp;2&amp;nbsp;3&amp;nbsp;4&amp;nbsp;5)&amp;nbsp;(1&amp;nbsp;2&amp;nbsp;3&amp;nbsp;4&amp;nbsp;5)&amp;nbsp;...&amp;nbsp;=&amp;nbsp;1&amp;nbsp;~&amp;nbsp;5번까지&amp;nbsp;순서대로&amp;nbsp;찍기. &lt;br /&gt;2번 수포자 = (2 1 2 3) (2 4 2 5) (2 1 2 3) (2 4 2 5) ... = (2 1 2 3), (2 4 2 5) ... 순서대로 찍기. &lt;br /&gt;3번 수포자 = (3 3) (1 1) (2 2) (4 4) (5 5) / (3 3) (1 1) (2 2) (4 4) (5 5) ... = (3 3) (1 1) (2 2) (4 4) (5 5) ... 순서대로 찍기.&amp;nbsp; &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;1~3번 수포자의 정답지를 배열에 저장하기. (arr1, arr2, arr3)&lt;/li&gt;
&lt;li&gt;answer배열에서 하나씩 읽으며 1~3번 정답지 배열과 비교하며 맞춘 횟수를 &lt;br /&gt;(int index, int count) answer1, (int index, int count) answer2, (int index, int count) answer3에 저장&lt;/li&gt;
&lt;li&gt;answer1 ~ answer3을 오름차순 정렬&lt;/li&gt;
&lt;li&gt;최댓값이 여러개이면 순서대로 answer배열에 넣기.&lt;/li&gt;
&lt;li&gt;최댓값이 하나이면 하나만 answer배열에 넣기.&lt;/li&gt;
&lt;li&gt;answer배열 출력&amp;nbsp;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;코드1 - 오답&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780574012286&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Linq;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int[] answers) 
    {
        int[] arr1 = {1, 2, 3, 4, 5};
        int index1 = 0; 
        int answer1 = 0; 
        
        int[] arr2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int index2 = 0; 
        int answer2 = 0; 
        
        int[] arr3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        int index3 = 0; 
        int answer3 = 0; 
        
        for(int i = 0; i &amp;lt; answers.Length; i++)
        {
            if(answers[i] == arr1[index1++])
            {
                answer1++;
                if(index1 &amp;gt;= arr1.Length)
                    index1 = 0; 
            }
            
            if(answers[i] == arr2[index2++])
            {
                answer2++;
                if(index2 &amp;gt;= arr2.Length)
                    index2 = 0; 
            }
            
            if(answers[i] == arr3[index3++])
            {
                answer3++;
                if(index3 &amp;gt;= arr3.Length)
                    index3 = 0; 
            }
        }
        
        (int index, int count) a1;
        a1.index = 1; 
        a1.count = answer1;
        
        (int index, int count) a2;
        a2.index = 2;
        a2.count = answer2;
        
        (int index, int count) a3;
        a3.index = 3;
        a3.count = answer3; 
        
        List&amp;lt;(int index, int count)&amp;gt; list = new List&amp;lt;(int index, int count)&amp;gt;();
        list.Add(a1);
        list.Add(a2);
        list.Add(a3); 
        
        int max = list.Max(x =&amp;gt; x.count); 
        
        return list.Where(a =&amp;gt; a.count == max).OrderBy(a =&amp;gt; a.index).Select(a =&amp;gt; a.index).ToArray();
    }
}&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;LINQ를 사용해서 풀어봤다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 범위에서 벗어나면 인덱스를 0으로 만들어주는 부분이 정답을 맞추었을 때만 처리가 된다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;코드2 - 정답&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780574215279&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System;
using System.Linq;
using System.Collections.Generic;

public class Solution {
    public int[] solution(int[] answers) 
    {
        int[] arr1 = {1, 2, 3, 4, 5};
        int index1 = 0; 
        int answer1 = 0; 
        
        int[] arr2 = {2, 1, 2, 3, 2, 4, 2, 5};
        int index2 = 0; 
        int answer2 = 0; 
        
        int[] arr3 = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        int index3 = 0; 
        int answer3 = 0; 
        
        for(int i = 0; i &amp;lt; answers.Length; i++)
        {
            if(answers[i] == arr1[index1++])
                answer1++;
            if(index1 &amp;gt;= arr1.Length)
                    index1 = 0; 
            
            if(answers[i] == arr2[index2++])
                answer2++;
            if(index2 &amp;gt;= arr2.Length)
                    index2 = 0; 
            
            if(answers[i] == arr3[index3++])
                answer3++;
            if(index3 &amp;gt;= arr3.Length)
                    index3 = 0; 
        }
        
        (int index, int count) a1;
        a1.index = 1; 
        a1.count = answer1;
        
        (int index, int count) a2;
        a2.index = 2;
        a2.count = answer2;
        
        (int index, int count) a3;
        a3.index = 3;
        a3.count = answer3; 
        
        List&amp;lt;(int index, int count)&amp;gt; list = new List&amp;lt;(int index, int count)&amp;gt;();
        list.Add(a1);
        list.Add(a2);
        list.Add(a3); 
        
        int max = list.Max(x =&amp;gt; x.count); 
        
        return list.Where(a =&amp;gt; a.count == max).OrderBy(a =&amp;gt; a.index).Select(a =&amp;gt; a.index).ToArray();
    }
}&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;</description>
      <category>자료구조, 코딩테스트/완전탐색(Exhaustive Search)</category>
      <category>C#</category>
      <category>코딩테스트</category>
      <author>RꞮbble</author>
      <guid isPermaLink="true">https://ribblestudy.tistory.com/107</guid>
      <comments>https://ribblestudy.tistory.com/107#entry107comment</comments>
      <pubDate>Thu, 4 Jun 2026 20:57:24 +0900</pubDate>
    </item>
    <item>
      <title>[자료구조] 힙(Heap)이란</title>
      <link>https://ribblestudy.tistory.com/106</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;&lt;b&gt;힙(Heap)&lt;/b&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;우선순위 큐(Priority Queue)&lt;/b&gt;&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;/li&gt;
&lt;li&gt;우선순위가 부여되며, 우선순위가 높은 요소가 먼저 처리된다.&amp;nbsp;&lt;/li&gt;
&lt;li&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;우선순위 큐 구현 방식&lt;/b&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;br /&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;배열 = 삽입, 삭제하고 옆에 있는 데이터들을 옮겨주는 연산 -&amp;gt; O(N)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;연결리스트 = 헤드 노드부터 삽입, 삭제할 위치까지 탐색하는 연산 -&amp;gt; O(N)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;삽입, 삭제 연산 -&amp;gt; O(log N)&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열과 연결리스트로 우선순위 큐를 구현하면 O(N)이 나올 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힙으로 우선순위 큐를 구현하면 O(log N)이 나온다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;힙(Heap)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이진 완전 트리(Complete Binary Tree)&lt;/li&gt;
&lt;li&gt;각 노드의 값은 자식 노드의 값보다 크지 않거나, 작지 않다.&amp;nbsp;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;힙 시간복잡도&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입 = O(log N)&lt;/li&gt;
&lt;li&gt;삭제 = O(log N)&lt;/li&gt;
&lt;li&gt;최대/최소값 찾기 = O(1)&amp;nbsp;&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;힙 종류&lt;/b&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;Max Heap&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;li&gt;루트 노드가 가장 큰 값을 가진다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPcbte/dJMcaip1Mdq/B8sMVUzPc2kdmuTB5gnjok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPcbte/dJMcaip1Mdq/B8sMVUzPc2kdmuTB5gnjok/img.png&quot; data-alt=&quot;Max Heap&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPcbte/dJMcaip1Mdq/B8sMVUzPc2kdmuTB5gnjok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPcbte%2FdJMcaip1Mdq%2FB8sMVUzPc2kdmuTB5gnjok%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;359&quot; height=&quot;1152&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;1152&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Max Heap&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;Min Heap&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;li&gt;루트 노드가 가장 작은 값을 가진다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbIz3L/dJMcajh9yvb/4kt07xAsSzV4v1EMISLgL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbIz3L/dJMcajh9yvb/4kt07xAsSzV4v1EMISLgL0/img.png&quot; data-alt=&quot;Min Heap&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbIz3L/dJMcajh9yvb/4kt07xAsSzV4v1EMISLgL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbIz3L%2FdJMcajh9yvb%2F4kt07xAsSzV4v1EMISLgL0%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;442&quot; height=&quot;286&quot; data-origin-width=&quot;442&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Min Heap&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>자료구조, 코딩테스트/힙(Heap)</category>
      <category>heap</category>
      <category>자료구조</category>
      <category>힙</category>
      <author>RꞮbble</author>
      <guid isPermaLink="true">https://ribblestudy.tistory.com/106</guid>
      <comments>https://ribblestudy.tistory.com/106#entry106comment</comments>
      <pubDate>Thu, 4 Jun 2026 19:52:46 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트] Programmers - 전화번호 목록 (실패)</title>
      <link>https://ribblestudy.tistory.com/105</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;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42577&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42577&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1780217816932&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;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42577&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/blbZPk/dJMb887fM9Y/uhtxWPGOkvf4rA66AeSO3k/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/cpATRc/dJMb85W0lBK/GS5GOi38vMwqKqyCSf82L1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42577&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42577&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/blbZPk/dJMb887fM9Y/uhtxWPGOkvf4rA66AeSO3k/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/cpATRc/dJMb85W0lBK/GS5GOi38vMwqKqyCSf82L1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이 1&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&amp;nbsp;=&amp;nbsp;한&amp;nbsp;번호가&amp;nbsp;다른&amp;nbsp;번호의&amp;nbsp;접두어인&amp;nbsp;경우가&amp;nbsp;있는지&amp;nbsp;확인&amp;nbsp; &lt;br /&gt;ex)&amp;nbsp; &lt;br /&gt;구조대&amp;nbsp;=&amp;nbsp;119 &lt;br /&gt;박준영&amp;nbsp;=&amp;nbsp;97&amp;nbsp;674&amp;nbsp;223 &lt;br /&gt;지영석&amp;nbsp;=&amp;nbsp;11&amp;nbsp;9552&amp;nbsp;4421 &lt;br /&gt;-&amp;gt;&amp;nbsp;구조대의&amp;nbsp;번호가&amp;nbsp;지영석의&amp;nbsp;번호의&amp;nbsp;접두사이다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;입력&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;전화번호&amp;nbsp;담은&amp;nbsp;배열&amp;nbsp;phone_book &lt;br /&gt;&lt;br /&gt;&lt;b&gt;출력&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;어떤&amp;nbsp;번호가&amp;nbsp;다른&amp;nbsp;번호의&amp;nbsp;접우어인&amp;nbsp;경우가&amp;nbsp;있다&amp;nbsp;=&amp;nbsp;false&amp;nbsp;반환 &lt;br /&gt;-&amp;nbsp;없다&amp;nbsp;=&amp;nbsp;true&amp;nbsp;반환 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;제한&amp;nbsp;사항&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;1&amp;nbsp;&amp;lt;=&amp;nbsp;phone_book&amp;nbsp;길이&amp;nbsp;&amp;lt;=&amp;nbsp;1,000,000 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;1&amp;nbsp;&amp;lt;=&amp;nbsp;전화번호&amp;nbsp;길이&amp;nbsp;&amp;lt;=&amp;nbsp;20 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;같은&amp;nbsp;전화번호&amp;nbsp;중복&amp;nbsp;없다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;풀이 1&lt;/b&gt;&lt;br /&gt;-&amp;nbsp;119가&amp;nbsp;다른&amp;nbsp;전화번호에&amp;nbsp;포함되어&amp;nbsp;있는지&amp;nbsp;확인하려면&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;다른&amp;nbsp;전화번호를&amp;nbsp;하나씩&amp;nbsp;탐색해서&amp;nbsp;그&amp;nbsp;번호에&amp;nbsp;119가&amp;nbsp;포함되어&amp;nbsp;있는지&amp;nbsp;확인하면&amp;nbsp;된다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;그걸&amp;nbsp;어떻게&amp;nbsp;구현할까인데 &lt;br /&gt;-&amp;nbsp;A번호에&amp;nbsp;B번호가&amp;nbsp;있는지&amp;nbsp;확인.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;가장&amp;nbsp;쉬운&amp;nbsp;방법은&amp;nbsp;이중&amp;nbsp;for문을&amp;nbsp;써서&amp;nbsp; &lt;br /&gt;i번째&amp;nbsp;번호가&amp;nbsp;i+1~n번째&amp;nbsp;번호에&amp;nbsp;포함되어&amp;nbsp;있는지&amp;nbsp;확인하는&amp;nbsp;방법&amp;nbsp; &lt;br /&gt;시간복잡도는&amp;nbsp;O(N^2)&amp;nbsp;=&amp;nbsp;O(100만&amp;nbsp;제곱)&amp;nbsp;=&amp;nbsp;1,000,000,000,000&amp;nbsp;=&amp;nbsp;1초&amp;nbsp;넘는다.&amp;nbsp; &lt;br /&gt;이중&amp;nbsp;for문&amp;nbsp;방법&amp;nbsp;사용하면&amp;nbsp;안 된다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;문제&amp;nbsp;유형이&amp;nbsp;해시이니&amp;nbsp;Dictionary로&amp;nbsp;풀어야&amp;nbsp;하는데. &lt;br /&gt;일단 phone_book 원소들을 딕셔너리에 다 넣어보자. 그리고.. 어떻게 풀지 전혀&amp;nbsp;모르겠다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;다른&amp;nbsp;사람&amp;nbsp;풀이를&amp;nbsp;보자.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이 2&amp;nbsp;&lt;/b&gt;&lt;/h3&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;❓크기 순서대로 정렬을 하더라도 i번째와 i+1번째, i번째와 i+2번째를 비교해야 할 텐데, 왜 인접한 원소끼리 비교해서 풀어도 될까?&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;배열을&amp;nbsp;사전순으로&amp;nbsp;정렬하면 &lt;br /&gt;A가&amp;nbsp;C의&amp;nbsp;접두어라면,&amp;nbsp;A바로&amp;nbsp;옆에&amp;nbsp;있는&amp;nbsp;B도&amp;nbsp;A를&amp;nbsp;접두어로&amp;nbsp;가진다.&amp;nbsp;따라서&amp;nbsp;A는&amp;nbsp;바로&amp;nbsp;옆에&amp;nbsp;있는&amp;nbsp;문자열과&amp;nbsp;비교해도&amp;nbsp;A가&amp;nbsp;누군가의&amp;nbsp;접두어가&amp;nbsp;되는&amp;nbsp;것을&amp;nbsp;검사할&amp;nbsp;수&amp;nbsp;있다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;코드 1 - 정답 (C#)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780218663289&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public bool solution(string[] phone_book)
{
    Array.Sort(phone_book); // 사전 순 정렬

    // 인접한 원소끼리 비교 
    for(int i = 0; i &amp;lt; phone_book.Length - 1; i++)
        // phone_book[i]가 phone_book[i+1]에 포함되어 있으면
        if(phone_book[i+1].StartsWith(phone_book[i])) 
            return false;

    // 여기까지 왔다는 건 한 번호가 다른 번호의 접두사인 경우가 없다는 것 
    return true; 
}&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;코드1 - 정답 (Java)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780218919888&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Arrays;

class Solution {
    public boolean solution(String[] phone_book) 
    {
        Arrays.sort(phone_book);
        
        for(int i = 0; i &amp;lt; phone_book.length - 1; i++)
            if(phone_book[i + 1].startsWith(phone_book[i]))
                return false;
        
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b28eRI/dJMcaccegd1/I33KMugdXuoFys1KfqgV71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b28eRI/dJMcaccegd1/I33KMugdXuoFys1KfqgV71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b28eRI/dJMcaccegd1/I33KMugdXuoFys1KfqgV71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb28eRI%2FdJMcaccegd1%2FI33KMugdXuoFys1KfqgV71%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;508&quot; height=&quot;165&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;165&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 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;&lt;b&gt;풀이 3&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해시 문제이니 딕셔너리로 풀 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리에 phone_book 문자열들을 넣고, 딕셔너리 키값을 하나씩 뽑아서 이 키값의 접두사를 전화번호로 하는 것이 딕셔너리에 있는지 확인하고 있으면 false를 없으면 true를 반환하면 된다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;코드 2 - 정답 (C#)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780221150441&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public bool solution2(string[] phone_book)
{
    // 딕셔너리 사용
    Dictionary&amp;lt;string, int&amp;gt; dict = new Dictionary&amp;lt;string, int&amp;gt;();

    // 딕셔너리에 phone_book 저장  
    foreach(string key in phone_book)
        dict[key] = 1;

    // phone_book[i]의 접두사를 번호로 하는 얘가 딕셔너리에 있는가 
    foreach(string key in phone_book)
        for(int i = 1; i &amp;lt; key.Length; i++)
            if(dict.ContainsKey(key.Substring(0, i)))
                return false;

    return true;
}&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;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;코드2 - 정답 (Java)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780221740566&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
    public boolean solution(String[] phone_book) 
    {
        HashMap&amp;lt;String, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
        for(int i = 0; i &amp;lt; phone_book.length; i++)
            map.put(phone_book[i], 1);
        
        for(int i = 0; i &amp;lt; phone_book.length; i++)
            for(int j = 1; j &amp;lt; phone_book[i].length(); j++)
                if(map.containsKey(phone_book[i].substring(0, j)))
                    return false;
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3UIA0/dJMcaarYJDc/XN7sYdJtm9ePdmbV4Qh1BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3UIA0/dJMcaarYJDc/XN7sYdJtm9ePdmbV4Qh1BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3UIA0/dJMcaarYJDc/XN7sYdJtm9ePdmbV4Qh1BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3UIA0%2FdJMcaarYJDc%2FXN7sYdJtm9ePdmbV4Qh1BK%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;450&quot; height=&quot;165&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;165&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 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;cf)&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=ggoKE9FQIEQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/nB91u/dJMb8SXERkq/kAHXT08mc48f5vVeBukRK1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/b3SMI0/dJMb8YXSFfG/rcYunmABfhAil0S7MMmly0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/Rwzyd/dJMb8Xkmqrf/BdHgXPSZ0ns32p61mBkkCk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;전화번호 목록 프로그래머스 java 자바 문제 풀이&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ggoKE9FQIEQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&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;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;복습 1 풀이 (6/7)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[문제]&lt;/b&gt; &lt;br /&gt;한&amp;nbsp;번호가&amp;nbsp;다른&amp;nbsp;번호의&amp;nbsp;접두어인&amp;nbsp;경우가&amp;nbsp;있는지&amp;nbsp;확인하기.&amp;nbsp; &lt;br /&gt;전화번호&amp;nbsp;담은&amp;nbsp;배열&amp;nbsp;phone_book이&amp;nbsp;주어진다.&amp;nbsp; &lt;br /&gt;어떤&amp;nbsp;번호가&amp;nbsp;다른&amp;nbsp;번호의&amp;nbsp;접두어가&amp;nbsp;있으면&amp;nbsp;false&amp;nbsp; &lt;br /&gt;어떤 번호가 다른 번호의 접두어가 없으면 true를 반환하라.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[제한&amp;nbsp;사항]&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;1&amp;nbsp;&amp;lt;=&amp;nbsp;phone_book&amp;nbsp;길이&amp;nbsp;&amp;lt;=&amp;nbsp;1,000,000 &lt;br /&gt;-&amp;nbsp;1&amp;nbsp;&amp;lt;=&amp;nbsp;전화번호&amp;nbsp;길이&amp;nbsp;&amp;lt;=&amp;nbsp;20&amp;nbsp; &lt;br /&gt;-&amp;nbsp;같은&amp;nbsp;전화번호는&amp;nbsp;중복&amp;nbsp;저장&amp;nbsp;X&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[풀이]&lt;/b&gt; &lt;br /&gt;당장&amp;nbsp;떠오르는&amp;nbsp;풀이는&amp;nbsp;phone_book[i]가&amp;nbsp;phone_book[i+1],&amp;nbsp;phone_book[i+2],&amp;nbsp;...&amp;nbsp;과&amp;nbsp;비교했을&amp;nbsp;때 &lt;br /&gt;접두어가&amp;nbsp;있는지&amp;nbsp;확인하기.&amp;nbsp; &lt;br /&gt;이중&amp;nbsp;for문&amp;nbsp;&amp;gt;&amp;nbsp;O(N^2) &lt;br /&gt;N은&amp;nbsp;최대&amp;nbsp;1,000,000.&amp;nbsp;&amp;gt;&amp;nbsp;O(100만&amp;nbsp;제곱)&amp;nbsp;=&amp;nbsp;1,000,000,000,000&amp;nbsp;=&amp;nbsp;1초&amp;nbsp;넘는다&amp;nbsp;&amp;gt;&amp;nbsp;시간&amp;nbsp;초과&amp;nbsp; &lt;br /&gt;&lt;br /&gt;다른&amp;nbsp;풀이&amp;nbsp;생각해야&amp;nbsp;한다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;방법1&lt;/b&gt; &lt;br /&gt;-&amp;nbsp;문자열&amp;nbsp;배열을&amp;nbsp;정렬한다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;문자열&amp;nbsp;배열을&amp;nbsp;정렬하면,&amp;nbsp;앞&amp;nbsp;문자가&amp;nbsp;작은&amp;nbsp;순서대로&amp;nbsp;정렬이&amp;nbsp;된다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;그러면&amp;nbsp;phone_book에서&amp;nbsp;바로&amp;nbsp;가까이&amp;nbsp;있는&amp;nbsp;문자열들은&amp;nbsp;접두어&amp;nbsp;관계에&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;뒤에&amp;nbsp;문자열들은&amp;nbsp;볼&amp;nbsp;필요가&amp;nbsp;없다.&amp;nbsp;이미&amp;nbsp;문자열&amp;nbsp;정렬이&amp;nbsp;되었으므로,&amp;nbsp;가까운&amp;nbsp;문자열끼리&amp;nbsp;비교하면&amp;nbsp;된다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;방법2&lt;/b&gt; &lt;br /&gt;해시&amp;nbsp;문제인&amp;nbsp;만큼&amp;nbsp;해시로&amp;nbsp;풀어보자.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;일단&amp;nbsp;phone_book&amp;nbsp;원소들을&amp;nbsp;딕셔너리(dict)에&amp;nbsp;넣자.&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;전화번호는&amp;nbsp;중복되지&amp;nbsp;않는다고&amp;nbsp;했으니,&amp;nbsp;value는&amp;nbsp;1로&amp;nbsp;넣으면&amp;nbsp;된다.&amp;nbsp; &lt;br /&gt;-&amp;nbsp;phone_book[i]를&amp;nbsp;하나씩&amp;nbsp;검사해서&amp;nbsp;phone_book[i]의&amp;nbsp;접두사가&amp;nbsp;전화번호인&amp;nbsp;것을&amp;nbsp;dict에서&amp;nbsp;찾으면&amp;nbsp;된다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;코드 1 - 정답&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780812487631&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public bool solution(string[] phone_book)
{
    Array.Sort(phone_book); 
    for(int i = 0; i &amp;lt; phone_book.Length - 1; i++)
    {
        // phone_book[i]가 phohe_book[i+1]에 포함되어 있는가? 
        if(phone_book[i+1].StartsWith(phone_book[i]))
            return false;
    }

    return true;
}&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;코드 2 - 정답&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1780812514411&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public bool solution(string[] phone_book)
{
    Dictionary&amp;lt;string, int&amp;gt; dict = new Dictionary&amp;lt;string, int&amp;gt;();
    foreach(string key in phone_book)
    {
        if(!dict.ContainsKey(key))
            dict.Add(key, 1);
    }

    foreach(string key in phone_book)
    {
        for(int i = 1; i &amp;lt; key.Length; i++)
        {
            if(dict.ContainsKey(key.Substring(0, i)))
            return false;
        }
    }
    return true;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>자료구조, 코딩테스트/해시(Hash)</category>
      <category>C#</category>
      <category>java</category>
      <category>코딩테스트</category>
      <author>RꞮbble</author>
      <guid isPermaLink="true">https://ribblestudy.tistory.com/105</guid>
      <comments>https://ribblestudy.tistory.com/105#entry105comment</comments>
      <pubDate>Sun, 31 May 2026 18:04:14 +0900</pubDate>
    </item>
  </channel>
</rss>