<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>군만두의 IT 개발 일지</title>
    <link>https://mandusitstudy.tistory.com/</link>
    <description>백엔드 개발을 학습하며 기록하는 공간입니다.
공부한 내용과 프로젝트 경험, 트러블슈팅 과정을 체계적으로 정리합니다.</description>
    <language>ko</language>
    <pubDate>Tue, 30 Jun 2026 06:58:43 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>mandus</managingEditor>
    <image>
      <title>군만두의 IT 개발 일지</title>
      <url>https://tistory1.daumcdn.net/tistory/5436082/attach/6df8194ffe4c427d92fca387fa01d6f2</url>
      <link>https://mandusitstudy.tistory.com</link>
    </image>
    <item>
      <title>[스터디14] 06. 소프트웨어 프로세스 모델 이해하기</title>
      <link>https://mandusitstudy.tistory.com/590</link>
      <description>&lt;div class=&quot;TOC-table&quot; style=&quot;border: 2px solid #fbb; font-weight: bold; padding: 10px; border-radius: 10px;&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://tistory2.daumcdn.net/tistory/5436082/skin/images/jquery.toc.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;font-weight: bold; color: #fff;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
	$(&quot;#toc&quot;).toc( {content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h1,h2,h3,h4&quot; , top: -90, isBlink : true, blinkColor : '#21B9DE' } ) });
&lt;/script&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;8장. 소프트웨어 프로세스 모델 이해하기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-1 소프트웨어 프로세스 모델이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 프로세스 모델(software process model)은 소프트웨어 개발의 전체 흐름과 생애 주기를 체계화한 모형이다. 적절한 모델을 적용하면 기존에 겪었던 문제를 반복하지 않고 프로젝트를 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;효율적이고 안정적으로 수행&lt;/span&gt;할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;소프트웨어 프로세스 모델의 필요성&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;체계적인 개발 절차&lt;/b&gt;: 개발 과정의 각 단계를 명확히 정의해 일관된 방식으로 업무를 수행하고, 개발자와 이해관계자 간 의사소통을 원활하게 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;효율적인 자원 관리&lt;/b&gt;: 시간과 비용을 효과적으로 분배 및 관리하고, 단계별 산출물을 문서화해 유지 보수를 원활하게 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;높은 수준의 위험 관리&lt;/b&gt;: 개발 초기부터 잠재적 위험 요인을 식별하고 대응하도록 유도하며, 특히 반복적이고 점진적인 모델이 위험 관리에 강점을 보인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;소프트웨어 프로세스 모델의 역사&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;1960년대 ~ 1990년대 중반&lt;/b&gt;: 소프트웨어를 한 번에 완벽하게 개발하는 데 중점을 둔다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1990년대 중반 이후&lt;/b&gt;: 객체 지향 프로그래밍의 부상과 함께 변화와 외부 상호 작용을 중시하는 방식이 주목받는다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;2000년대 이후&lt;/b&gt;: 소프트웨어 규모가 커지면서, 폭포수 모델과 반복적 모델이 Unified Process(UP)로 통합되는 흐름으로 발전한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-style=&quot;style3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.00%;&quot;&gt;&lt;b&gt;1960~2000년대&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50.00%;&quot;&gt;&lt;b&gt;2000년대~현재&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50.00%;&quot;&gt;폭포수 모델, V-모델, 증분형 모델, 진화형 모델, 애자일&lt;/td&gt;
&lt;td style=&quot;width: 50.00%;&quot;&gt;폭포수 모델 + 반복적 모델 &amp;rarr; Unified Process(UP)로 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 한 가지 모델만 적용해야 한다는 규칙은 없으며 소프트웨어의 형태, 규모, 기능에 따라 적절한 모델을 선택하는 것이 중요하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-2 단계별 진행과 문서화에 중점을 둔 폭포수 모델&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;선형적이고 순차적인 접근 방식인 폭포수 모델&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폭포수 모델(waterfall model)은 요구 사항 분석, 설계, 개발, 테스트, 유지 보수가 순차적으로 흐르는 선형적 접근 방식이다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;각 단계에서 이전 단계로 되돌아가기 어렵지만&lt;/span&gt;, 단계별 산출물이 명확해 일정 관리와 진행 파악이 쉽다.&lt;/p&gt;
&lt;table data-ke-style=&quot;style3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.00%;&quot;&gt;&lt;b&gt;단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;&lt;b&gt;산출물&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50.00%;&quot;&gt;&lt;b&gt;작성 내용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.00%;&quot;&gt;요구 사항 분석&lt;/td&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;요구 사항 정의서&lt;/td&gt;
&lt;td style=&quot;width: 50.00%;&quot;&gt;시스템의 기능적, 비기능적 요구 사항을 기술함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.00%;&quot;&gt;프로그램 설계&lt;/td&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;설계 사양서&lt;/td&gt;
&lt;td style=&quot;width: 50.00%;&quot;&gt;시스템 아키텍처와 데이터베이스 설계 문서를 만듦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.00%;&quot;&gt;개발&lt;/td&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;소스 코드(모듈별 코드)&lt;/td&gt;
&lt;td style=&quot;width: 50.00%;&quot;&gt;실제 프로그램을 구현하며, 프로그래밍 언어로 코드 파일을 작성함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.00%;&quot;&gt;테스트&lt;/td&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;테스트 결과서&lt;/td&gt;
&lt;td style=&quot;width: 50.00%;&quot;&gt;요구 사항 충족 여부 확인을 위해 입력, 예상 결과, 실제 결과 등을 기록함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;적용 분야&lt;/b&gt;: 요구 사항이 명확한 프로젝트에서 여전히 자주 사용한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단점&lt;/b&gt;: 요구 사항 변경에 대한 유연성이 부족하고, 오류와 버그가 주로 테스트 단계에서 발견된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보완 방법&lt;/b&gt;: 초기 요구 사항 분석 단계에서 고객과 긴밀하게 소통하고, 테스트 프로세스를 강화한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;테스트 프로세스를 강화한 V-모델&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;V-모델은 폭포수 모델을 확장해 테스트 프로세스를 강화한 모델이다. 개발 단계와 테스트 단계를 일대일로 대응시켜 V자 형태로 진행하며, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;오류를 조기에 발견할수록 일정과 비용을 효과적으로 단축&lt;/span&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;color: #f89009;&quot;&gt;&lt;b&gt;Verification(검증)&lt;/b&gt;&lt;/span&gt;: 개발 단계까지 각 산출물이 요구 사항을 충족하는지 검증한다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Validation(확인)&lt;/b&gt;&lt;/span&gt;: 완성된 프로그램이 실제 요구 사항에 맞게 동작하며 문제가 없는지 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-style=&quot;style3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.00%;&quot;&gt;&lt;b&gt;검증 세부 단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.00%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.00%;&quot;&gt;요구 사항 분석&lt;/td&gt;
&lt;td style=&quot;width: 75.00%;&quot;&gt;사용자의 니즈를 분석해 요구 사항을 도출하고, 기능적, 비기능적으로 구분해 체계적으로 정리함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.00%;&quot;&gt;시스템 설계&lt;/td&gt;
&lt;td style=&quot;width: 75.00%;&quot;&gt;요구 사항 문서를 검토해 필요한 기술을 파악하고, 구현 가능성을 판단함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.00%;&quot;&gt;아키텍처 설계&lt;/td&gt;
&lt;td style=&quot;width: 75.00%;&quot;&gt;고수준 설계. 모듈 간 인터페이스, 관계, 의존성을 기술하고, DB 테이블과 아키텍처 다이어그램, 통합 테스트 계획을 작성함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.00%;&quot;&gt;단위 설계&lt;/td&gt;
&lt;td style=&quot;width: 75.00%;&quot;&gt;저수준 설계. 모듈의 기능 로직을 의사 코드 수준으로 기술하고, 단위 테스트 계획을 수립함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table data-ke-style=&quot;style3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.00%;&quot;&gt;&lt;b&gt;확인 세부 단계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.00%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.00%;&quot;&gt;단위 테스트&lt;/td&gt;
&lt;td style=&quot;width: 75.00%;&quot;&gt;화이트박스 테스트로 로직을 검증함. 개별 함수, 메서드의 정확성과 효율성을 개발자가 직접 점검함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.00%;&quot;&gt;통합 테스트&lt;/td&gt;
&lt;td style=&quot;width: 75.00%;&quot;&gt;블랙박스 테스트로 동작의 결괏값을 검증함. 모듈을 통합해 컴포넌트 간 인터페이스, 상호 작용 오류를 검증함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.00%;&quot;&gt;시스템 테스트&lt;/td&gt;
&lt;td style=&quot;width: 75.00%;&quot;&gt;실제 시스템을 요구 사항과 비교해 검증함. 실사용 환경과 유사한 조건에서 성능 등 시스템 레벨의 오류를 발견함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25.00%;&quot;&gt;인수 테스트&lt;/td&gt;
&lt;td style=&quot;width: 75.00%;&quot;&gt;요구 사항 충족과 신뢰성 확보 여부를 평가함. 실제 배포, 사용 준비 완료 여부를 최종 확인함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;8-3 지속적 향상에 중점을 둔 반복적 모델&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복적 모델(iterative model)은 사용자의 요구 사항이나 제품의 일부를 단계에 따라 개발하고 반복해 개선하는 접근 방식이다. 크게 &lt;b&gt;증분형 모델&lt;/b&gt;과 &lt;b&gt;진화형 모델&lt;/b&gt;로 구분한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;전체를 모듈로 분해하고 점진적으로 개발하는 증분형 모델&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;증분형 모델(incremental model)은 전체 시스템을 여러 모듈로 분해하고, 각 모듈을 점진적으로 개발하는 방식이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;개발 방식&lt;/b&gt;: 분해한 모듈을 하나의 서브 시스템으로 먼저 구현해 릴리스한 후, 다음 서브 시스템을 순차로 개발한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;: &lt;span style=&quot;background-color: #f6e199;&quot;&gt;핵심 모듈을 우선 개발해 기능을 점차 확장&lt;/span&gt;해 나간다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;적용 원리&lt;/b&gt;: 하나의 증분 사이클이 폭포수 모델의 흐름을 따르므로, 폭포수 모델을 여러 번 적용한 결과를 순차로 조합해 최종 시스템을 완성한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장점&lt;/b&gt;: 프로젝트 관리자(PM)가 적절하게 관리하면, 각 서브 시스템을 독립적으로 병행해서 개발할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;프로토타입을 기반으로 발전시키는 진화형 모델&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;진화형 모델(evolutionary model)은 MVP(Minimum Viable Product)를 핵심 프로토타입으로 먼저 개발한 후, 운영 중 발생하는 요구 사항과 피드백을 반영해 시스템을 지속적으로 발전시키는 방식이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;적용 분야&lt;/b&gt;: &lt;span style=&quot;background-color: #f6e199;&quot;&gt;초기 요구 사항이 명확하지 않은 프로젝트에 적합&lt;/span&gt;하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주의점&lt;/b&gt;: 무분별하고 빈번한 릴리스는 버전 관리의 부담을 키우므로, 진화 과정의 전반적인 개요를 사전에 정리해 두어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table data-ke-style=&quot;style3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.00%;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.00%;&quot;&gt;&lt;b&gt;증분형 모델&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.00%;&quot;&gt;&lt;b&gt;진화형 모델&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.00%;&quot;&gt;개념&lt;/td&gt;
&lt;td style=&quot;width: 42.00%;&quot;&gt;하나의 증분은 폭포수 모델을 적용해 개발하며, 개발된 증분들을 결합해 최종 시스템을 완성함&lt;/td&gt;
&lt;td style=&quot;width: 42.00%;&quot;&gt;MVP를 초기 프로토타입으로 개발한 후, 운영을 시작하고 기능을 점차 발전시켜 최종 시스템을 완성함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.00%;&quot;&gt;특징&lt;/td&gt;
&lt;td style=&quot;width: 42.00%;&quot;&gt;초기 요구 사항이 명확한 경우에 적합하며, 각 증분을 병렬로 개발할 수 있음&lt;/td&gt;
&lt;td style=&quot;width: 42.00%;&quot;&gt;초기 요구 사항이 불명확한 경우에 적합함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.00%;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 42.00%;&quot;&gt;신규 도입 시 발생하는 충격을 완화하고, 후반 통합 시 발생하는 부담을 줄일 수 있음&lt;/td&gt;
&lt;td style=&quot;width: 42.00%;&quot;&gt;완성도를 점차 향상시킬 수 있고, 초기의 불완전한 요구 사항에 유연하게 대응할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.00%;&quot;&gt;단점&lt;/td&gt;
&lt;td style=&quot;width: 42.00%;&quot;&gt;여러 증분을 관리하는 부담이 있고, 요구 사항 변경에 효과적으로 대응하기 어려움&lt;/td&gt;
&lt;td style=&quot;width: 42.00%;&quot;&gt;빈번한 릴리스 시 버전 관리 부담이 커지고, 비용과 일정이 증가할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table data-ke-style=&quot;style3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.00%;&quot;&gt;&lt;b&gt;항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;&lt;b&gt;폭포수 모델&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;&lt;b&gt;반복적 모델&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.00%;&quot;&gt;개발 방식&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;순차적, 단계별로 진행&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;반복적, 점진적으로 개선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.00%;&quot;&gt;변경 대응&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;유연성이 낮고 변화하기 어려움&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;유연성이 높고 변경 사항을 쉽게 반영&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.00%;&quot;&gt;문서 중요도&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;각 단계별 산출물이 중요&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;비교적 덜 중요하며 프로토타입에 중점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.00%;&quot;&gt;고객 참여 시기&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;초기 요구 사항 전달 단계에서만 참여&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;지속적인 참여와 피드백 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.00%;&quot;&gt;요구 사항 명확성&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;초기 요구 사항이 명확해야 함&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;초기 요구 사항이 불완전해도 적용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 24.00%;&quot;&gt;프로젝트 규모&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;주로 소규모&lt;/td&gt;
&lt;td style=&quot;width: 38.00%;&quot;&gt;소규모에서 대규모까지 적용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-4 위험 최소화에 중점을 둔 나선형 모델&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나선형 모델(spiral model)은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;위험 분석 단계를 별도로 두어 위험 최소화를 중요한 요소로 고려&lt;/span&gt;하면서, 점차 완벽한 시스템을 구축해 나가는 방식이다. 다음 4단계를 반복하며 시스템을 완성한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;목표 설정&lt;/b&gt;: 고객의 요구 사항을 분석하고 타당성을 검토한 후, 해당 사이클의 목표를 새롭게 수립한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;위험 분석&lt;/b&gt;: 고객의 요구 사항을 기반으로 예상되는 위험 요소를 식별하고, 이를 초기에 최소화하는 해결 방안을 마련한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구현 및 테스트&lt;/b&gt;: 적합한 개발 모델을 선택해 진행하며, 단위 테스트 후 통합 테스트와 시스템 테스트를 순차로 진행한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고객 평가 및 다음 계획 수립&lt;/b&gt;: 고객 평가를 바탕으로 반복 여부를 결정하고, 인수 테스트로 시스템의 적합성을 최종 검토한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-5 신속한 개발 경험에 중점을 둔 애자일&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애자일(Agile)은 짧은 작업 주기와 반복적인 릴리스 사이클로, 고객의 요구 변화나 시스템 장애에 유연하고 신속하게 대응하는 개발 방법론이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;애자일 소프트웨어 개발 선언문&lt;/b&gt;&lt;br /&gt;공정과 도구보다 개인의 상호 작용을,&lt;br /&gt;포괄적인 문서보다 동작하는 소프트웨어를,&lt;br /&gt;계약 협상보다 고객과의 협력을,&lt;br /&gt;계획에 따르기보다 변화에 대응하기를&lt;br /&gt;가치 있게 여긴다.&lt;/blockquote&gt;
&lt;table data-ke-style=&quot;style3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;&lt;b&gt;구성 요소&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 72.00%;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;제품 백로그(product backlog)&lt;/td&gt;
&lt;td style=&quot;width: 72.00%;&quot;&gt;제품에 필요한 항목을 모두 나열한 목록. 한 번에 정해지는 것이 아니라 지속적으로 진화하는 산출물임&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;스프린트 백로그(sprint backlog)&lt;/td&gt;
&lt;td style=&quot;width: 72.00%;&quot;&gt;제품 백로그 중에서 이번 스프린트 주기 동안 개발할 항목을 뜻함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;스프린트(sprint)&lt;/td&gt;
&lt;td style=&quot;width: 72.00%;&quot;&gt;반복적인 짧은 개발 주기. 보통 2~4주로 설정하며, 정해진 기간 동안 계획한 작업을 완료하는 것을 목표로 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;일일 스크럼(daily scrum)&lt;/td&gt;
&lt;td style=&quot;width: 72.00%;&quot;&gt;매일 짧게 진행하는 회의로, 진행 상황, 어려움, 다음 단계 계획을 공유함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 28.00%;&quot;&gt;제품 개선 반영 부분&lt;/td&gt;
&lt;td style=&quot;width: 72.00%;&quot;&gt;스프린트 종료 시 결과물을 평가하고 배포 여부를 결정하며, 개선 사항을 반영하는 과정을 포함함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;애자일의 핵심 가치&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;협력&lt;/b&gt;: 통찰력과 아이디어를 공유해 시너지를 창출하고, 문제 발생 시 신속하게 해결하며 추가 문제점을 미리 발견하는 데 도움을 준다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;피드백&lt;/b&gt;: 개발자가 자신이 만든 기능을 스스로 확인하는 &lt;b&gt;내부 피드백&lt;/b&gt;과 고객, 사용자가 제품을 사용한 뒤 제공하는 &lt;b&gt;외부 피드백&lt;/b&gt;으로 나뉜다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;애자일 스프린트 5단계&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;분석&lt;/b&gt;: 사용자의 요구 사항을 분석하고, 스프린트 백로그에 포함할 항목을 선정한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;설계&lt;/b&gt;: 선정한 스프린트 백로그의 설계와 디자인을 추가하거나 수정한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개발&lt;/b&gt;: 프로그램 기능을 개발하고, 단위 테스트와 통합 테스트 코드를 작성하고 수행한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테스트&lt;/b&gt;: 테스트에서 발견한 오류를 수정하고, 이 스프린트에서 개발한 코드 품질을 검증한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;검토&lt;/b&gt;: 내부 피드백과 외부 피드백을 반영해 개선 사항을 정리하고, 이를 다음 스프린트에 적용한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;애자일의 장점과 한계&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애자일은 '먼저 만들어 보고 빠르게 수정한다'는 원칙에 따라 계획에 소요되는 시간을 최소화하고, 버그와 피드백을 신속하게 반영해 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;시장 출시 시간(Time to Market)을 단축&lt;/span&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;/li&gt;
&lt;li&gt;요구 사항의 방향성이 크게 변경되면 전체 모델이 무너질 위험이 있다.&lt;/li&gt;
&lt;li&gt;민첩하고 빠른 대응을 요구하다 보니 협업이 많아져, 개발자에게 심리적 부담과 스트레스로 다가올 수 있다.&lt;/li&gt;
&lt;li&gt;지속적인 변화에 적응하기 위해 새로운 기술을 끊임없이 학습해야 하는 부담이 존재할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;애자일을 적용한 다양한 개발 방식&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;스크럼(scrum)&lt;/b&gt;: 애자일 중 가장 대표적인 방식이다. 백로그와 스프린트를 핵심 구성 요소로 사용하며, 각 스프린트 종료 시점마다 목표에 맞는 기능이나 개선 사항을 반영한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;익스트림 프로그래밍(Extreme Programming, XP)&lt;/b&gt;: 요구 사항을 한 번에 수집하지 않고 반복 주기를 극히 짧게 운영하는 방식이다. 빠른 프로토타입 제작과 지속적인 수정, 변경, 배포가 특징이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;칸반(Kanban)&lt;/b&gt;: 엄밀히는 '시각적 작업 관리 도구'이지만 애자일의 한 형태로 본다. 작업을 카드 형태로 시각화해 진행 상황을 실시간으로 파악할 수 있으며, 지라(JIRA)와 같은 도구에서도 칸반 보드를 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;8-6 객체 지향 프로그램 표준, Unified Process&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통합 프로세스(Unified Process, UP)는 UML과 함께 OMG(Object Management Group)에서 공개한 통합 개발 프로세스로, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;객체 지향 프로그래밍의 실제 표준&lt;/span&gt;으로 간주된다. 통합 프로세스보다 줄임말인 UP를 자주 사용한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;UP의 특징&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;개발 방식&lt;/b&gt;: 반복적이며 점진적이고 진화적인 개발 방법론이며, 개발 사이클은 보통 3주 단위로 반복한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;위험 관리&lt;/b&gt;: 프로젝트 수행 과정에서 발생할 수 있는 위험 요소, 특히 아키텍처와 고객 요구 사항 측면의 위험을 우선적으로 식별하고 해결한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;아키텍처 확정&lt;/b&gt;: 주로 상세화(elaboration) 단계에서 위험을 해결하며, 이 단계가 끝나면 시스템의 아키텍처가 확정된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;여러 개발 방법론을 적용한 UP&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UP는 폭포수 모델, 반복적 모델 등 기존의 개발 방법론을 조합하여 통합적으로 적용하는 프로세스다.&lt;/p&gt;
&lt;table data-ke-style=&quot;style3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.00%;&quot;&gt;&lt;b&gt;적용 모델&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.00%;&quot;&gt;&lt;b&gt;UP에서의 역할&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.00%;&quot;&gt;폭포수 모델&lt;/td&gt;
&lt;td style=&quot;width: 68.00%;&quot;&gt;개념화 단계에서 목표&amp;middot;범위를 정의하고 초기 요구 사항을 수집함(폭포수의 요구 사항 정의 단계와 유사)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.00%;&quot;&gt;나선형 모델&lt;/td&gt;
&lt;td style=&quot;width: 68.00%;&quot;&gt;상세화 단계에서 아키텍처와 고객 요구 사항 관점의 위험을 조기에 발견하고 수정함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.00%;&quot;&gt;프로토타입 모델&lt;/td&gt;
&lt;td style=&quot;width: 68.00%;&quot;&gt;상세화가 완료되면 주요 기능을 정의하고, 프로토타입을 개발해 기능 검증을 담당함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 32.00%;&quot;&gt;반복적 모델(증분형, 진화형)&lt;/td&gt;
&lt;td style=&quot;width: 68.00%;&quot;&gt;반복적이고 점진적인 개발로 시스템을 구축함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;UP의 4단계&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;개념화(inception) 단계&lt;/b&gt;: 프로젝트의 초기 평가를 진행하고 시스템의 구성 환경을 파악한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상세화(elaboration) 단계&lt;/b&gt;: 시스템의 구조를 정의하고 고객의 요구 사항을 분석해 유스 케이스를 도출한다. 주요 위험 요소를 집중적으로 분석하고 이해관계자와 협업해 해결하는, UP에서 가장 핵심적인 단계다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구축(construction) 단계&lt;/b&gt;: 시스템을 배포할 수 있는 품질 수준에 도달할 때까지 개발과 테스트를 반복해서 수행한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;전이(transition) 단계&lt;/b&gt;: 구축한 시스템을 실제 운영 환경에 배포하고, 마지막으로 사용자 교육과 인수인계를 진행한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpNtlc/dJMcabksZAK/gDv8mz7DX5YtGUjo88KuV0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpNtlc/dJMcabksZAK/gDv8mz7DX5YtGUjo88KuV0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpNtlc/dJMcabksZAK/gDv8mz7DX5YtGUjo88KuV0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpNtlc%2FdJMcabksZAK%2FgDv8mz7DX5YtGUjo88KuV0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;410&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은&amp;nbsp;&lt;b&gt;『 Do it! 클린 프로그래밍 』&lt;/b&gt;&amp;nbsp;책의 8장을 학습한 내용을 정리한 것입니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>학습일지/Java</category>
      <category>클린프로그래밍</category>
      <author>mandus</author>
      <guid isPermaLink="true">https://mandusitstudy.tistory.com/590</guid>
      <comments>https://mandusitstudy.tistory.com/590#entry590comment</comments>
      <pubDate>Wed, 24 Jun 2026 22:12:40 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트] 약점 0개를 향한 7주, 코드트리 챌린지 완주 후기</title>
      <link>https://mandusitstudy.tistory.com/589</link>
      <description>&lt;div class=&quot;TOC-table&quot; style=&quot;border: 2px solid #fbb; font-weight: bold; padding: 10px; border-radius: 10px;&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://tistory2.daumcdn.net/tistory/5436082/skin/images/jquery.toc.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;font-weight: bold; color: #fff;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
	$(&quot;#toc&quot;).toc( {content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h1,h2,h3,h4&quot; , top: -90, isBlink : true, blinkColor : '#21B9DE' } ) });
&lt;/script&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 청약 통장 7주차 : 7주 만기 회고 &amp;amp; 스스로에게 보내는 축하&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1. 7회차 미션&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;미션&lt;/b&gt;: &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;7주 만기 회고 &amp;amp; 스스로에게 보내는 축하&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;두 달 동안 한 주도 빠짐없이 달려온 스스로를 돌아보고, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;그동안의 성장과 성과를 마음껏 자랑하는&lt;/span&gt; 회차다.&lt;/li&gt;
&lt;li&gt;회차별 글, Trail 학습 이력 등 7주의 궤적을 한눈에 정리하는 데 의미가 있는 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dB4hYU/dJMcagF0JFG/BK1lt1jZWR5fKoDIgoDld1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dB4hYU/dJMcagF0JFG/BK1lt1jZWR5fKoDIgoDld1/img.png&quot; data-alt=&quot;▲ 7회차 납입 가이드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dB4hYU/dJMcagF0JFG/BK1lt1jZWR5fKoDIgoDld1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdB4hYU%2FdJMcagF0JFG%2FBK1lt1jZWR5fKoDIgoDld1%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;538&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;663&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 7회차 납입 가이드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-2. 7주를 완주한 나에게&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;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;한 회차도 거르지 않고 만기에 도착&lt;/b&gt;&lt;/span&gt;했다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;매주 미션을 제출하려고 키보드 앞에 앉으려고 했던 습관&lt;/span&gt;이 나를 여기까지 데려왔다는 게 가장 실감 난다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nhm7C/dJMcajvUTxq/pvUNIxfykGzzt6qObPaQS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nhm7C/dJMcajvUTxq/pvUNIxfykGzzt6qObPaQS1/img.png&quot; data-alt=&quot;▲ 코드트리 청약 통장 납입 현황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nhm7C/dJMcajvUTxq/pvUNIxfykGzzt6qObPaQS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnhm7C%2FdJMcajvUTxq%2FpvUNIxfykGzzt6qObPaQS1%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;500&quot; height=&quot;572&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;621&quot; data-origin-height=&quot;711&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 코드트리 청약 통장 납입 현황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 가장 뿌듯했던 순간 : 우수 후기 선정과 그리디 완주&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;6회차에 쓴 글이 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;우수 학습 후기로 선정&lt;/b&gt;&lt;/span&gt;됐다. 솔직히 회차 미션을 채우려고 쓴 글이었는데, 누군가 읽고 의미 있다고 봐줬다는 게 생각보다 크게 뿌듯했다.&lt;/li&gt;
&lt;li&gt;이 우수 후기라는 결과 하나가 마지막 주차까지 끌고 가는 동기가 됐다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HtDJQ/dJMb99NxJZc/3C1CbT8PRBBGybokl1aODK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HtDJQ/dJMb99NxJZc/3C1CbT8PRBBGybokl1aODK/img.png&quot; data-alt=&quot;▲ 우수 학습 후기로 선정된 6회차 후기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HtDJQ/dJMb99NxJZc/3C1CbT8PRBBGybokl1aODK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHtDJQ%2FdJMb99NxJZc%2F3C1CbT8PRBBGybokl1aODK%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;551&quot; height=&quot;630&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 우수 학습 후기로 선정된 6회차 후기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실력 면에서 가장 달라진 건 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;그리디(Greedy)&lt;/b&gt;&lt;/span&gt;다. 5회차 갭체크에서 &quot;부족&quot;으로 내려갔던 영역인데, 이번에 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Lesson 1. Greedy Algorithm을 끝까지 풀어 진도율 100%&lt;/span&gt;를 채웠다.&lt;/li&gt;
&lt;li&gt;씨앗 아이콘이 새싹으로 바뀐 걸 보니 미루기만 하던 영역을 끝냈다는 게 눈으로 확인돼서 좋았다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsjhrh/dJMcajimXin/7ZpLJSYI19IcCPLV6xchek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsjhrh/dJMcajimXin/7ZpLJSYI19IcCPLV6xchek/img.png&quot; data-alt=&quot;▲ Greedy Algorithm 진도율 100%&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsjhrh/dJMcajimXin/7ZpLJSYI19IcCPLV6xchek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsjhrh%2FdJMcajimXin%2F7ZpLJSYI19IcCPLV6xchek%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;400&quot; height=&quot;623&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ Greedy Algorithm 진도율 100%&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그리디에서 가장 헤맨 건 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&quot;사각형 채우기 3&quot;&lt;/b&gt;&lt;/span&gt;이었다. 처음엔 눈앞에서 가장 큰 것부터 채우면 될 줄 알고 제출했다가 틀렸다.&lt;/li&gt;
&lt;li&gt;다시 보니 그리디는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&quot;지금의 최선&quot;이 &quot;전체의 최선&quot;이 되는 근거가 있어야 성립&lt;/span&gt;한다는 걸, 한 번 틀리고 나서야 체감했다. 같은 날 접근을 바꿔 통과시켰을 때가 7주 중 가장 기억에 남는다.&lt;/li&gt;
&lt;li&gt;제출 기록을 보면 &quot;동전 더하기&quot; 같은 기본 문제부터 &quot;소괄호 매칭 수 최대화하기&quot; 같은 Hard 난이도까지 통과시킨 흔적이 남아 있다. 틀렸다가 다시 맞힌 기록도 지우지 않았는데, 오히려 학습 과정처럼 느껴지는 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGdCqf/dJMcafNSINF/WzJfWiPaxI2Dzx5fOMWIN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGdCqf/dJMcafNSINF/WzJfWiPaxI2Dzx5fOMWIN1/img.png&quot; data-alt=&quot;▲ Easy 문제부터 Hard 문제까지 내 제출 기록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGdCqf/dJMcafNSINF/WzJfWiPaxI2Dzx5fOMWIN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGdCqf%2FdJMcafNSINF%2FWzJfWiPaxI2Dzx5fOMWIN1%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;750&quot; height=&quot;483&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ Easy 문제부터 Hard 문제까지 내 제출 기록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. &lt;span style=&quot;background-color: #fafafa; color: #2c2c2c; text-align: start;&quot;&gt;시작할 때와 비교해 달라진 점&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;청약 통장 챌린지처럼 매주 반복적으로 해야 하는 과제는 잊어버리기도 쉽고 막연하게 느껴졌는데, 그것을 끝까지 성공해냈다!&lt;/li&gt;
&lt;li&gt;만기를 기념해 갭체크를 다시 응시했다. 첫 갭체크에서 빨간색이던 영역이 어떻게 바뀌었는지, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;7주 간의 변화를 객관적인 그래프로 확인&lt;/span&gt;하고 싶었다.&lt;/li&gt;
&lt;li&gt;세 번의 갭체크를 한 표로 정리하니 약점이 한 칸씩 위로 올라가는 흐름이 한눈에 보였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;height: 121px;&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: left;&quot;&gt;&lt;b&gt;영역&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: left;&quot;&gt;&lt;b&gt;1차 (5/8)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: left;&quot;&gt;&lt;b&gt;2차 (6/7)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: left;&quot;&gt;&lt;b&gt;최종 (6/22)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;height: 16px; text-align: center;&quot;&gt;단순 반복문&lt;/td&gt;
&lt;td style=&quot;height: 16px; text-align: center;&quot;&gt;  불안&lt;/td&gt;
&lt;td style=&quot;height: 16px; text-align: center;&quot;&gt;  안정&lt;/td&gt;
&lt;td style=&quot;height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  안정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;Shortest Path&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;  부족&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;  해결&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  안정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;Greedy&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;  불안&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;  부족&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  안정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;DP I / Parametric Search&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;  불안&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  안정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;MST / String / Advanced DP&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;height: 21px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  해결&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빨간색과 노란색이 한 칸씩 위로 올라가더니, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;최종 갭체크에서는 약점 박스가 0개&lt;/b&gt;&lt;/span&gt;가 됐다.&lt;/li&gt;
&lt;li&gt;첫 글에서 세운 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&quot;부족한 지식 영역 0개&quot;&lt;/span&gt; 목표를 실제로 달성한 순간이라, 표를 보고 한참을 들여다봤다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwUCC4/dJMcagTvzrQ/ZjL7VHfMN4yf2GVViQ8NU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwUCC4/dJMcagTvzrQ/ZjL7VHfMN4yf2GVViQ8NU1/img.png&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;933&quot; data-is-animation=&quot;false&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.3604%; margin-right: 10px;&quot; data-widthpercent=&quot;49.94&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwUCC4/dJMcagTvzrQ/ZjL7VHfMN4yf2GVViQ8NU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwUCC4%2FdJMcagTvzrQ%2FZjL7VHfMN4yf2GVViQ8NU1%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;848&quot; height=&quot;933&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o38TR/dJMb99NxHJy/RCQanGJmUnlFpDW19WDBxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o38TR/dJMb99NxHJy/RCQanGJmUnlFpDW19WDBxK/img.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;933&quot; data-is-animation=&quot;false&quot; data-filename=&quot;blob&quot; style=&quot;width: 49.4768%;&quot; data-widthpercent=&quot;50.06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o38TR/dJMb99NxHJy/RCQanGJmUnlFpDW19WDBxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo38TR%2FdJMb99NxHJy%2FRCQanGJmUnlFpDW19WDBxK%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;850&quot; height=&quot;933&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;▲ 1차(5/8), 2차(6/7) 갭체크 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nt7vL/dJMcaf1jnaP/1Z6RrNshP8a0LHxDDkM6WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nt7vL/dJMcaf1jnaP/1Z6RrNshP8a0LHxDDkM6WK/img.png&quot; data-alt=&quot;▲ 최종(6/22) 갭체크 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nt7vL/dJMcaf1jnaP/1Z6RrNshP8a0LHxDDkM6WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnt7vL%2FdJMcaf1jnaP%2F1Z6RrNshP8a0LHxDDkM6WK%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;801&quot; height=&quot;324&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 최종(6/22) 갭체크 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 그만두고 싶던 고비와 비결&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;혼자 공부하는 건 쉽지 않았다. 솔직히 귀찮아서 &quot;이번 주는 그냥 넘길까&quot; 하고 미루고 싶은 마음이 매주 있었다.&lt;/li&gt;
&lt;li&gt;그 고비를 넘긴 첫 번째 비결은 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;경품 추첨권이라는 보상&lt;/b&gt;&lt;/span&gt;이었다. 매주 납입할수록 추첨권이 쌓이니, 미루다가도 결국 다시 문제를 풀게 됐다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;656&quot;&gt;&lt;a href=&quot;https://www.codetree.ai/ko/no-free-lunch-2026&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sz54s/dJMb991asI9/8XbMCPSdWnRKBrhFhK5bG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSz54s%2FdJMb991asI9%2F8XbMCPSdWnRKBrhFhK5bG0%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;700&quot; height=&quot;406&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;▲ 청약 통장 혜택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 번째 비결은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;함께 달리는 사람들&lt;/span&gt;이었다. 내가 추천인으로 등록한 사람, 그리고 나를 추천인으로 등록해 준 사람이 매주 꾸준히 인증하는 걸 보면서 동기부여를 받았다.&lt;/li&gt;
&lt;li&gt;혼자였다면 또 미뤘을 텐데, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;옆에서 누가 달리고 있다는 사실&lt;/b&gt;&lt;/span&gt;만으로도 멈추기 어려웠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llUq8/dJMcaalorZG/n4wEpskkJVXuaWtSJQAOc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llUq8/dJMcaalorZG/n4wEpskkJVXuaWtSJQAOc0/img.png&quot; data-alt=&quot;▲ 함께 달린 추천인들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llUq8/dJMcaalorZG/n4wEpskkJVXuaWtSJQAOc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllUq8%2FdJMcaalorZG%2Fn4wEpskkJVXuaWtSJQAOc0%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;500&quot; height=&quot;264&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 함께 달린 추천인들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사실 내가 추천인으로 등록한 지인이 나에게 &quot;같이 하자&quot;고 권한 게 시작이었다. 그렇다 보니 빠지면 안 된다는 책임감이 묘하게 생겼다. 덕분에 둘 다 끝까지 완주할 수 있었다. 혼자 하는 공부보다는 같이 하는 공부가 오히려 끝까지 하기 좋은 것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mEuNS/dJMcabECZj3/bkFOlR2ZkXPDmLpG5UKVNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mEuNS/dJMcabECZj3/bkFOlR2ZkXPDmLpG5UKVNK/img.png&quot; data-alt=&quot;▲ 코드트리 1회차에 대한 대화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mEuNS/dJMcabECZj3/bkFOlR2ZkXPDmLpG5UKVNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmEuNS%2FdJMcabECZj3%2FbkFOlR2ZkXPDmLpG5UKVNK%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;550&quot; height=&quot;297&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 코드트리 1회차에 대한 대화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 앞으로의 계획과 AI 시대의 알고리즘&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;6회 납입을 채우면 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;8월 31일까지 코드트리를 무료로 이용&lt;/b&gt;&lt;/span&gt;할 수 있다. 청약 통장 챌린지가 끝나도 그 기간 동안 손을 놓지 않을 생각이다.&lt;/li&gt;
&lt;li&gt;최종 갭체크에서 추천 범위(T6)까지는 안정권에 들었지만, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;나머지 트레일이 아직 파란색(미추천 범위)으로 남아 있다.&lt;/span&gt; 무료 이용 기간 동안 T6 이후의 심화 트레일과 아직 다 못 푼 챕터를 채워볼 계획이다.&lt;/li&gt;
&lt;li&gt;특히 Parametric Search와 MST는 갭체크에서 &quot;해결&quot;로 확인됐지만 아직 익숙하다고 말하긴 이르다. &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;다익스트라를 발판 삼아 그래프 심화를 더 단단히&lt;/b&gt;&lt;/span&gt; 다지려 한다.&lt;/li&gt;
&lt;li&gt;요즘은 AI가 코드를 거의 다 써 준다. 하지만 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;그 코드가 맞는지, 어디서 느려지는지 검토하는 건 결국 사람&lt;/b&gt;&lt;/span&gt;이다. 알고리즘을 모르면 AI의 답을 검증할 수 없다. 특히 백엔드는 같은 기능도 쿼리 한 줄, 자료구조 하나로 응답 속도가 갈린다. AI가 짠 코드가 O(N&amp;sup2;)인지 O(N log N)인지 판단하려면 결국 내가 알아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 마무리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;7주 전의 나는 실력을 &quot;평균 정도&quot;라고 막연히 생각했지만, 지금은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;내 강점과 약점을 표로 설명할 수 있는&lt;/span&gt; 사람이 되었다.&lt;/li&gt;
&lt;li&gt;어려워하던 다익스트라를 잡았고, 미루기만 하던 그리디까지 끝냈다. 그리고 첫 글에서 빨갛던 약점들이 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;최종 갭체크에선 모두 사라졌다.&lt;/b&gt;&lt;/span&gt; 약점을 하나씩 초록색으로 칠해온 7주였다고 생각한다.&lt;/li&gt;
&lt;li&gt;혼자였다면 중간에 멈췄을 수도 있는데, 청약 통장 덕분에 약점을 직시하고 끝까지 넘을 수 있었다. 두 달간 운영해 주신 운영진분들께 감사드린다.&lt;/li&gt;
&lt;li&gt;완주했다고 끝이 아니라, 계속 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;새로운 출발점&lt;/span&gt;에 서야 한다. 이 습관 그대로 다음 목표를 향해 계속 달릴 생각이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/gap-check/onboarding&quot;&gt;코드트리 갭체크 응시하러 가기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/&quot;&gt;코드트리 바로가기&lt;/a&gt;&lt;/p&gt;</description>
      <category>코딩테스트/코드트리</category>
      <category>공채합격</category>
      <category>완주후기</category>
      <category>코드트리</category>
      <category>코드트리청약통장</category>
      <category>코딩테스트</category>
      <category>코딩테스트사이트추천</category>
      <category>코테공부</category>
      <category>코테준비</category>
      <author>mandus</author>
      <guid isPermaLink="true">https://mandusitstudy.tistory.com/589</guid>
      <comments>https://mandusitstudy.tistory.com/589#entry589comment</comments>
      <pubDate>Mon, 22 Jun 2026 14:35:57 +0900</pubDate>
    </item>
    <item>
      <title>[코드트리] 동적계획법(DP) 쉽게 이해하기 (점화식부터 구현까지 총정리)</title>
      <link>https://mandusitstudy.tistory.com/587</link>
      <description>&lt;div class=&quot;TOC-table&quot; style=&quot;border: 2px solid #fbb; font-weight: bold; padding: 10px; border-radius: 10px;&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://tistory2.daumcdn.net/tistory/5436082/skin/images/jquery.toc.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;font-weight: bold; color: #fff;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
	$(&quot;#toc&quot;).toc( {content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h1,h2,h3,h4&quot; , top: -90, isBlink : true, blinkColor : '#21B9DE' } ) });
&lt;/script&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 청약 통장 6회차 : 나만의 알고리즘 개념서 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1. 6회차 미션&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;미션&lt;/b&gt;: &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;나만의 방식으로 알고리즘 개념 설명하기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;가장 자신 있거나 좋아하는 유형을 하나 골라, 다른 사람에게 설명하는 나만의 개념서를 작성한다.&lt;/li&gt;
&lt;li&gt;쉬운 설명 + 코드트리 문제 풀이 과정 + 자주 하는 실수/꿀팁을 함께 담는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKyLPb/dJMcaaZWpCP/gdbC3sdB28EJ31Oyvi8KJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKyLPb/dJMcaaZWpCP/gdbC3sdB28EJ31Oyvi8KJ0/img.png&quot; data-alt=&quot;▲ 코드트리 - 6회차 납입 가이드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKyLPb/dJMcaaZWpCP/gdbC3sdB28EJ31Oyvi8KJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKyLPb%2FdJMcaaZWpCP%2FgdbC3sdB28EJ31Oyvi8KJ0%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;473&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 코드트리 - 6회차 납입 가이드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-2. 주제 선정 이유&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;DP는 여러 문제에서 자주 만나본 유형이고, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;점화식을 세워 푸는 과정 자체가 재밌어서&lt;/b&gt;&lt;/span&gt; 골랐다.&lt;/li&gt;
&lt;li&gt;다만 최근 갭체크에서는 DP가 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;  불안정한 지식&lt;/span&gt;으로 분류되어, 좋아하는 것과 별개로 손에 완전히 익지는 않은 상태였다.&lt;/li&gt;
&lt;li&gt;이번 개념서를 쓰며 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;점화식 감각을 확실히 다지기로&lt;/b&gt;&lt;/span&gt; 했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 동적계획법(DP)이란&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. 개념 정의&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;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;동적계획법(Dynamic Programming)&lt;/b&gt;&lt;/span&gt; : 큰 문제를 같은 모양의 더 작은 문제로 쪼개 먼저 풀고, 그 결과를 모아 큰 문제를 해결하는 기법&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;점화식(recurrence)&lt;/b&gt;&lt;/span&gt; : 작은 문제의 답으로 큰 문제의 답을 표현한 식&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;초기조건(base case)&lt;/b&gt;&lt;/span&gt; : 더 쪼갤 수 없는 가장 작은 문제의 정답&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k643W/dJMcad3n8X6/WNzgApHsMTPmKVrdN0O6e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k643W/dJMcad3n8X6/WNzgApHsMTPmKVrdN0O6e1/img.png&quot; data-alt=&quot;▲ 코드트리 - 동적계획법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k643W/dJMcad3n8X6/WNzgApHsMTPmKVrdN0O6e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk643W%2FdJMcad3n8X6%2FWNzgApHsMTPmKVrdN0O6e1%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;602&quot; height=&quot;468&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 코드트리 - 동적계획법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-2. 점화식&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;span style=&quot;background-color: #f6e199;&quot;&gt;1부터 N까지의 곱&lt;/span&gt;을 예시로 든다. F(N)을 1부터 N까지의 곱이라 정의하면 식은 다음과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;- &lt;b&gt;F(N) = F(N-1) &amp;times; N&lt;/b&gt; (N &amp;gt; 1) : 점화식&lt;br /&gt;- &lt;b&gt;F(1) = 1&lt;/b&gt; : 초기조건&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;큰 문제 F(5)는 F(4)를, F(4)는 F(3)을... 이런 식으로 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;한 칸씩 작은 문제로 내려가다&lt;/b&gt;&lt;/span&gt; 초기조건 F(1)=1에서 멈춘다.&lt;/li&gt;
&lt;li&gt;거꾸로 F(1)부터 답을 모아 올라오면 F(5) = 1&amp;times;2&amp;times;3&amp;times;4&amp;times;5 = 120이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MqvyI/dJMcacKhLPu/H8IjyOaPjNsv7SKhssPhj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MqvyI/dJMcacKhLPu/H8IjyOaPjNsv7SKhssPhj0/img.png&quot; data-alt=&quot;▲ 점화식 개념도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MqvyI/dJMcacKhLPu/H8IjyOaPjNsv7SKhssPhj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMqvyI%2FdJMcacKhLPu%2FH8IjyOaPjNsv7SKhssPhj0%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;602&quot; height=&quot;212&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 점화식 개념도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Bottom-up vs Top-down&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 점화식이라도 코드로 옮기는 방법은 크게 두 가지로 나뉜다. 방향만 반대일 뿐 동일하다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. Bottom-up : 반복문으로 표 채우기&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;초기조건 F[1]을 먼저 채워두고, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;작은 인덱스부터 큰 인덱스로&lt;/span&gt; 표를 채워 나가는 방식이다.&lt;/li&gt;
&lt;li&gt;F[i]를 구할 때 F[i-1]이 이미 채워져 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;F = [0] * (n + 1)            # 결과를 저장할 표
F[1] = 1                     # 초기조건 먼저 채우기
for i in range(2, n + 1):    # 작은 값부터 차례대로
    F[i] = F[i - 1] * i      # 점화식을 그대로 옮김
print(F[n])                  # 큰 문제의 답&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCYnJx/dJMcac4vX6H/4uy0CixQabGJaiCArkhdW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCYnJx/dJMcac4vX6H/4uy0CixQabGJaiCArkhdW0/img.png&quot; data-alt=&quot;▲ Bottom-up 표 채우기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCYnJx/dJMcac4vX6H/4uy0CixQabGJaiCArkhdW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCYnJx%2FdJMcac4vX6H%2F4uy0CixQabGJaiCArkhdW0%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;603&quot; height=&quot;241&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ Bottom-up 표 채우기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-2. Top-down : 재귀와 메모이제이션&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;span style=&quot;background-color: #f6e199;&quot;&gt;작은 문제를 다시 호출&lt;/span&gt;하며 내려가는 방식이다.&lt;/li&gt;
&lt;li&gt;종료조건 자리에 초기조건을 넣고, 나머지는 점화식을 그대로 적으면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def f(n):
    if n == 1:          # 종료조건 = 초기조건
        return 1
    return f(n - 1) * n  # 점화식&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그런데 재귀를 그대로 쓰면 함정이 있다. 피보나치처럼 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;같은 작은 문제가 여러 번 호출&lt;/b&gt;&lt;/span&gt;되면 계산이 기하급수적으로 늘어난다.&lt;/li&gt;
&lt;li&gt;이때 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;한 번 구한 답을 배열에 저장(메모이제이션)&lt;/span&gt;해 두면, 같은 호출은 즉시 재사용해 중복을 없앤다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWpYXn/dJMcag6U6ZP/ZEvsqeeDXdkqxLJFraA5uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWpYXn/dJMcag6U6ZP/ZEvsqeeDXdkqxLJFraA5uK/img.png&quot; data-alt=&quot;▲ 재귀 호출 트리와 메모이제이션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWpYXn/dJMcag6U6ZP/ZEvsqeeDXdkqxLJFraA5uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWpYXn%2FdJMcag6U6ZP%2FZEvsqeeDXdkqxLJFraA5uK%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;602&quot; height=&quot;277&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 재귀 호출 트리와 메모이제이션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-3. 두 방식 비교&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 18%; background-color: #f6e199;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41%; background-color: #f6e199;&quot;&gt;&lt;b&gt;Bottom-up (반복문)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 41%; background-color: #f6e199;&quot;&gt;&lt;b&gt;Top-down (재귀 + 메모)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;방향&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;작은 문제 &amp;rarr; 큰 문제&lt;/td&gt;
&lt;td&gt;큰 문제 &amp;rarr; 작은 문제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;구현&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;for / while 반복문&lt;/td&gt;
&lt;td&gt;재귀 호출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;스택 오버플로 걱정이 없고 빠르다&lt;/td&gt;
&lt;td&gt;점화식과 코드가 1:1로 닮아 직관적이다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;주의&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;채우는 순서를 직접 설계해야 한다&lt;/td&gt;
&lt;td&gt;메모이제이션이 없으면 시간 초과가 난다&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 코드트리 문제에 적용하기 : 사각형 채우기 3&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1895&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cov8hS/dJMcah5TqD6/U53AGsFKF6rvC3YqTTb3Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cov8hS/dJMcah5TqD6/U53AGsFKF6rvC3YqTTb3Zk/img.png&quot; data-alt=&quot;▲ 코드트리 - 사각형 채우기 3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cov8hS/dJMcah5TqD6/U53AGsFKF6rvC3YqTTb3Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcov8hS%2FdJMcah5TqD6%2FU53AGsFKF6rvC3YqTTb3Zk%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;751&quot; height=&quot;296&quot; data-origin-width=&quot;1895&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 코드트리 - 사각형 채우기 3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-1. 문제 이해&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;문제&lt;/b&gt; : 2&amp;times;N 사각형을 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;1&amp;times;2, 2&amp;times;1, 1&amp;times;1 타일&lt;/span&gt;로 빈틈없이 채우는 방법의 수를 구한다.&lt;/li&gt;
&lt;li&gt;예제 : N=1 &amp;rarr; 2가지, N=2 &amp;rarr; 7가지, N=3 &amp;rarr; 22가지.&lt;/li&gt;
&lt;li&gt;작은 N의 답으로 큰 N의 답을 만드는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;전형적인 DP 문제&lt;/b&gt;&lt;/span&gt;다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-2. 점화식 세우기&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;dp[n]을 &quot;2&amp;times;n 사각형을 채우는 방법의 수&quot;로 정의하면, 점화식은 다음과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;- &lt;b&gt;dp[n] = 3 &amp;times; dp[n-1] + dp[n-2] - dp[n-3]&lt;/b&gt; (n &amp;ge; 3) : 점화식&lt;br /&gt;- &lt;b&gt;dp[0] = 1, dp[1] = 2, dp[2] = 7&lt;/b&gt; : 초기조건&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제대로 세웠는지 작은 N으로 검증한다. dp[3] = 3&amp;times;7 + 2 - 1 = &lt;span style=&quot;background-color: #f6e199;&quot;&gt;22&lt;/span&gt;로 예제와 일치한다.&lt;/li&gt;
&lt;li&gt;한 칸 더 확인하면 dp[4] = 3&amp;times;22 + 7 - 2 = 71이다.&lt;/li&gt;
&lt;li&gt;정확한 유도는 각 열에서 다음 열로 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;'튀어나온 칸'의 상태&lt;/b&gt;&lt;/span&gt;까지 추적해야 하지만, 이렇게 작은 N으로 식이 맞는지 검증하는 게 가장 빠르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-3. 의사코드&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. dp[0]=1, dp[1]=2, dp[2]=7로 초기화한다.&lt;br /&gt;2. i를 3부터 N까지 키우며 dp[i] = 3&amp;times;dp[i-1] + dp[i-2] - dp[i-3]을 채운다.&lt;br /&gt;3. dp[N]을 출력한다.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-4. 구현 코드 (Java)&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
 
        long MOD = 1_000_000_007; 
        
        // dp[i] = 2&amp;times;i 사각형을 채우는 방법의 수
        long[] dp = new long[Math.max(n + 1, 3)];
        dp[0] = 1;   // 빈 사각형: 1가지
        dp[1] = 2;
        dp[2] = 7;
 
        for (int i = 3; i &amp;lt;= n; i++) {
            dp[i] = (3 * dp[i - 1] + dp[i - 2] - dp[i - 3]) % MOD;

            if (dp[i] &amp;lt; 0) {
                dp[i] += MOD;
            }
        }
 
        System.out.println(dp[n]);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 문제는 Bottom-up으로 풀었다.&lt;/li&gt;
&lt;li&gt;N이 커지면 경우의 수가 빠르게 늘어나므로, 자바에서는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;결과 자료형을 long으로&lt;/span&gt; 두는 게 안전하다. (파이썬은 큰 수를 자동 처리한다.)&lt;/li&gt;
&lt;li&gt;뺄셈 때문에 음수가 나올 수 있으니 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;dp[i] = ((식) % MOD + MOD) % MOD&lt;/b&gt;&lt;/span&gt; 형태로 보정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/ko/trails/complete/dashboard&quot;&gt;코드트리 트레일 둘러보러 가기&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 자주 하는 실수&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;초기조건을 빠뜨린다&lt;/b&gt;&lt;/span&gt;. 점화식만 적고 base case를 안 넣으면 재귀가 끝나지 않거나 표가 비어버린다. 점화식보다 초기조건을 먼저 적는 습관이 안전하다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;점화식의 방향을 헷갈린다&lt;/b&gt;&lt;/span&gt;. F[i]가 F[i-1]에 의존하면, 반복문은 반드시 작은 i부터 채워야 한다. 순서가 꼬이면 아직 비어 있는 칸을 참조하게 된다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;재귀에 메모이제이션을 안 붙인다&lt;/b&gt;&lt;/span&gt;. 점화식이 맞아도 중복 호출 때문에 시간 초과가 난다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;재귀 DP에는 메모 배열이 필수&lt;/span&gt;다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;배열 인덱스 범위를 놓친다&lt;/b&gt;&lt;/span&gt;. 크기를 n+1로 잡고 1번 인덱스부터 쓰면 off-by-one 실수를 줄일 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;나만의 DP 풀이 순서&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;- 1단계: 상태(무엇을 dp[i]로 둘지)를 한 문장으로 정의한다.&lt;br /&gt;- 2단계: dp[i]를 더 작은 항으로 표현하는 점화식을 세운다.&lt;br /&gt;- 3단계: 초기조건을 정한다.&lt;br /&gt;- 4단계: 반복문 또는 재귀+메모 중 편한 쪽으로 옮긴다.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 마무리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예전에는 DP를 보면 점화식을 어떻게 세울지 막막했는데, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;상태 정의 &amp;rarr; 점화식 &amp;rarr; 초기조건&lt;/b&gt;&lt;/span&gt;이라는 순서를 정해두니 편했다.&lt;/li&gt;
&lt;li&gt;특히 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Bottom-up과 Top-down이 결국 같은 점화식의 방향만 다른 것&lt;/span&gt;이라는 점을 그림으로 그려보고 나서 머릿속에서 두 방식이 정리되었다.&lt;/li&gt;
&lt;li&gt;갭체크에서 불안정하게 떴던 DP를 직접 설명해보니, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;남에게 설명할 수 있을 때 비로소 내 것이 된다&lt;/b&gt;&lt;/span&gt;는 걸 다시 느꼈다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>코딩테스트/코드트리</category>
      <category>dp</category>
      <category>동적계획법</category>
      <category>코드트리</category>
      <category>코딩테스트</category>
      <category>코테공부</category>
      <author>mandus</author>
      <guid isPermaLink="true">https://mandusitstudy.tistory.com/587</guid>
      <comments>https://mandusitstudy.tistory.com/587#entry587comment</comments>
      <pubDate>Mon, 15 Jun 2026 09:29:06 +0900</pubDate>
    </item>
    <item>
      <title>[코테 중간 점검] 코드트리 갭체크로 한 달 만에 약점 유형 극복 후기</title>
      <link>https://mandusitstudy.tistory.com/585</link>
      <description>&lt;div class=&quot;TOC-table&quot; style=&quot;border: 2px solid #fbb; font-weight: bold; padding: 10px; border-radius: 10px;&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://tistory2.daumcdn.net/tistory/5436082/skin/images/jquery.toc.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;font-weight: bold; color: #fff;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
	$(&quot;#toc&quot;).toc( {content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h1,h2,h3,h4&quot; , top: -90, isBlink : true, blinkColor : '#21B9DE' } ) });
&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 청약 통장 5회차 : 한 달 간의 변화 &amp;amp; 중간 회고&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1. 5회차 미션&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;미션&lt;/b&gt;: 중간 점검! &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;갭체크 응시하고 4주 간의 성장 돌아보기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;첫 갭체크 후 세웠던 목표를 향해 꾸준히 나아가고 있는지, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;방향이 맞는지&lt;/span&gt;를 스스로 점검하는 회차다.&lt;/li&gt;
&lt;li&gt;진단 그래프의 색이 실제로 어떻게 바뀌었는지 객관적으로 확인하는 데 의미가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-2. 첫 갭체크 결과 (5/8)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yfQ1y/dJMcagyZC7q/mQDA7zkwLCGmDyARKkvZFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yfQ1y/dJMcagyZC7q/mQDA7zkwLCGmDyARKkvZFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yfQ1y/dJMcagyZC7q/mQDA7zkwLCGmDyARKkvZFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyfQ1y%2FdJMcagyZC7q%2FmQDA7zkwLCGmDyARKkvZFk%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;550&quot; height=&quot;419&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  불안정한 지식&lt;/b&gt;&lt;/span&gt; : 단순 반복문, Greedy&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  부족한 지식&lt;/b&gt;&lt;/span&gt; : Shortest Path (다익스트라)&lt;/li&gt;
&lt;li&gt;출력과 조건문은 안정적이었지만, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;단순 반복문과 BFS는 시간 안에 풀지 못했고 다익스트라는 아예 건너뛴 상태&lt;/span&gt;였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 갭체크는 아래 이미지 또는 본문 하단 링크를 통해 누구나 무료로 응시할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;892&quot;&gt;&lt;a href=&quot;https://www.codetree.ai/gap-check/onboarding&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TdgI0/dJMcah5NFlk/LPkPshBLAm6J3AJpkTGxO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTdgI0%2FdJMcah5NFlk%2FLPkPshBLAm6J3AJpkTGxO0%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;751&quot; height=&quot;365&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 지난 한 달 동안 한 일들&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. 1~2주차 : 단순 반복문과 중첩 루프&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;span style=&quot;background-color: #f6e199;&quot;&gt;진단 직후 추천받은 챕터부터 복습&lt;/span&gt;하며 기초를 다시 잡았다.&lt;/li&gt;
&lt;li&gt;특히 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;중첩 반복문, 반복 종료 조건, 제어 변수 변경&lt;/b&gt;&lt;/span&gt; 세 가지를 의식하며 문제를 풀었다.&lt;/li&gt;
&lt;li&gt;반복 단위를 손으로 표에 그려보는 습관을 들이니 인덱스 실수가 눈에 띄게 줄었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-2. 3~4주차 : Greedy와 BFS / 그래프 탐색&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;Greedy는 &quot;왜 이 선택이 최적인가&quot;를 설명할 수 있을 때만 통과한다는 걸 알았지만, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;감각을 잡는 것은 어려웠다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;BFS는 큐, 방문 체크, 레벨 단위 탐색이라는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;세 가지 뼈대&lt;/b&gt;&lt;/span&gt;를 먼저 외운 뒤 문제에 적용했다.&lt;/li&gt;
&lt;li&gt;그래프 탐색 자체에 익숙해지다 보니, 부족 영역이던 다익스트라까지 손이 닿게 된 것은 예상 밖의 수확이었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 두 번째 갭체크 결과&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCPyji/dJMcageIhZj/ID79aqreW21fbjrYB8UqyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCPyji/dJMcageIhZj/ID79aqreW21fbjrYB8UqyK/img.png&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;434&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.1525%; margin-right: 10px;&quot; data-widthpercent=&quot;49.73&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCPyji/dJMcageIhZj/ID79aqreW21fbjrYB8UqyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCPyji%2FdJMcageIhZj%2FID79aqreW21fbjrYB8UqyK%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;695&quot; height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BrSEk/dJMcah5NGcs/nDCbkB1ghOfa6tkxE4i1Fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BrSEk/dJMcah5NGcs/nDCbkB1ghOfa6tkxE4i1Fk/img.png&quot; data-origin-width=&quot;709&quot; data-origin-height=&quot;438&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.6847%;&quot; data-widthpercent=&quot;50.27&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BrSEk/dJMcah5NGcs/nDCbkB1ghOfa6tkxE4i1Fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBrSEk%2FdJMcah5NGcs%2FnDCbkB1ghOfa6tkxE4i1Fk%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;709&quot; height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난&amp;nbsp;갭체크에서&amp;nbsp;나온&amp;nbsp;결과를&amp;nbsp;가지고&amp;nbsp;학습&amp;nbsp;목표를&amp;nbsp;설정해&amp;nbsp;현재&amp;nbsp;상태가&amp;nbsp;어떻게&amp;nbsp;변화했는지&amp;nbsp;점검했다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. 두 번째 갭체크 (6/7)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;741&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NuljT/dJMcacQSTQM/BqDkFMiUrsUmVL68bQexlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NuljT/dJMcacQSTQM/BqDkFMiUrsUmVL68bQexlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NuljT/dJMcacQSTQM/BqDkFMiUrsUmVL68bQexlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNuljT%2FdJMcacQSTQM%2FBqDkFMiUrsUmVL68bQexlK%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;552&quot; height=&quot;394&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;741&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  불안정한 지식&lt;/b&gt;&lt;/span&gt; : DP I, Shorten Time Technique, Parametric Search&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  부족한 지식&lt;/b&gt;&lt;/span&gt; : Greedy&lt;/li&gt;
&lt;li&gt;해결한 문제 레벨이 전반적으로 올라가면서, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;기존 약점은 사라지고 더 고난도 개념이 새 약점으로 등장&lt;/span&gt;했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-2. 갭체크 결과 비교&lt;/b&gt;&lt;/h3&gt;
&lt;table data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;영역&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;첫 갭체크 (5/8)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;두 번째 갭체크 (6/7)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;출력 / 조건문&lt;/td&gt;
&lt;td&gt;  안정&lt;/td&gt;
&lt;td&gt;  안정 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;단순 반복문&lt;/td&gt;
&lt;td&gt;  불안정&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  안정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BFS / 완전탐색 / 백트래킹&lt;/td&gt;
&lt;td&gt;미해결&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  안정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shortest Path (다익스트라)&lt;/td&gt;
&lt;td&gt;  부족&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  해결&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Greedy&lt;/td&gt;
&lt;td&gt;  불안정&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  부족&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DP I / Shorten Time / Parametric Search&lt;/td&gt;
&lt;td&gt;미확인&lt;/td&gt;
&lt;td&gt;  불안정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 의외였던 건 &lt;b&gt;가장 걱정했던 다익스트라가 오히려 약점에서 빠졌다는 점&lt;/b&gt;이다. 그래프 탐색을 다지는 과정에서 자연스럽게 따라온 것 같다. 반대로 &lt;b&gt;Greedy는 &quot;불안정&quot;에서 &quot;부족&quot;으로 내려갔다.&lt;/b&gt; 손이 잘 안 가던 영역이라, 솔직히 변명의 여지가 없었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 남은 4주 학습 목표&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;1순위&lt;/b&gt; : &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Greedy&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;2순위&lt;/b&gt; : &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;DP I, Shorten Time Technique, Parametric Search&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;3순위&lt;/b&gt; : 종합 문제 풀이 + &lt;span style=&quot;background-color: #f6e199;&quot;&gt;시간 제한 안에서 푸는 연습&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;한 달 회고 한 줄&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;- 무서워하던 다익스트라는 잡았고, 만만하게 본 그리디에 발목 잡혔다.&lt;br /&gt;- 약점이 바뀐다는 건 실력이 한 칸 올라갔다는 뜻이라 믿는다.&lt;br /&gt;- 다음 회차엔 그리디까지 초록색으로 칠하고 돌아오겠다.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 마무리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다익스트라는 어렵게 느꼈지만 막상 해보니 풀렸고, Greedy가 오히려 힘들었다.&lt;/li&gt;
&lt;li&gt;혼자였다면 그리디를 또 미뤘을 텐데, 청약 통장 덕분에 약점을 직시할 수 있었다.&lt;/li&gt;
&lt;li&gt;그리디를 제대로 끝내고 코딩테스트 고난도 문제를 시간 안에 풀 수 있는 수준으로 가는 것이 목표다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/gap-check/onboarding&quot;&gt;코드트리 갭체크 응시하러 가기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/gap-check/history/11086/recommendation&quot;&gt;추천받았던 챕터 복습하러 가기&lt;/a&gt;&lt;/p&gt;</description>
      <category>코딩테스트/코드트리</category>
      <category>개발자취업</category>
      <category>갭체크</category>
      <category>코드트리</category>
      <category>코딩테스트</category>
      <category>코딩테스트준비</category>
      <category>코테공부</category>
      <author>mandus</author>
      <guid isPermaLink="true">https://mandusitstudy.tistory.com/585</guid>
      <comments>https://mandusitstudy.tistory.com/585#entry585comment</comments>
      <pubDate>Sun, 7 Jun 2026 22:51:22 +0900</pubDate>
    </item>
    <item>
      <title>[코드트리 후기] 북마크로 만든 나만의 복습 루틴</title>
      <link>https://mandusitstudy.tistory.com/583</link>
      <description>&lt;div class=&quot;TOC-table&quot; style=&quot;border: 2px solid #fbb; font-weight: bold; padding: 10px; border-radius: 10px;&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://tistory2.daumcdn.net/tistory/5436082/skin/images/jquery.toc.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;font-weight: bold; color: #fff;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
	$(&quot;#toc&quot;).toc( {content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h1,h2,h3,h4&quot; , top: -90, isBlink : true, blinkColor : '#21B9DE' } ) });
&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 청약 통장 4회차 : 북마크로 만드는 나만의 오답노트&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드트리에 다시 보고 싶은 문제를 모아두는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;북마크 기능&lt;/b&gt;&lt;/span&gt;이 있다는 걸 이번 미션을 통해 알게 됐다.&lt;/li&gt;
&lt;li&gt;그동안은 &quot;다음에 또 풀어야지&quot; 하고 머리로만 기억하다 흐지부지됐는데, 폴더로 묶어두니 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;복습할 내용이 눈에 보이는 목록으로 정리&lt;/span&gt;됐다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uvPvo/dJMcagyS69W/w4v7YtnbO6ggH4ZK04noGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uvPvo/dJMcagyS69W/w4v7YtnbO6ggH4ZK04noGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uvPvo/dJMcagyS69W/w4v7YtnbO6ggH4ZK04noGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuvPvo%2FdJMcagyS69W%2Fw4v7YtnbO6ggH4ZK04noGk%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;550&quot; height=&quot;654&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 나만의 북마크 폴더 기준&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;폴더를 막 만들면 결국 어지러워질 게 뻔해서, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&quot;북마크한 이유&quot;를 기준&lt;/b&gt;&lt;/span&gt;으로 폴더를 나눴다.&lt;/li&gt;
&lt;li&gt;단순히 유형별(그리디, 그래프)로만 묶지 않고, 갭체크 진단 등급을 그대로 가져와서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&quot;얼마나 급한가&quot;를 폴더 이름에 녹였다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n4sdX/dJMcabEmkTw/mdOlDd1Xz43MIXqsZ7Kzq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n4sdX/dJMcabEmkTw/mdOlDd1Xz43MIXqsZ7Kzq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n4sdX/dJMcabEmkTw/mdOlDd1Xz43MIXqsZ7Kzq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn4sdX%2FdJMcabEmkTw%2FmdOlDd1Xz43MIXqsZ7Kzq0%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;222&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;나만의 폴더 네이밍 규칙&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;- &lt;b&gt;[1순위] 부족 - 다익스트라&lt;/b&gt;: 갭체크 빨간색 영역, 기초 원리부터 다시&lt;br /&gt;- &lt;b&gt;[2순위] 불안정 - 그리디&lt;/b&gt;: 감은 있는데 손이 헷갈리는 영역&lt;br /&gt;- &lt;b&gt;[복습완료] 한 번 더&lt;/b&gt;: 풀긴 했지만 시간이 오래 걸려 확인이 필요한 문제&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;폴더 이름에 우선순위 숫자를 붙였다.&lt;/b&gt; 목록을 열었을 때 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;폴더 중에서 무엇부터 손대야 할지 바로 알 수 있다&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;완료&quot; 폴더를 따로 두었다.&lt;/b&gt; 다시 풀어서 막힘없이 통과한 문제는 완료 폴더로 옮겼다. 약점 폴더가 비어가는 게 눈에 보여서 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;동기부여가 되었다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3H1NJ/dJMcagZV9cM/sXIYEKl2fh9NQsuVuUUUYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3H1NJ/dJMcagZV9cM/sXIYEKl2fh9NQsuVuUUUYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3H1NJ/dJMcagZV9cM/sXIYEKl2fh9NQsuVuUUUYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3H1NJ%2FdJMcagZV9cM%2FsXIYEKl2fh9NQsuVuUUUYk%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;400&quot; height=&quot;326&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 북마크한 문제 다시 풀어보기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 북마크한 대표적인 문제는 체크에서 진단받은 약점 두 가지였다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; data-ke-style=&quot;style3&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;최대 수 만들기&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;간선 없애기&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;유형&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;그리디 (Greedy)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;다익스트라 (Dijkstra)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;난이도&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;70XP&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;90XP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;평균 풀이 시간&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;16분&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;180분&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;정답률&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;63%&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;71%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;갭체크 약점 등급&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;불안정&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;부족&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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-1. 최대 수 만들기 (그리디)&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;span style=&quot;background-color: #f6e199;&quot;&gt;가장 큰 수&lt;/span&gt;를 구하는 문제다. 예제는 43, 37, 4를 4 &amp;rarr; 43 &amp;rarr; 37 순으로 붙여 44337을 만든다.&lt;/li&gt;
&lt;li&gt;처음 풀 때 나는 별 생각 없이 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;숫자를 내림차순으로 정렬&lt;/b&gt;&lt;/span&gt;했다. 그러면 43, 37, 4가 되어 43374가 나온다. 그런데 정답인 44337보다 작다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&quot;큰 수가 앞&quot;이 아니라 &quot;붙였을 때 더 큰 쪽이 앞&quot;&lt;/span&gt;이라는 점이었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;정렬 기준&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;- 두 수 a, b를 비교할 때 단순 크기가 아니라 &lt;b&gt;이어 붙인 문자열&lt;/b&gt;로 비교한다.&lt;br /&gt;- (a + b) 와 (b + a) 를 만들어서, 더 큰 쪽이 만들어지는 순서를 앞에 둔다.&lt;br /&gt;- 예: 9 와 30 &amp;rarr; &quot;930&quot; vs &quot;309&quot; &amp;rarr; 930이 크므로 9가 앞이다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1779998589503&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());
        String[] nums = new String[N];
        
        for (int i = 0; i &amp;lt; N; i++) {
            nums[i] = br.readLine();
        }
        
        Arrays.sort(nums, (a, b) -&amp;gt; (b + a).compareTo(a + b));
        
        if (nums[0].equals(&quot;0&quot;)) {
            System.out.println(&quot;0&quot;);
            return;
        }
        
        StringBuilder sb = new StringBuilder();
        for (String num : nums) {
            sb.append(num);
        }
        
        System.out.println(sb.toString());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-2. 간선 없애기 (다익스트라)&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;N개의 정점과 M개의 양방향 간선이 있는 그래프에서, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;간선 하나를 제거했을 때 1번에서 N번까지의 최단거리가 바뀌는 경우의 수&lt;/span&gt;를 구하는 문제다.&lt;/li&gt;
&lt;li&gt;평균 풀이 시간이 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;180분&lt;/b&gt;&lt;/span&gt;이라는 통계가 말해주듯, 갭체크에서 &quot;부족&quot; 판정을 받은 내게는 가장 무거운 문제였다.&lt;/li&gt;
&lt;li&gt;다익스트라 자체가 아니라 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&quot;문제를 어떻게 분해할지&quot;&lt;/b&gt;&lt;/span&gt;가 어려웠다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;먼저 원래 그래프에서 1번 &amp;rarr; N번 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;최단거리를 한 번 구해 기준값으로 저장&lt;/span&gt;한다.&lt;/li&gt;
&lt;li&gt;간선을 하나씩 제거한 그래프에서 다시 최단거리를 구한 뒤, 기준값과 다르면 카운트한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원래 1 &amp;rarr; 5 최단거리는 1-3-5 경로의 2+1 = 3이다. 7번 간선(3-5)을 지우면 1-4-5의 1+3 = 4로 바뀐다. &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;최단거리가 3에서 4로 달라지므로 이 경우만 카운트&lt;/b&gt;&lt;/span&gt;되어 답은 1이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;- 다익스트라는 문제에 따라 &lt;b&gt;반복해서 호출&lt;/b&gt;할 수 있다.&lt;br /&gt;- 어떤 간선이 최단경로에 영향을 주는지 &lt;b&gt;그 간선을 빼고 다시 최단거리를 재보는 것&lt;/b&gt;으로 알 수 있다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1779998678304&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    
    static class Edge {
        int to, weight, id;
        public Edge(int to, int weight, int id) {
            this.to = to;
            this.weight = weight;
            this.id = id;
        }
    }

    static class Node implements Comparable&amp;lt;Node&amp;gt; {
        int v;
        long dist;
        public Node(int v, long dist) {
            this.v = v;
            this.dist = dist;
        }
        @Override
        public int compareTo(Node o) {
            return Long.compare(this.dist, o.dist);
        }
    }

    static int N, M;
    static List&amp;lt;Edge&amp;gt;[] graph;
    static int[] parentVertex;
    static int[] parentEdgeId;
    static final long INF = Long.MAX_VALUE;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        graph = new ArrayList[N + 1];
        for (int i = 1; i &amp;lt;= N; i++) {
            graph[i] = new ArrayList&amp;lt;&amp;gt;();
        }

        for (int i = 0; i &amp;lt; M; i++) {
            st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());
            graph[u].add(new Edge(v, w, i));
            graph[v].add(new Edge(u, w, i));
        }

        parentVertex = new int[N + 1];
        parentEdgeId = new int[N + 1];
        Arrays.fill(parentVertex, -1);
        Arrays.fill(parentEdgeId, -1);

        long originalDist = dijkstra(-1, true);

        if (originalDist == INF) {
            System.out.println(0);
            return;
        }

        List&amp;lt;Integer&amp;gt; pathEdges = new ArrayList&amp;lt;&amp;gt;();
        int curr = N;
        while (curr != 1) {
            pathEdges.add(parentEdgeId[curr]);
            curr = parentVertex[curr];
        }

        int ans = 0;
        for (int skipEdgeId : pathEdges) {
            long newDist = dijkstra(skipEdgeId, false);
            if (newDist &amp;gt; originalDist) {
                ans++;
            }
        }

        System.out.println(ans);
    }

    static long dijkstra(int skipEdgeId, boolean savePath) {
        long[] dist = new long[N + 1];
        Arrays.fill(dist, INF);
        PriorityQueue&amp;lt;Node&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();

        dist[1] = 0;
        pq.offer(new Node(1, 0));

        while (!pq.isEmpty()) {
            Node current = pq.poll();
            int u = current.v;

            if (current.dist &amp;gt; dist[u]) continue;

            for (Edge edge : graph[u]) {
                if (edge.id == skipEdgeId) continue;

                int v = edge.to;
                long nextDist = current.dist + edge.weight;

                if (nextDist &amp;lt; dist[v]) {
                    dist[v] = nextDist;
                    if (savePath) {
                        parentVertex[v] = u;
                        parentEdgeId[v] = edge.id;
                    }
                    pq.offer(new Node(v, nextDist));
                }
            }
        }

        return dist[N];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 나만의 복습 루틴&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;코드트리 커리큘럼을 그날 분량만큼 진행한다.&lt;/li&gt;
&lt;li&gt;풀다가 막혔거나 시간이 오래 걸린 문제는 약점 폴더에 북마크한다.&lt;/li&gt;
&lt;li&gt;전날 북마크한 문제 중 1순위 폴더부터 한 문제를 다시 푼다.&lt;/li&gt;
&lt;li&gt;주말에는 복습완료 폴더로 옮기지 못한 문제만 모아 한 번 더 돌린다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 마무리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전에는 문제를 &quot;푼다&quot;는 행위 자체에만 집중했는데, 북마크 기능을 쓰고 나서는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&quot;틀린 문제를 어떻게 다시 만나느냐&quot;&lt;/b&gt;&lt;/span&gt;가 더 중요하다는 걸 체감했다.&lt;/li&gt;
&lt;li&gt;다음 회차에도 약점 폴더를 계속 비워가면서, 8주 뒤 갭체크 재응시 때 그래프가 어떻게 달라지는지 직접 확인해 볼 생각이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/ko/my-lists&quot;&gt;코드트리 북마크(나의 리스트) 보러 가기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/gap-check/onboarding&quot;&gt;코드트리 갭체크 응시하러 가기&lt;/a&gt;&lt;/p&gt;</description>
      <category>코딩테스트/코드트리</category>
      <category>공부습관</category>
      <category>오답노트</category>
      <category>코드트리</category>
      <category>코딩테스트</category>
      <category>코테공부</category>
      <author>mandus</author>
      <guid isPermaLink="true">https://mandusitstudy.tistory.com/583</guid>
      <comments>https://mandusitstudy.tistory.com/583#entry583comment</comments>
      <pubDate>Thu, 28 May 2026 22:21:01 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트 독학] 알림톡과 깃허브 잔디로 만드는 1일 1코테 루틴 (feat. 코드트리)</title>
      <link>https://mandusitstudy.tistory.com/582</link>
      <description>&lt;div class=&quot;TOC-table&quot; style=&quot;border: 2px solid #fbb; font-weight: bold; padding: 10px; border-radius: 10px;&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://tistory2.daumcdn.net/tistory/5436082/skin/images/jquery.toc.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;font-weight: bold; color: #fff;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
	$(&quot;#toc&quot;).toc( {content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h1,h2,h3,h4&quot; , top: -90, isBlink : true, blinkColor : '#21B9DE' } ) });
&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 청약 통장 &lt;/b&gt;&lt;b&gt;3회차 : 꾸준함을 만드는 나만의 루틴 설계&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1회차에서는 갭체크로 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&quot;Shortest Path는 부족한 지식, 단순 반복문과 Greedy는 불안정한 지식&quot;&lt;/span&gt;이라는 진단을 받았다.&lt;/li&gt;
&lt;li&gt;약점을 알았으니 8주 학습 계획을 세웠고, 첫 일주일은 의욕적으로 문제를 풀려고 했다.&lt;/li&gt;
&lt;li&gt;그런데 막상 어렵게 느껴지는 건 알고리즘이 아니라 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&quot;매일 꾸준히 책상 앞에 앉는 일&quot;&lt;/b&gt;&lt;/span&gt;이었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1TJ7n/dJMcafGKnAx/yHK2NAKAfx3mv1KFo30uV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1TJ7n/dJMcafGKnAx/yHK2NAKAfx3mv1KFo30uV1/img.png&quot; data-alt=&quot;\&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1TJ7n/dJMcafGKnAx/yHK2NAKAfx3mv1KFo30uV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1TJ7n%2FdJMcafGKnAx%2FyHK2NAKAfx3mv1KFo30uV1%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;500&quot; height=&quot;597&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;663&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;\&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;3회차 미션&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;다양한 동기부여 방식으로 꾸준히 학습한 경험 공유&lt;br /&gt;: 알림톡, 깃허브 연동, 본인만의 동기 유지 방식 중 하나 이상을 적용하고 공유하기&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번 회차 미션을 보고 가장 먼저 든 생각은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&quot;이건 내가 가장 약한 부분이다&quot;&lt;/span&gt;라는 것이었다.&lt;/li&gt;
&lt;li&gt;지금까지 해왔던 코딩테스트 공부 패턴이 늘 비슷했기 때문이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 그동안 실패했던 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;오랫동안 유지하는 것이 가장 어려운 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1주차: 매일 2~3문제씩 풀이함.&lt;/li&gt;
&lt;li&gt;2주차: 하루 빠지면 죄책감이 듦. 다음 날에 보상하려 5문제 풀고 지침.&lt;/li&gt;
&lt;li&gt;3주차: 결국 멈춤.&lt;/li&gt;
&lt;li&gt;한 달 뒤: 다시 시작하지만 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;이전에 풀었던 유형이 가물가물함.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 이번 회차에 적용한 동기 유지 방식&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. 코드트리 학습 리마인더 알림톡 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q5dKt/dJMcag6GROB/KbR3kAIAroQjiknmYdveZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q5dKt/dJMcag6GROB/KbR3kAIAroQjiknmYdveZk/img.png&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;390&quot; data-is-animation=&quot;false&quot; style=&quot;width: 59.6764%; margin-right: 10px;&quot; data-widthpercent=&quot;60.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q5dKt/dJMcag6GROB/KbR3kAIAroQjiknmYdveZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq5dKt%2FdJMcag6GROB%2FKbR3kAIAroQjiknmYdveZk%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;491&quot; height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c84Kli/dJMcaa6vD8g/wKt7EKlVRX4HTfCcpCjCh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c84Kli/dJMcaa6vD8g/wKt7EKlVRX4HTfCcpCjCh1/img.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1743&quot; data-is-animation=&quot;false&quot; data-filename=&quot;blob&quot; style=&quot;width: 39.1608%;&quot; data-widthpercent=&quot;39.62&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c84Kli/dJMcaa6vD8g/wKt7EKlVRX4HTfCcpCjCh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc84Kli%2FdJMcaa6vD8g%2FwKt7EKlVRX4HTfCcpCjCh1%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;1440&quot; height=&quot;1743&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;▲ 알림톡 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설정 경로: &lt;a href=&quot;https://www.codetree.ai/ko/accounts/settings/notification&quot;&gt;계정 설정 &amp;gt; 알림&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;매일 정해진 시간에 카카오톡으로 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&quot;오늘의 학습 시간&quot;&lt;/b&gt;&lt;/span&gt; 알림이 도착한다.&lt;/li&gt;
&lt;li&gt;알림 자체보다도, 알림을 본 순간 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&quot;아 맞다, 오늘 아직 안 풀었지&quot;&lt;/span&gt;라는 생각이 강하게 든다.&lt;/li&gt;
&lt;li&gt;알림을 무시하고 넘어가도 &quot;내가 의도적으로 무시했다&quot;는 사실에 죄책감이 든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-2. 깃허브 연동&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ANksD/dJMcabRN7Kh/x9SLc42jk4i7EVkZjrSbMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ANksD/dJMcabRN7Kh/x9SLc42jk4i7EVkZjrSbMk/img.png&quot; data-alt=&quot;▲ 깃허브 연동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ANksD/dJMcabRN7Kh/x9SLc42jk4i7EVkZjrSbMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FANksD%2FdJMcabRN7Kh%2Fx9SLc42jk4i7EVkZjrSbMk%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;600&quot; height=&quot;511&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 깃허브 연동&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설정 경로: &lt;a href=&quot;https://www.codetree.ai/ko/github&quot;&gt;코드트리 깃허브 연동&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;코드트리에서 푼 문제가 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;자동으로 개인 깃허브 레포지토리에 커밋&lt;/b&gt;&lt;/span&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;개발자 취준생 입장에서 깃허브 프로필이 자연스럽게 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;학습 기록 포트폴리오&lt;/span&gt; 역할을 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;백준의 BaekjoonHub와 비교하면 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;별도 확장 프로그램 설치 없이 계정 연동 한 번으로 자동화&lt;/span&gt;된다는 점에서 편리하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-3. 나만의 동기 유지 방법&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;블로그 회고 글&lt;/b&gt;: 주 1회 청약 통장 챌린지 회고 글을 작성한다. 외부에 공개된다는 사실이 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&quot;적어도 일주일에 한 번은 정리할 내용이 있어야 한다&quot;&lt;/b&gt;&lt;/span&gt;는 마음으로 활동을 강제할 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스터디 진행도 공유&lt;/b&gt;: 같이 공부하는 친구에게 주 1회 문제 풀이를 공유한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 결과&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알림톡 적용 전: 일주일에 학습 누락 평균 4~5일&lt;/li&gt;
&lt;li&gt;알림톡 + 잔디 적용 후: 일주일에 학습 누락 1~2일&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czkMX7/dJMcabxwPI9/ErEqKR3pjxcWsaTwHJoYI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czkMX7/dJMcabxwPI9/ErEqKR3pjxcWsaTwHJoYI0/img.png&quot; data-alt=&quot;▲ Github 잔디&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czkMX7/dJMcabxwPI9/ErEqKR3pjxcWsaTwHJoYI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczkMX7%2FdJMcabxwPI9%2FErEqKR3pjxcWsaTwHJoYI0%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;349&quot; height=&quot;203&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ Github 잔디&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 앞으로의 다짐&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;청약 통장 챌린 8주 완주 후 갭체크 재응시를 통해 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&quot;부족한 지식&quot; 영역 0개&lt;/b&gt;&lt;/span&gt; 만들기&lt;/li&gt;
&lt;li&gt;깃허브 잔디 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;연속 30일 이상 유지&lt;/span&gt;하기&lt;/li&gt;
&lt;li&gt;단순 반복문, Greedy 영역을 &quot;안정적인 지식&quot;으로 끌어올리기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 마무리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드트리의 알림톡과 깃허브 연동은 설치도, 설정도 부담이 없이 할 수 있었다.&lt;/li&gt;
&lt;li&gt;의지력이 떨어지는 날에도 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&quot;알림이 오니까, 잔디가 비니까&quot;&lt;/b&gt;&lt;/span&gt; 라는 마음으로 한 문제는 풀게 된다. 이 한 문제가 쌓여서 8주를 만들 수 있을 것 같다.&lt;/li&gt;
&lt;li&gt;다음 회차에서는 실제 문제 풀이 과정에서의 학습 회고를 정리해보려고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/&quot;&gt;코드트리 바로가기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/ko/accounts/settings/notification&quot;&gt;알림톡 설정하러 가기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/ko/github&quot;&gt;깃허브 연동하러 가기&lt;/a&gt;&lt;/p&gt;</description>
      <category>코딩테스트/코드트리</category>
      <category>1일1코테</category>
      <category>개발자루틴</category>
      <category>깃허브연동</category>
      <category>코드트리</category>
      <category>코딩테스트</category>
      <category>코테</category>
      <category>코테공부</category>
      <category>코테독학</category>
      <author>mandus</author>
      <guid isPermaLink="true">https://mandusitstudy.tistory.com/582</guid>
      <comments>https://mandusitstudy.tistory.com/582#entry582comment</comments>
      <pubDate>Sun, 24 May 2026 19:27:21 +0900</pubDate>
    </item>
    <item>
      <title>[코드트리] Greedy(탐욕 알고리즘) 약점 극복 학습 후기</title>
      <link>https://mandusitstudy.tistory.com/579</link>
      <description>&lt;div class=&quot;TOC-table&quot; style=&quot;border: 2px solid #fbb; font-weight: bold; padding: 10px; border-radius: 10px;&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://tistory2.daumcdn.net/tistory/5436082/skin/images/jquery.toc.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;font-weight: bold; color: #fff;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
    $(&quot;#toc&quot;).toc( {content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h1,h2,h3,h4&quot; , top: -90, isBlink : true, blinkColor : '#21B9DE' } ) });
&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 청약 통장 2회차 : 차근차근 약점 집중 돌파&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2회차 미션의 핵심은 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;내 약점 유형을 직접 골라 레슨 1개 이상을 완료하는 것&lt;/b&gt;&lt;/span&gt;이다.&lt;/li&gt;
&lt;li&gt;1회차에서 갭체크 진단을 통해 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Greedy(탐욕 알고리즘)가 &quot;불안정한 지식&quot; 영역으로 분류&lt;/span&gt;되었기 때문에, 이번 회차에서는 Greedy 챕터를 집중 학습하기로 결정했다.&lt;/li&gt;
&lt;li&gt;진단 결과를 바탕으로 추천된 챕터는 &lt;a href=&quot;https://www.codetree.ai/gap-check/history/9211/recommendation&quot;&gt;여기&lt;/a&gt;에서 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;216&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v5l8r/dJMcaaSUecB/ua7kTLFPrsJAPkrH1y5GXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v5l8r/dJMcaaSUecB/ua7kTLFPrsJAPkrH1y5GXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v5l8r/dJMcaaSUecB/ua7kTLFPrsJAPkrH1y5GXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv5l8r%2FdJMcaaSUecB%2Fua7kTLFPrsJAPkrH1y5GXK%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;810&quot; height=&quot;206&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;216&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfZEXg/dJMcahLfXaF/b7V8B5w2sUzmZdnIUW7SXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfZEXg/dJMcahLfXaF/b7V8B5w2sUzmZdnIUW7SXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfZEXg/dJMcahLfXaF/b7V8B5w2sUzmZdnIUW7SXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfZEXg%2FdJMcahLfXaF%2Fb7V8B5w2sUzmZdnIUW7SXk%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;812&quot; height=&quot;241&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 코드트리 커리큘럼 구조 확인&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-1. 레슨 단위 학습 구조: 기본 - 연습 - 테스트&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;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;기본 - 연습 - 테스트&lt;/b&gt;&lt;/span&gt;의 3단계 구조로 문제를 학습할 수 있다는 점이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기본 문제&lt;/b&gt;: 하나의 개념과 하나의 문제가 1:1로 짝을 이루도록 구성되어 있다. 개념 설명을 읽은 직후 바로 문제에 적용할 수 있어서, 이론과 실습 사이의 간격이 거의 없다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연습 문제 / 테스트 문제&lt;/b&gt;: 해당 레슨에서 학습한 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;모든 개념이 함께 제공&lt;/span&gt;되며, 여러 개념을 복합적으로 적용하는 연습을 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8Mjlv/dJMcaiwBEhr/64sok1GsZ3sMkxEZEIwKOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8Mjlv/dJMcaiwBEhr/64sok1GsZ3sMkxEZEIwKOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8Mjlv/dJMcaiwBEhr/64sok1GsZ3sMkxEZEIwKOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8Mjlv%2FdJMcaiwBEhr%2F64sok1GsZ3sMkxEZEIwKOK%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;550&quot; height=&quot;734&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBTQH7/dJMcadaWqph/zF2VWuMGPkHm2hcqWwDbOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBTQH7/dJMcadaWqph/zF2VWuMGPkHm2hcqWwDbOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBTQH7/dJMcadaWqph/zF2VWuMGPkHm2hcqWwDbOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBTQH7%2FdJMcadaWqph%2FzF2VWuMGPkHm2hcqWwDbOk%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;548&quot; height=&quot;204&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2-2. 타 서비스와의 비교&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt; 항목 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt; 코드트리 &lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt; 백준 / 프로그래머스 &lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;학습 구조&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;개념 - 기본 - 연습 - 테스트 단계별 제공&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;문제만 제공, 개념 설명 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;약점 진단&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;갭체크로 유형별 약점 진단 가능&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;별도 진단 기능 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;해설 제공&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;개념 설명 - 모범 코드 - 토론 제공&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;커뮤니티 풀이에 의존&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;학습 방향 제시&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;진단 결과 기반 추천 챕터 안내&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;스스로 문제 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백준이나 프로그래머스에서는 &quot;어떤 문제를 풀어야 할지&quot;를 스스로 결정해야 했다. 반면 코드트리는 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;갭체크 진단 결과를 기반으로 추천 챕터를 제시&lt;/b&gt;&lt;/span&gt;해 주기 때문에 방향을 잃지 않고 학습을 이어갈 수 있다. (백준은 현재 서비스 종료함)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2HZmA/dJMcajoFQbA/yQSfnkad2o6MPqofSljfn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2HZmA/dJMcajoFQbA/yQSfnkad2o6MPqofSljfn1/img.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;940&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;36.27&quot; data-filename=&quot;blob&quot; style=&quot;width: 35.8484%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2HZmA/dJMcajoFQbA/yQSfnkad2o6MPqofSljfn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2HZmA%2FdJMcajoFQbA%2FyQSfnkad2o6MPqofSljfn1%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;540&quot; height=&quot;940&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QFZlP/dJMcaayBTQO/1VIS5Jzdu8FUxuPPeZAYDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QFZlP/dJMcaayBTQO/1VIS5Jzdu8FUxuPPeZAYDK/img.png&quot; width=&quot;600&quot; height=&quot;594&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;852&quot; data-is-animation=&quot;false&quot; style=&quot;width: 62.9888%;&quot; data-widthpercent=&quot;63.73&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QFZlP/dJMcaayBTQO/1VIS5Jzdu8FUxuPPeZAYDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQFZlP%2FdJMcaayBTQO%2F1VIS5Jzdu8FUxuPPeZAYDK%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;860&quot; height=&quot;852&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Greedy 레슨 학습 후기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. Greedy 알고리즘&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;Greedy(탐욕 알고리즘)&lt;/b&gt;: &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;현재 상황에서 가장 최선인 선택을 반복&lt;/b&gt;&lt;/span&gt;하여 전체 최적해를 구하는 방식이다.&lt;/li&gt;
&lt;li&gt;코드트리 레슨에서는 Greedy를 처음 소개할 때 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;동전 거슬러주기 문제&lt;/span&gt;를 예시로 사용한다. 1, 4, 5원짜리 동전으로 8원을 거슬러줄 때, 단순히 큰 동전부터 사용하면 5 + 1 + 1 + 1로 4개가 되지만, 실제 최솟값은 4 + 4로 2개다.&lt;/li&gt;
&lt;li&gt;이 예시를 통해 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Greedy가 항상 최적해를 보장하지는 않는다&lt;/b&gt;&lt;/span&gt;는 점을 먼저 인식하게 된다. Greedy가 유효한 경우는 &quot;현재의 최선이 전체의 최선임을 증명할 수 있을 때&quot;다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-2. 레슨에서 배운 문제 패턴&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;회의실 준비 문제&lt;/b&gt;: Greedy 레슨에서 가장 인상 깊었던 문제다. 끝 시간 기준 오름차순 정렬이라는 하나의 선택 기준만으로 최적해가 도출된다는 사실이 처음에는 직관적으로 와닿지 않았다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;코드트리는 정답 접근법을 바로 알려주지 않고, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;시작 시간 기준 정렬 / 구간 길이 기준 정렬 / 끝 시간 기준 정렬&lt;/span&gt; 순으로 각각의 반례를 하나씩 보여줬다.&lt;/li&gt;
&lt;li&gt;이 방식 덕분에 &quot;왜 끝 시간 기준으로 정렬해야 하는가&quot;에 대한 근거가 명확하게 잡혔다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연속 부분 합의 최댓값&lt;/b&gt;: 합이 음수가 되는 순간 구간을 끊고 다음 원소부터 다시 시작하는 패턴이다. O(N) 시간 복잡도로 해결 가능하다는 점이 인상적이었다.&lt;/li&gt;
&lt;li&gt;레슨을 통해 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;어떤 정렬 기준이 유효한지 반례로 직접 검증하는 사고방식&lt;/b&gt;&lt;/span&gt;을 갖게 되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 직접 푼 문제: 자연수 M/2개의 쌍&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-1. 문제 설명&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;M개의 자연수를 두 개씩 짝지어 M/2개의 쌍을 만들 때, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;두 수의 합이 가장 큰 쌍의 합 C의 최솟값&lt;/b&gt;&lt;/span&gt;을 구하는 문제다.&lt;/li&gt;
&lt;li&gt;난이도 80XP / 평균 풀이 시간 65분 / 정답률 41%로, Greedy 레슨 안에서도 난도가 있는 문제에 속한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OMN5f/dJMcac4dAI0/avFBWSDgl0HDfogKJp6ra0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OMN5f/dJMcac4dAI0/avFBWSDgl0HDfogKJp6ra0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OMN5f/dJMcac4dAI0/avFBWSDgl0HDfogKJp6ra0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOMN5f%2FdJMcac4dAI0%2FavFBWSDgl0HDfogKJp6ra0%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;1909&quot; height=&quot;862&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-2. 아이디어: Greedy + 투 포인터&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;C(최댓값)를 최소화하려면, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;가장 큰 수와 가장 작은 수를 짝짓는 것&lt;/span&gt;이 직관적으로 떠오른다. 이것이 이 문제의 Greedy 핵심 아이디어다.&lt;/li&gt;
&lt;li&gt;오름차순 정렬 후 왼쪽 포인터(작은 값)와 오른쪽 포인터(큰 값)를 좁혀가며 짝을 만든다. 이 과정에서 매칭 가능한 수(matchCount)만큼 count를 차감하고, count가 0이 되는 순간 해당 포인터를 이동한다.&lt;/li&gt;
&lt;li&gt;같은 값이 여러 개 있는 경우를 처리하기 위해 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;(count, value) 쌍으로 입력을 관리&lt;/b&gt;&lt;/span&gt;하는 것이 이 문제의 포인트다. 값을 그대로 배열에 풀어 넣으면 count가 매우 클 경우 시간 초과가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-3. 풀이 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    static class NumberInfo implements Comparable&amp;lt;NumberInfo&amp;gt; {
        long count;
        long value;

        public NumberInfo(long count, long value) {
            this.count = count;
            this.value = value;
        }

        @Override
        public int compareTo(NumberInfo o) {
            return Long.compare(this.value, o.value);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());

        NumberInfo[] numbers = new NumberInfo[n];
        for (int i = 0; i &amp;lt; n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            long count = Long.parseLong(st.nextToken());
            long value = Long.parseLong(st.nextToken());
            numbers[i] = new NumberInfo(count, value);
        }

        // value 기준 오름차순 정렬
        Arrays.sort(numbers);

        int left = 0;
        int right = n - 1;
        long maxC = 0;

        while (left &amp;lt;= right) {
            // 왼쪽 포인터와 오른쪽 포인터가 만난 경우: 같은 값끼리 짝
            if (left == right) {
                if (numbers[left].count &amp;gt; 0) {
                    maxC = Math.max(maxC, numbers[left].value * 2);
                }
                break;
            }

            long matchCount = Math.min(numbers[left].count, numbers[right].count);
            long currentSum = numbers[left].value + numbers[right].value;

            // 현재 쌍의 합으로 최댓값 갱신
            maxC = Math.max(maxC, currentSum);

            // 매칭된 만큼 개수 차감
            numbers[left].count -= matchCount;
            numbers[right].count -= matchCount;

            // 개수가 0이 된 포인터 이동
            if (numbers[left].count == 0) left++;
            if (numbers[right].count == 0) right--;
        }

        System.out.println(maxC);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4-4. 풀이 과정에서 헤맸던 부분&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;span style=&quot;background-color: #f6e199;&quot;&gt;(개수, 값) 형태로 주어진다는 점을 간과&lt;/span&gt;하고 값을 배열에 직접 풀어 넣는 방식으로 접근했다. count가 10억 단위일 수 있기 때문에 이 방식은 메모리 초과로 이어졌다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;left == right인 경우&lt;/b&gt;&lt;/span&gt;: 같은 값끼리 서로 짝을 지어야 하는 상황이다. 이 케이스를 별도로 처리하지 않으면 오답이 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1779105825215&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());

        List&amp;lt;Long&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();

        for (int i = 0; i &amp;lt; n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            long count = Long.parseLong(st.nextToken());
            long value = Long.parseLong(st.nextToken());

            // count만큼 value를 직접 추가
            for (long j = 0; j &amp;lt; count; j++) {
                list.add(value);
            }
        }

        Collections.sort(list);

        int left = 0;
        int right = list.size() - 1;
        long maxC = 0;

        while (left &amp;lt; right) {
            long currentSum = list.get(left) + list.get(right);
            maxC = Math.max(maxC, currentSum);
            left++;
            right--;
        }

        System.out.println(maxC);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;367&quot; data-origin-height=&quot;25&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/etyePW/dJMb99TXzaG/JkD7GA97wFQBMGNMOftIk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/etyePW/dJMb99TXzaG/JkD7GA97wFQBMGNMOftIk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/etyePW/dJMb99TXzaG/JkD7GA97wFQBMGNMOftIk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FetyePW%2FdJMb99TXzaG%2FJkD7GA97wFQBMGNMOftIk1%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;367&quot; height=&quot;25&quot; data-origin-width=&quot;367&quot; data-origin-height=&quot;25&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1779105964650&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

public class Main {
    static class NumberInfo implements Comparable&amp;lt;NumberInfo&amp;gt; {
        long count;
        long value;

        public NumberInfo(long count, long value) {
            this.count = count;
            this.value = value;
        }

        @Override
        public int compareTo(NumberInfo o) {
            return Long.compare(this.value, o.value);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());

        NumberInfo[] numbers = new NumberInfo[n];
        for (int i = 0; i &amp;lt; n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            long count = Long.parseLong(st.nextToken());
            long value = Long.parseLong(st.nextToken());
            numbers[i] = new NumberInfo(count, value);
        }

        Arrays.sort(numbers);

        int left = 0;
        int right = n - 1;
        long maxC = 0;

        while (left &amp;lt;= right) {

            long matchCount = Math.min(numbers[left].count, numbers[right].count);

            long currentSum = numbers[left].value + numbers[right].value;
            maxC = Math.max(maxC, currentSum);

            numbers[left].count -= matchCount;

            numbers[right].count -= matchCount;

            if (numbers[left].count == 0) left++;

            if (numbers[right].count == 0) right--;
        }

        System.out.println(maxC);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE7f1P/dJMcahxIipl/2ezo9BpYVKc7Bp9wk1WJ31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE7f1P/dJMcahxIipl/2ezo9BpYVKc7Bp9wk1WJ31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE7f1P/dJMcahxIipl/2ezo9BpYVKc7Bp9wk1WJ31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE7f1P%2FdJMcahxIipl%2F2ezo9BpYVKc7Bp9wk1WJ31%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;651&quot; height=&quot;253&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. 마무리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Greedy는 &quot;가장 좋아 보이는 것을 고르면 되지 않나?&quot;라는 생각에서 출발하지만, &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;반례를 만나는 순간 무너지는 알고리즘&lt;/b&gt;&lt;/span&gt;이다. 그 경계를 직접 확인하고 이해하는 과정이 이번 회차 학습의 핵심이었다.&lt;/li&gt;
&lt;li&gt;코드트리의 개념 설명은 단순히 정답 접근법을 알려주는 것이 아니라, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;틀린 접근 - 반례 - 올바른 접근&lt;/span&gt; 순으로 구성되어 있어 이해의 깊이가 달랐다. 이 방식 덕분에 문제를 틀리더라도 &quot;왜 틀렸는지&quot;를 스스로 납득할 수 있었다.&lt;/li&gt;
&lt;li&gt;다음 회차에서는 갭체크에서 &quot;부족한 지식&quot;으로 분류된 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Shortest Path(다익스트라)&lt;/b&gt;&lt;/span&gt; 챕터로 넘어갈 예정이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/ko/trails/complete/dashboard&quot;&gt;코드 트레일로 이동하기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/gap-check/history/9211/recommendation&quot;&gt;갭체크 추천 챕터 확인하기&lt;/a&gt;&lt;/p&gt;</description>
      <category>코딩테스트/코드트리</category>
      <category>GREEDY</category>
      <category>그리디</category>
      <category>알고리즘 기초</category>
      <category>코드트리</category>
      <category>코딩테스트</category>
      <category>코테공부</category>
      <category>탐욕 알고리즘</category>
      <category>투포인터</category>
      <author>mandus</author>
      <guid isPermaLink="true">https://mandusitstudy.tistory.com/579</guid>
      <comments>https://mandusitstudy.tistory.com/579#entry579comment</comments>
      <pubDate>Mon, 18 May 2026 20:24:36 +0900</pubDate>
    </item>
    <item>
      <title>[구글 클라우드 스터디잼] Prompt Design in Vertex AI</title>
      <link>https://mandusitstudy.tistory.com/578</link>
      <description>&lt;div class=&quot;TOC-table&quot; style=&quot;border: 2px solid #fbb; font-weight: bold; padding: 10px; border-radius: 10px;&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://tistory2.daumcdn.net/tistory/5436082/skin/images/jquery.toc.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;font-weight: bold; color: #fff;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;

$(function(){

	$(&quot;#toc&quot;).toc( {content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h1,h2,h3,h4&quot; , top: -90, isBlink : true, blinkColor : '#21B9DE' } ) });

&lt;/script&gt;
&lt;/div&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;Prompt Design in Vertex AI&lt;/b&gt;'의 챌린지 랩을 진행한 내용을 정리했습니다. 챌린지 랩은 단계별 가이드 없이 학습한 내용만으로 시나리오를 직접 해결해야 하는 형태로, 이번에는 'Cymbal Direct'를 위한 생성형 AI 마케팅 도구를 Vertex AI Studio와 Workbench에서 구축하는 실습이었습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Gen AI 시대의 MLOps&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.1 예측 AI vs 생성형 AI&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%;&quot;&gt;&lt;b&gt;예측 AI (Predictive AI)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40%;&quot;&gt;&lt;b&gt;생성형 AI (Generative AI)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;목적&lt;/td&gt;
&lt;td style=&quot;width: 35%;&quot;&gt;분류, 회귀, 객체 탐지, 예측&lt;/td&gt;
&lt;td style=&quot;width: 40%;&quot;&gt;새로운 콘텐츠 생성 (텍스트, 이미지, 코드)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;학습 방식&lt;/td&gt;
&lt;td style=&quot;width: 35%;&quot;&gt;모델을 처음부터(from scratch) 학습&lt;/td&gt;
&lt;td style=&quot;width: 40%;&quot;&gt;사전학습 모델 발견 후 커스터마이징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;데이터&lt;/td&gt;
&lt;td style=&quot;width: 35%;&quot;&gt;대량의 라벨링 데이터&lt;/td&gt;
&lt;td style=&quot;width: 40%;&quot;&gt;큐레이션된 데이터셋&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;평가 지표&lt;/td&gt;
&lt;td style=&quot;width: 35%;&quot;&gt;정확도, 정밀도&lt;/td&gt;
&lt;td style=&quot;width: 40%;&quot;&gt;유창성, 사실성, 브랜드 평판&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예측 AI는 기존 데이터로 분류&amp;middot;회귀 같은 특정 문제를 푸는 데 초점이 있고, 생성형 AI는 패턴 학습을 통해 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;새로운 콘텐츠를 만들어내는 것&lt;/b&gt;&lt;/span&gt;이 핵심입니다. 두 영역이 MLOps의 기본 원칙은 공유하지만, 생성형 AI는 추가 적응(adaptation)이 필요합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.2 Gen AI MLOps의 새로운 단계&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;사전학습 모델 탐색&lt;/b&gt;: Model Garden에서 Google/오픈소스/서드파티 모델 선택&lt;/li&gt;
&lt;li&gt;&lt;b&gt;직접 예측 단축 경로&lt;/b&gt;: 프롬프트만으로 즉시 추론 실행 (전용 ML 파이프라인 불필요)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커스터마이징과 튜닝&lt;/b&gt;: Supervised Tuning, RLHF, 어댑터 레이어
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;어댑터 레이어는 수십 MB 크기로, 파운데이션 모델 옆에 결합되어 추론에 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;큐레이션된 데이터 통합&lt;/b&gt;: 임베딩, Vector Search, Grounding&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새로운 평가/모니터링&lt;/b&gt;: Safety Score, Recitation Check&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;이번 챌린지 랩은 Model Garden에서 Gemini를 골라 Vertex AI Studio에서 프롬프트를 설계하고, Workbench(Jupyter)에서 Python 코드로 호출하는 흐름을 따름.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1.3 콘솔에서 주의할 점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습을 시작하면서 한 가지 문제가 있었습니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;기존 문서에서 &quot;Vertex AI&quot;로 표기되던 메뉴가 실제 콘솔에서는 &lt;b&gt;Agent Platform&lt;/b&gt;으로 바뀌어 있습니다.&lt;/span&gt; 처음에 메뉴 위치를 찾지 못해 헷갈렸습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y519R/dJMcafGJ2d5/Hl84vxQ3Zp38bg0ceW2Rtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y519R/dJMcafGJ2d5/Hl84vxQ3Zp38bg0ceW2Rtk/img.png&quot; data-alt=&quot;▲ Google Skills 공지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y519R/dJMcafGJ2d5/Hl84vxQ3Zp38bg0ceW2Rtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy519R%2FdJMcafGJ2d5%2FHl84vxQ3Zp38bg0ceW2Rtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;55&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ Google Skills 공지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5lELd/dJMcaiJ4LQb/jYOi3KiRDudqkE9HkfrC91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5lELd/dJMcaiJ4LQb/jYOi3KiRDudqkE9HkfrC91/img.png&quot; data-alt=&quot;▲ Agent Platform 콘솔 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5lELd/dJMcaiJ4LQb/jYOi3KiRDudqkE9HkfrC91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5lELd%2FdJMcaiJ4LQb%2FjYOi3KiRDudqkE9HkfrC91%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;1919&quot; height=&quot;938&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ Agent Platform 콘솔 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 챌린지 랩 시나리오&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cymbal Direct&lt;/b&gt;라는 가상의 아웃도어 용품 온라인 리테일러가 신제품 라인 마케팅 캠페인을 준비 중이라는 설정입니다. 생성형 AI를 활용해 두 가지 도구를 만드는 것이 목표입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;도구&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;이미지 분석 기반 제품 설명 생성기&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;제품 사진에서 자연의 감성을 담은 짧은 묘사 텍스트 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;태그라인 생성기&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;제품 속성, 타겟 청중, 감정적 공감에 따른 광고 카피 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 챌린지는 총 4개의 Task로 구성됩니다. Task 1, 2는 Vertex AI Studio에서 프롬프트를 설계하는 단계이고, Task 3, 4는 그 프롬프트를 Python 코드로 내보내 Workbench에서 수정 및 실행하는 단계입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Task 1. Gemini 이미지 분석 도구 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.1 목표&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vertex AI Studio에서 지정된 Gemini 모델로 Cloud Storage에 있는 Cymbal Direct 제품 이미지를 분석하여 다양한 스타일의 설명 텍스트를 생성하는 프롬프트 템플릿을 만듭니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3.2 진행 순서&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;Vertex AI Studio에서 새 프롬프트 생성, 모델은 챌린지에서 지정한 Gemini 모델 선택&lt;/li&gt;
&lt;li&gt;이미지 입력으로 Cloud Storage 경로의 제품 이미지 첨부&lt;/li&gt;
&lt;li&gt;아래 세 가지 스타일이 모두 나오도록 프롬프트 실험
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이미지에서 영감을 받은 짧은 설명&lt;/li&gt;
&lt;li&gt;광고에 어울리는 캐치프레이즈&lt;/li&gt;
&lt;li&gt;자연 친화적 캠페인을 위한 시적 묘사&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;출력이 만족스러울 때까지 프롬프트와 파라미터(Temperature, Top-P 등) 조정&lt;/li&gt;
&lt;li&gt;프롬프트 이름을 &lt;b&gt;Cymbal Product Analysis&lt;/b&gt;로 지정&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Save&lt;/b&gt; 클릭 후 지정된 리전 선택&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yrLpj/dJMcahkbJl9/KpNuRt5bVsvvwvmYKFoiRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yrLpj/dJMcahkbJl9/KpNuRt5bVsvvwvmYKFoiRk/img.png&quot; data-alt=&quot;▲ 이미지 입력 + 생성된 텍스트 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yrLpj/dJMcahkbJl9/KpNuRt5bVsvvwvmYKFoiRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyrLpj%2FdJMcahkbJl9%2FKpNuRt5bVsvvwvmYKFoiRk%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;1915&quot; height=&quot;937&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 이미지 입력 + 생성된 텍스트 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. Task 2. Gemini 태그라인 생성기 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.1 목표&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제품 속성, 타겟 청중, 감정 공감 코드를 파라미터로 받아 커스터마이징 가능한 태그라인을 생성하는 프롬프트 템플릿을 구축합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.2 System instructions 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트의 System instructions 칸에 다음 지시문을 입력합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Cymbal Direct is partnering with an outdoor gear retailer.
They're launching a new line of products designed to encourage young people
to explore the outdoors.
Help them create catchy taglines for this product line.&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.3 Few-shot examples 작성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델 출력 스타일을 잡기 위해 &lt;b&gt;2개의 예시&lt;/b&gt;를 추가해야 합니다. 한 개는 챌린지에서 제공된 예시를 그대로 쓰고, 다른 한 개는 같은 형식으로 직접 작성했습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;Input&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;Output&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Write a tagline for a durable backpack designed for hikers that makes them feel prepared. Consider styles like minimalist.&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Built for the Journey: Your Adventure Essentials.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Write a tagline for a lightweight tent designed for young adventurers that makes them feel connected to nature. Consider styles like poetic.&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Sleep Under Stars, Wake With the Wild.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;Few-shot prompting이란?&lt;/b&gt; 모델에게 원하는 입출력 쌍을 몇 개 보여주는 것만으로 출력 스타일을 학습시키는 기법. 파인튜닝 없이도 도메인 특화 출력을 유도할 수 있음. 이번 Task에서는 2개의 예시로 &lt;b&gt;출력 형식(짧은 문장, 콜론으로 두 절 구분, 영어 대문자 시작)까지 모델이 흉내내도록 유도&lt;/b&gt;함.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.4 커스터마이징 파라미터&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;제품 속성&lt;/b&gt;: durable, lightweight, waterproof 등&lt;/li&gt;
&lt;li&gt;&lt;b&gt;타겟 청중&lt;/b&gt;: young adventurers, families 등&lt;/li&gt;
&lt;li&gt;&lt;b&gt;감정적 공감&lt;/b&gt;: empowered, connected, free 등&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스타일&lt;/b&gt;: minimalist, poetic, bold 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMg9XP/dJMcacpCw65/0bQm0CRREIlyEdWEfefv10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMg9XP/dJMcacpCw65/0bQm0CRREIlyEdWEfefv10/img.png&quot; data-alt=&quot;▲ 태그라인 생성 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMg9XP/dJMcacpCw65/0bQm0CRREIlyEdWEfefv10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMg9XP%2FdJMcacpCw65%2F0bQm0CRREIlyEdWEfefv10%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;1916&quot; height=&quot;942&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 태그라인 생성 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4.5 저장&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트 이름을 &lt;b&gt;Cymbal Tagline Generator Template&lt;/b&gt;로 지정하고 지정된 리전에 저장합니다. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Autosave로 이미 저장돼 있다면 이름만 정확한지 확인하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. Task 3. 이미지 분석 코드 실험&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.1 목표&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vertex AI Studio에서 만든 프롬프트를 Python 코드로 내보내, Workbench(Jupyter Notebook)에서 직접 호출하고 수정합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.2 진행 순서&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;b&gt;Agent Platform &amp;rarr; Notebooks &amp;rarr; Workbench&lt;/b&gt;로 이동&lt;/li&gt;
&lt;li&gt;지정된 Workbench 인스턴스에서 &lt;b&gt;Open JupyterLab&lt;/b&gt; 클릭&lt;/li&gt;
&lt;li&gt;&lt;code&gt;image-analysis.ipynb&lt;/code&gt; 열고 커널을 &lt;b&gt;Python 3&lt;/b&gt;로 설정&lt;/li&gt;
&lt;li&gt;전체 셀 실행하여 환경 정상 동작 확인&lt;/li&gt;
&lt;li&gt;Vertex AI Studio &amp;rarr; Cymbal Product Analysis 프롬프트 &amp;rarr; 우측 &lt;b&gt;Code&lt;/b&gt; 버튼 &amp;rarr; 언어 &lt;b&gt;Python&lt;/b&gt; &amp;rarr; &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;두 번째 코드 셀&lt;/b&gt;&lt;/span&gt;을 노트북의 지정 셀에 복사&lt;/li&gt;
&lt;li&gt;API 키 기반 인증 블록을 &lt;code&gt;PROJECT_ID&lt;/code&gt;, &lt;code&gt;LOCATION&lt;/code&gt; 기반 코드로 교체&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;API 키 방식을 PROJECT_ID/LOCATION 방식으로 바꾸는 이유?&lt;/b&gt; API 키는 노출 시 누구나 호출 가능하므로 운영 환경에서 위험함. Workbench는 이미 서비스 계정으로 인증된 환경이므로, 프로젝트와 리전만 명시하면 IAM 권한에 따라 안전하게 API를 호출할 수 있음. 보안의 기본 원칙인 &lt;b&gt;최소 권한(Principle of Least Privilege)&lt;/b&gt;을 따른 것임.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9dxSl/dJMcadWjKpv/FKwelIIEqwdINxZs67KxMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9dxSl/dJMcadWjKpv/FKwelIIEqwdINxZs67KxMK/img.png&quot; data-alt=&quot;▲ JupyterLab에서 image-analysis.ipynb 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9dxSl/dJMcadWjKpv/FKwelIIEqwdINxZs67KxMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9dxSl%2FdJMcadWjKpv%2FFKwelIIEqwdINxZs67KxMK%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;1919&quot; height=&quot;942&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;942&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ JupyterLab에서 image-analysis.ipynb 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QdQZc/dJMcabYyqV2/AVGcklQqUC0MEIDw2pCwv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QdQZc/dJMcabYyqV2/AVGcklQqUC0MEIDw2pCwv0/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;938&quot; data-is-animation=&quot;false&quot; data-filename=&quot;blob&quot; data-widthpercent=&quot;50.08&quot; style=&quot;width: 49.4975%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QdQZc/dJMcabYyqV2/AVGcklQqUC0MEIDw2pCwv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQdQZc%2FdJMcabYyqV2%2FAVGcklQqUC0MEIDw2pCwv0%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;1919&quot; height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KxOOr/dJMcagetJ2a/5y3ANTFVdTrgBCFCdRY6y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KxOOr/dJMcagetJ2a/5y3ANTFVdTrgBCFCdRY6y1/img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;941&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.3397%;&quot; data-widthpercent=&quot;49.92&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KxOOr/dJMcagetJ2a/5y3ANTFVdTrgBCFCdRY6y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKxOOr%2FdJMcagetJ2a%2F5y3ANTFVdTrgBCFCdRY6y1%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;1919&quot; height=&quot;941&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;▲ 코드 셀 복사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5.3 프롬프트 수정 두 가지&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드가 정상 동작하는 것을 확인한 후, 두 가지 요구사항에 맞춰 프롬프트를 수정합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;수정 항목&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35%;&quot;&gt;&lt;b&gt;요구사항&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40%;&quot;&gt;&lt;b&gt;방법&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;출력 길이&lt;/td&gt;
&lt;td style=&quot;width: 35%;&quot;&gt;10단어 미만&lt;/td&gt;
&lt;td style=&quot;width: 40%;&quot;&gt;프롬프트 본문을 더 구체적으로 (예: &quot;in fewer than 10 words&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;창의성&lt;/td&gt;
&lt;td style=&quot;width: 35%;&quot;&gt;가장 창의적이고 예상치 못한 묘사 유도&lt;/td&gt;
&lt;td style=&quot;width: 40%;&quot;&gt;Temperature 값을 높임 (힌트: 파라미터 조정 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;창의적이고 예상치 못한&quot; 묘사를 원한다면 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Temperature를 높이고(예: 0.9 이상)&lt;/b&gt;&lt;/span&gt;, 필요시 Top-P도 함께 조정합니다. 프롬프트 수정 후 셀을 다시 실행하여 결과가 짧고 더 창의적으로 변했는지 확인하고, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;마지막에 노트북 파일을 반드시 저장해야 진행도 체크가 통과됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nIFXz/dJMcabjYao0/2M94raTOzmhSjKK21q4Ny1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nIFXz/dJMcabjYao0/2M94raTOzmhSjKK21q4Ny1/img.png&quot; data-alt=&quot;▲ 수정 후 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nIFXz/dJMcabjYao0/2M94raTOzmhSjKK21q4Ny1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnIFXz%2FdJMcabjYao0%2F2M94raTOzmhSjKK21q4Ny1%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;1919&quot; height=&quot;944&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ 수정 후 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. Task 4. 태그라인 생성 코드 실험&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.1 목표&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Task 2에서 만든 태그라인 프롬프트를 Python 코드로 내보내, &lt;b&gt;마지막 입력에 특정 키워드를 강제&lt;/b&gt;하는 방식으로 수정합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.2 진행 순서&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;Workbench에서 &lt;code&gt;tagline-generator.ipynb&lt;/code&gt; 열기 (커널 Python 3)&lt;/li&gt;
&lt;li&gt;Vertex AI Studio의 Cymbal Tagline Generator Template 프롬프트 &amp;rarr; &lt;b&gt;Code&lt;/b&gt; &amp;rarr; &lt;b&gt;Python&lt;/b&gt; &amp;rarr; 두 번째 코드 셀을 노트북에 복사&lt;/li&gt;
&lt;li&gt;인증 블록을 &lt;code&gt;PROJECT_ID&lt;/code&gt;, &lt;code&gt;LOCATION&lt;/code&gt; 방식으로 교체&lt;/li&gt;
&lt;li&gt;코드 실행하여 정상 출력 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;마지막 input&lt;/b&gt;을 수정하여 태그라인에 &lt;code&gt;nature&lt;/code&gt; 키워드가 포함되도록 명시적 지시 추가&lt;/li&gt;
&lt;li&gt;저장 후 재실행하여 결과 검증&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6.3 키워드 강제 패턴&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 입력 텍스트를 아래처럼 수정합니다. 단순히 &quot;include nature&quot;라고 적기보다 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&quot;the tagline must explicitly include the word 'nature'&quot;&lt;/span&gt;처럼 명령의 강도를 높이면 결과가 더 안정적입니다.&lt;/p&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;# 마지막 입력 예시
&quot;&quot;&quot;Write a tagline for a lightweight rain jacket designed for young adventurers
that makes them feel connected to the outdoors.
The tagline must explicitly include the word 'nature'.
Consider styles like poetic.&quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;947&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEAksP/dJMcafzSzzh/65tzGCx1K1mGeiD5Bb8DVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEAksP/dJMcafzSzzh/65tzGCx1K1mGeiD5Bb8DVk/img.png&quot; data-alt=&quot;▲ tagline-generator.ipynb 코드 셀&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEAksP/dJMcafzSzzh/65tzGCx1K1mGeiD5Bb8DVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEAksP%2FdJMcafzSzzh%2F65tzGCx1K1mGeiD5Bb8DVk%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;1919&quot; height=&quot;947&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;947&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ tagline-generator.ipynb 코드 셀&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;943&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRAxym/dJMcabEegec/MgmdiNZKSWD7KG1skHJFqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRAxym/dJMcabEegec/MgmdiNZKSWD7KG1skHJFqK/img.png&quot; data-alt=&quot;▲ nature 키워드가 포함된 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRAxym/dJMcabEegec/MgmdiNZKSWD7KG1skHJFqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRAxym%2FdJMcabEegec%2FMgmdiNZKSWD7KG1skHJFqK%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;1919&quot; height=&quot;943&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;943&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;▲ nature 키워드가 포함된 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7. 정리&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;7.1 챌린지 랩에서의 Gen AI 개발 흐름&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;Vertex AI Studio에서 &lt;b&gt;프롬프트 프로토타이핑&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;출력 스타일을 잡기 위한 &lt;b&gt;Few-shot 예시 설계&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;창의성/길이/포맷 제어를 위한 &lt;b&gt;샘플링 파라미터 조정&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;최종 프롬프트를 &lt;b&gt;Python 코드로 내보내 애플리케이션에 통합&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Workbench에서 &lt;b&gt;인증/배포 환경에 맞춰 코드 수정&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 운영 단계에서는 여기에 평가(Evaluation Service), 모니터링(Safety Score), Vector Search 기반 Grounding, Vertex Extensions를 통한 외부 도구 연결이 추가된다고 합니다. 추가로 아래와 같이 정리할 수 있습니다.&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;color: #f89009;&quot;&gt;&lt;b&gt;프롬프트는 새로운 인터페이스&lt;/b&gt;&lt;/span&gt;: API 호출처럼 정형화된 호출이 아니라 자연어로 모델의 동작을 정의함.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Few-shot 예시의 위력&lt;/b&gt;&lt;/span&gt;: 파인튜닝 없이도 출력 스타일을 정밀하게 제어할 수 있음.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;파라미터 조정의 중요성&lt;/b&gt;&lt;/span&gt;: Temperature 하나로 같은 프롬프트의 출력 다양성이 완전히 달라짐.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;Studio &amp;rarr; Workbench로의 연결&lt;/b&gt;&lt;/span&gt;: 프로토타이핑된 프롬프트가 그대로 운영 코드로 이어짐.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;전통적인 LLM 통합&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;이번 실습 방식&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;API 키를 코드에 직접 하드코딩하 호출&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;IAM 기반 인증으로 안전하게 호출&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;프롬프트를 코드 안에서 직접 수정&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Studio에서 시각적으로 설계 후 코드로 내보내기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;출력 형식을 후처리로 강제&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Few-shot 예시로 모델 출력 자체를 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;파라미터 튜닝을 별도 코드 변경으로 처리&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Studio UI에서 즉시 실험&amp;middot;조정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은 '&lt;b&gt;2026 구글 클라우드 스터디잼&lt;/b&gt;'에서 학습한 내용을 바탕으로 작성되었습니다.&lt;/blockquote&gt;</description>
      <category>학습일지</category>
      <category>Gemini</category>
      <category>google</category>
      <category>vertexai</category>
      <author>mandus</author>
      <guid isPermaLink="true">https://mandusitstudy.tistory.com/578</guid>
      <comments>https://mandusitstudy.tistory.com/578#entry578comment</comments>
      <pubDate>Sat, 16 May 2026 12:14:45 +0900</pubDate>
    </item>
    <item>
      <title>[코드트리 후기] 코딩테스트 준비, 갭체크부터 청약 통장 1회차 시작하기</title>
      <link>https://mandusitstudy.tistory.com/576</link>
      <description>&lt;div class=&quot;TOC-table&quot; style=&quot;border: 2px solid #fbb; font-weight: bold; padding: 10px; border-radius: 10px;&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://tistory2.daumcdn.net/tistory/5436082/skin/images/jquery.toc.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;font-weight: bold; color: #fff;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
	$(&quot;#toc&quot;).toc( {content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h1,h2,h3,h4&quot; , top: -90, isBlink : true, blinkColor : '#21B9DE' } ) });
&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 청약 통장 1회차 : 내 약점 파악과 목표 설정&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1. 갭체크란&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;갭체크(Gap Check)&lt;/b&gt;: &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;적응형 진단 테스트&lt;/b&gt;&lt;/span&gt;로, 응시자의 풀이 결과에 따라 다음 문제의 난이도가 동적으로 조정되는 방식&lt;/li&gt;
&lt;li&gt;출력, 조건문 같은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;기초부터 Shortest Path 같은 고급 알고리즘까지&lt;/span&gt; 폭넓은 범위를 짧은 시간 안에 검증한다.&lt;/li&gt;
&lt;li&gt;각 문제마다 평균 풀이 시간과 평균 시도 횟수가 비교 지표로 제공되어, 단순히 풀었는지가 아니라 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;얼마나 효율적으로 풀었는지&lt;/span&gt;까지 평가된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-2. 응시 전 vs 응시 후&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;처음에는 &quot;기초 문제부터 차근차근 나오겠지&quot; 싶었는데, 막상 응시해 보니 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;출력 &amp;rarr; 조건문 &amp;rarr; 단순 반복문 &amp;rarr; BFS &amp;rarr; Greedy &amp;rarr; Shortest Path&lt;/b&gt;&lt;/span&gt; 순으로 난이도가 빠르게 올라갔다.&lt;/li&gt;
&lt;li&gt;BFS와 Shortest Path 문제는 평소에 자주 다루지 않던 유형이라 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;문제 이해 자체에 시간이 걸렸다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 갭체크 결과&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;933&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L5Psx/dJMcadBTgp5/CT8uGkIDeYJwSOK5WcDOi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L5Psx/dJMcadBTgp5/CT8uGkIDeYJwSOK5WcDOi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L5Psx/dJMcadBTgp5/CT8uGkIDeYJwSOK5WcDOi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL5Psx%2FdJMcadBTgp5%2FCT8uGkIDeYJwSOK5WcDOi1%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;844&quot; height=&quot;933&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;933&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  불안정한 지식 (단순 반복문, Greedy)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기본 for/while 루프는 사용할 수 있지만, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;중첩 반복문이나 반복 종료 조건 설정, 제어 변수 변경&lt;/span&gt; 등을 효과적으로 다루지 못한다.&lt;/li&gt;
&lt;li&gt;다양한 반복문 구조와 중첩 루프 활용, 반복 조건과 제어 변수에 대한 심도 있는 이해가 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;  부족한 지식 (Shortest Path)&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;다익스트라 알고리즘의 기본 원리조차 확실히 이해하지 못한 상태로, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;단순한 그래프에서도 최단 경로 탐색을 올바르게 구현하기 어렵다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;이 상태에서는 LCA, MST 같은 고급 알고리즘 학습에도 어려움이 따르므로, 다익스트라와 우선순위 큐 기반 최단 경로부터 익혀야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 학습 목표 설정&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-1. 우선순위 정리&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;학습 우선순위&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;- &lt;b&gt;1순위&lt;/b&gt;: Shortest Path (다익스트라)&lt;br /&gt;- &lt;b&gt;2순위&lt;/b&gt;: 단순 반복문 응용, Greedy 패턴&lt;br /&gt;- &lt;b&gt;3순위&lt;/b&gt;: BFS/DFS&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-2. 주차별 학습 계획&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;1~2주차&lt;/b&gt;: 단순 반복문 응용과 중첩 루프 패턴 집중&lt;/li&gt;
&lt;li&gt;&lt;b&gt;3~4주차&lt;/b&gt;: Greedy 패턴 안정화, BFS 기초&lt;/li&gt;
&lt;li&gt;&lt;b&gt;5~6주차&lt;/b&gt;: 다익스트라 알고리즘과 우선순위 큐 학습&lt;/li&gt;
&lt;li&gt;&lt;b&gt;7~8주차&lt;/b&gt;: 종합 문제 풀이 + 시간 제한 안에서 푸는 연습&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3-3. 8주 후 목표&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;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;&quot;부족한 지식&quot; 영역을 0개로 만들기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;단순 반복문, Greedy 영역을 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&quot;안정적인 지식&quot;&lt;/span&gt;으로 끌어올리기&lt;/li&gt;
&lt;li&gt;코딩테스트에서 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;고난도 문제를 시간 안에 안정적으로 풀 수 있는 수준&lt;/span&gt; 도달하기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 마무리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;갭체크를 응시하기 전까지는 내 코딩테스트 실력이 &quot;중간쯤&quot;이라고 생각하고 있었다. 객관적인 진단을 받아보니 &lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;강점과 약점이 명확히 분리되는 그래프 형태&lt;/b&gt;&lt;/span&gt;로 나타나서 충격받았다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&quot;불안정한 지식&quot;과 &quot;부족한 지식&quot;을 구분해서 보여주는 방식&lt;/span&gt;이 인상 깊었다. 단순히 못 한다/잘 한다가 아니라, 어디서부터 손대야 할지 알 수 있었다.&lt;/li&gt;
&lt;li&gt;8주 동안 청약 통장을 통해&amp;nbsp;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;약점을 보완하는 학습&lt;/b&gt;&lt;/span&gt;을 하기 위해 노력할 예정이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://www.codetree.ai/gap-check/onboarding&quot;&gt;코드트리 갭체크 응시하러 가기&lt;/a&gt;&lt;/p&gt;</description>
      <category>코딩테스트/코드트리</category>
      <category>갭체크</category>
      <category>알고리즘공부</category>
      <category>코드트리</category>
      <category>코딩테스트</category>
      <category>코테공부</category>
      <category>코테준비</category>
      <author>mandus</author>
      <guid isPermaLink="true">https://mandusitstudy.tistory.com/576</guid>
      <comments>https://mandusitstudy.tistory.com/576#entry576comment</comments>
      <pubDate>Mon, 11 May 2026 17:09:15 +0900</pubDate>
    </item>
    <item>
      <title>[스터디14] 01. 클린 코드의 원칙</title>
      <link>https://mandusitstudy.tistory.com/575</link>
      <description>&lt;div class=&quot;TOC-table&quot; style=&quot;border: 2px solid #fbb; font-weight: bold; padding: 10px; border-radius: 10px;&quot;&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;https://tistory2.daumcdn.net/tistory/5436082/skin/images/jquery.toc.js&quot;&gt;&lt;/script&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;목차&lt;/p&gt;
&lt;ul id=&quot;toc&quot; style=&quot;font-weight: bold; color: #fff;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;/ul&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
	$(&quot;#toc&quot;).toc( {content: &quot;.tt_article_useless_p_margin&quot;, headings: &quot;h1,h2,h3,h4&quot; , top: -90, isBlink : true, blinkColor : '#21B9DE' } ) });
&lt;/script&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1장. 클린 코드의 원칙&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클린 코드란 동료들이 쉽게 이해하고, 수정과 확장이 용이한 '좋은' 코드를 의미한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-1 클린 코드를 지켜야 하는 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자는 일정 압박, 잦은 변경 요청, 개발자 간의 다양한 코딩 스타일 때문에 일관된 코드 스타일을 유지하기 어렵다. 그럼에도 클린 코드를 지키는 이유는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 개발자나 미래의 자신이 코드를 이해하고 수정하는 데 드는 &lt;b&gt;시간과 비용을 크게 줄인다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;유지 보수 비용 절감 및 개발 생산성 향상에 직접적으로 기여한다.&lt;/li&gt;
&lt;li&gt;장기적으로 프로젝트의 성공을 보장하는 필수 요소이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-2 의미 있는 이름 짓기&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;네이밍 규칙 4가지&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표기 방식의 일관성을 유지하기 위해 미리 정한 네이밍 규칙이 있다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;25%&quot;&gt;&lt;b&gt;규칙&lt;/b&gt;&lt;/td&gt;
&lt;td width=&quot;35%&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td width=&quot;40%&quot;&gt;&lt;b&gt;예시 (user name)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;카멜 케이스&lt;/td&gt;
&lt;td&gt;뒤에 오는 단어의 첫 글자를 대문자로 표기&lt;/td&gt;
&lt;td&gt;userName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;파스칼 케이스&lt;/td&gt;
&lt;td&gt;두 단어의 첫 글자를 모두 대문자로 표기&lt;/td&gt;
&lt;td&gt;UserName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;케밥 케이스&lt;/td&gt;
&lt;td&gt;단어마다 하이픈(-)으로 연결&lt;/td&gt;
&lt;td&gt;user-name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;스네이크 케이스&lt;/td&gt;
&lt;td&gt;단어마다 언더바(_)로 연결&lt;/td&gt;
&lt;td&gt;user_name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;b&gt;변수&lt;/b&gt;: 소문자로 구성하거나 카멜 케이스 적용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;함수&lt;/b&gt;: 카멜 케이스 적용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클래스&lt;/b&gt;: 파스칼 케이스 적용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상수&lt;/b&gt;: 대문자로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;케밥 케이스는 yml 형태의 파일명에, 스네이크 케이스는 데이터베이스의 컬럼명(열 이름)에 주로 사용된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;가독성 고려하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가독성 좋은 코드란 한마디로 잘 읽히고 작성한 의도를 예측할 수 있는 코드다. 변수, 함수, 클래스 이름은 작성한 코드의 기능과 의도가 잘 드러나도록 지어야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;기능에 맞는 이름 짓기&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스&lt;/b&gt;: 객체로 사용하므로, 명사 또는 명사구로 이름 짓기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;함수&lt;/b&gt;: 동작을 수행하므로, 동사 또는 동사구로 이름 짓기&lt;/li&gt;
&lt;li&gt;구성 요소의 위치와 맥락에 맞게 이름을 지어야 한다. (예: User 클래스 내부 멤버 변수에 user를 붙이는 것은 부적절하다)&lt;/li&gt;
&lt;li&gt;매직 넘버는 의미를 알 수 있도록 &lt;b&gt;상수로 선언&lt;/b&gt;하면 가독성과 유지 보수성이 모두 향상된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-3 주석 제대로 사용하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가독성이 뛰어나고 작성 의도가 분명하게 파악되는 코드보다 더 좋은 주석은 없다. 주석은 오직 보조 수단이며, 제대로 사용할 경우에만 유효하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;좋은 주석 vs 나쁜 주석&lt;/b&gt;&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;50%&quot;&gt;&lt;b&gt;좋은 주석&lt;/b&gt;&lt;/td&gt;
&lt;td width=&quot;50%&quot;&gt;&lt;b&gt;나쁜 주석&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;작성 의도를 설명하는 주석&lt;/td&gt;
&lt;td&gt;데드 코드(미사용 코드)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;정보나 의미를 알려주는 주석&lt;/td&gt;
&lt;td&gt;이력 관리용 주석 (Git이 대체함)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;강조나 경고 주석&lt;/td&gt;
&lt;td&gt;코드 작성 시점을 기념하는 주석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TODO 주석&lt;/td&gt;
&lt;td&gt;거짓 정보가 담긴 주석&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;소유권, 저작권을 나타내는 주석&lt;/td&gt;
&lt;td&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;데드 코드와 이력 관리용 주석&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'언젠가는 쓰지 않을까?' 하는 마음에 코드를 주석 처리해 남겨두는 경우가 많지만, 데드 코드는 코드 복잡도를 높이기만 할 뿐이다. 깃허브 같은 형상 관리 도구로 언제든 이전 버전을 복원할 수 있으므로 과감히 삭제하는 편이 좋다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;거짓 정보가 담긴 주석&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반드시 제거해야 하는 주석은 잘못된 정보가 담긴 주석이다. 코드가 업데이트되는 것처럼 주석도 꾸준히 갱신해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-4 복잡한 조건식은 함수로 변경하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 조건식을 그대로 두면 가독성이 떨어지고 의도를 파악하기 어렵다. 조건식을 별도 함수로 추출하면 함수 이름만으로 조건의 의미를 직관적으로 이해할 수 있다.&amp;nbsp;매직 넘버나 의미가 모호한 값은 &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;/li&gt;
&lt;li&gt;조건문의 의도를 직관적으로 파악할 수 있다.&lt;/li&gt;
&lt;li&gt;변수명을 통해 값의 의미를 유추할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 상수 선언으로 의도를 명확하게 표현
static final int MOVE_DOWN = 1;
static final int STONE_EXIST = 1;
static final int MOVE_RIGHT = 0;

// 함수명, 매개변수, 조건식이 모두 명확해짐
static void moveUser(User user, int direction) {
    if (direction == MOVE_RIGHT) {
        // ...
    }
    if (map[next_y][next_x] == STONE_EXIST) {
        // ...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-5 함수는 하나의 기능만 수행하기&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;원칙 1: 간결하고 명확한 함수 설계하기&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;작은 함수 만들기&lt;/b&gt;: 의도적으로 여러 기능을 한 함수에 담지 않고, 중첩된 조건문이나 반복문은 가능한 한 사용하지 않는다. 로직 대신 함수를 호출해 처리하는 방식이 가독성 면에서 바람직하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기능이 드러나는 이름 짓기&lt;/b&gt;: 다른 개발자가 함수 이름을 보고 어떤 기능을 수행하는지 쉽게 짐작할 수 있어야 한다. 다소 길더라도 명확하다면 좋은 이름이다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;매개변수 최소화하기&lt;/b&gt;: 매개변수가 많아질수록 함수를 이해하기 어려워진다. 일반적으로 3개 이상 늘어나지 않도록 주의하고, 클래스의 멤버 변수로 대체할 수 있는지 고민해 본다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;원칙 2: 추상화 레벨을 고려한 내려 읽기 형태 만들기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추상화 레벨&lt;/b&gt;이란 함수가 수행하는 기능이 얼마나 구체적인지 혹은 추상적인지를 가리키는 개념이다. 함수 안에서 호출되는 함수들이 동일한 추상화 수준을 유지하도록 설계하면, 위에서 아래로 책을 읽듯 이해하기 쉬운 형태가 된다.&lt;/p&gt;
&lt;pre id=&quot;code_2&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 같은 추상화 레벨의 함수들을 호출
public static void createShoppingMall() {
    createUserMgmtModule();      // 고객 관리
    createProductMgmtModule();   // 상품 관리
    createDeliveryMgmtModule();  // 배송 관리
}

private static void createUserMgmtModule() {
    CreateRegisterUserFunction();  // 회원 가입
    CreateModifyUserFunction();    // 정보 수정
    CreateDeleteUserFunction();    // 탈퇴
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;원칙 3: 함수 이름과 다른 기능 수행하지 않기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수명을 짓고 나면, 그 이름에서 예측되는 기능을 정확히 수행하고 있는지 반드시 확인해야 한다. 예를 들어 &lt;code&gt;isAnswerCorrect&lt;/code&gt; 함수가 정답 여부 확인 외에 점수 증가 로직까지 포함하면, 함수명만으로는 추가 동작을 예측할 수 없어 협업 시 혼란을 준다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;원칙 4: 조회와 명령 분리하기&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변숫값을 업데이트하는 명령 함수 내부에 조회 로직을 함께 구현하면 함수의 기능이 모호해진다. 조회와 명령을 각각 다른 함수로 분리해 역할을 명확히 구분하는 것이 좋다.&lt;/p&gt;
&lt;pre id=&quot;code_3&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 조회 함수와 명령 함수 분리
if (studentNameExists(students, updateStudent.getName())) {
    updateScore(students, updateStudent);
}

// 조회: 학생 존재 여부 확인
private static boolean studentNameExists(ArrayList&amp;lt;Student&amp;gt; students, String name) {
    for (int i = 0; i &amp;lt; students.size(); i++) {
        if (students.get(i).getName().equals(name))
            return true;
    }
    return false;
}

// 명령: 점수 업데이트
private static void updateScore(ArrayList&amp;lt;Student&amp;gt; students, Student updateStudent) {
    // 업데이트 로직
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-6 생성자 가독성 높이기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자에 매개변수가 많을수록 클라이언트 코드에서 각 매개변수가 무엇을 의미하는지 파악하기 어렵다. 이때 &lt;b&gt;빌더 패턴(Builder Pattern)&lt;/b&gt;을 적용하면 가독성을 크게 높일 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;빌더 패턴 적용&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원본 클래스 내부에 정적 클래스인 &lt;b&gt;Builder&lt;/b&gt;를 선언한다.&lt;/li&gt;
&lt;li&gt;Builder 클래스는 원본 클래스의 멤버 변수를 모두 가지고 있다.&lt;/li&gt;
&lt;li&gt;각 변숫값을 저장하는 함수를 체이닝 가능하도록 구현한다. (return this)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;build()&lt;/b&gt; 함수에서 현재 변숫값을 이용해 원본 객체를 생성하고 반환한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_4&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 빌더 패턴을 사용해 원하는 속성만 자유롭게 선택해 객체 생성
Person builderPerson = new Person.Builder(&quot;쫑이&quot;)
    .age(20)
    .gender(&quot;M&quot;)
    .height(180)
    .build();

Person builderPerson2 = new Person.Builder(&quot;하루&quot;)
    .age(5)
    .build();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 빌더 패턴이 항상 정답은 아니다. 클래스가 단순하거나 생성자를 자주 사용하지 않는 경우, 빌더 패턴을 적용하면 오히려 코드가 더 복잡해질 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1-7 오류 코드보다 예외 사용하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 실패 케이스를 처리할 때 &lt;b&gt;오류 코드&lt;/b&gt;로 처리하는 방식보다 &lt;b&gt;예외(Exception)&lt;/b&gt;를 활용하는 방식이 더 클린 코드에 가깝다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;오류 코드 vs 예외 처리&lt;/b&gt;&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style3&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;50%&quot;&gt;&lt;b&gt;오류 코드 방식&lt;/b&gt;&lt;/td&gt;
&lt;td width=&quot;50%&quot;&gt;&lt;b&gt;예외 처리 방식&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;함수 내부 분기문으로 오류 처리&lt;/td&gt;
&lt;td&gt;try~catch 문으로 예외 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'함수는 하나의 기능만 수행하자' 원칙 위반&lt;/td&gt;
&lt;td&gt;오류 처리와 핵심 로직이 분리됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;추상화 레벨이 어긋남&lt;/td&gt;
&lt;td&gt;추상화 레벨이 대등함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;조건문 분기가 많아져 흐름 파악이 어려움&lt;/td&gt;
&lt;td&gt;흐름이 명확해 이해하기 쉬움&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;예외 처리의 장점&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실패 케이스 발생 시 예외를 생성해 상위 함수로 전달하거나, try~catch 문으로 처리하는 방식이 깔끔하다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;throws Exception&lt;/code&gt;을 사용하면 호출한 함수에서 발생한 예외를 그대로 자신을 호출한 함수로 넘겨줄 수 있다.&lt;/li&gt;
&lt;li&gt;오류 처리 역시 하나의 기능이므로, 핵심 로직과 분리해야 함수의 단일 책임 원칙이 지켜진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_5&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// try~catch 문으로 예외 처리
public class Main {
    private static final Logger Logger = 
        java.util.logging.Logger.getLogger(Main.class.getName());

    public static void main(String[] args) {
        VPC vpc = new VPC();
        // ...
        try {
            vpc.deleteVPCResourceUsingException();
            vpc = null;
        } catch (Exception e) {
            Logger.log(Level.WARNING, e.getMessage());
        }
    }
}&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;626&quot;&gt;&lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000216647182&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tybTG/dJMcacQEFl7/k3DGGeDWKlGtBe0l18W2F1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtybTG%2FdJMcacQEFl7%2Fk3DGGeDWKlGtBe0l18W2F1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;410&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;이 글은 &lt;b&gt;『Do it! 클린 프로그래밍』&lt;/b&gt; 책의 내용을 바탕으로 작성되었습니다.&lt;/blockquote&gt;</description>
      <category>학습일지/Java</category>
      <category>클린프로그래밍</category>
      <author>mandus</author>
      <guid isPermaLink="true">https://mandusitstudy.tistory.com/575</guid>
      <comments>https://mandusitstudy.tistory.com/575#entry575comment</comments>
      <pubDate>Sat, 9 May 2026 04:32:13 +0900</pubDate>
    </item>
  </channel>
</rss>