<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>로봇이 만드는 눈사람</title>
    <link>https://pro-train.tistory.com/</link>
    <description>IT를 중심으로 다양한 것</description>
    <language>ko</language>
    <pubDate>Wed, 8 Jul 2026 10:38:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Hun-bot</managingEditor>
    <image>
      <title>로봇이 만드는 눈사람</title>
      <url>https://tistory1.daumcdn.net/tistory/4893869/attach/cec29586cbd64bcd80946c5a85a006a7</url>
      <link>https://pro-train.tistory.com</link>
    </image>
    <item>
      <title>[코드트리 후기] 북마크로 나만의 복습 루틴 만들기</title>
      <link>https://pro-train.tistory.com/192</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;코딩테스트 공부를 하다 보면 문제를 푸는 것만큼 중요한 것이 &amp;ldquo;다시 풀 문제를 어떻게 관리할 것인가&amp;rdquo;라고 생각합니다. 처음에는 틀린 문제나 어려웠던 문제를 그냥 머릿속으로 기억하려고 했지만, 시간이 지나면 어떤 문제를 왜 어려워했는지 금방 잊어버렸습니다. 그래서 최근에는 코드트리의 북마크 기능을 활용해 문제를 단순히 저장하는 것이 아니라, 나만의 복습 폴더처럼 관리하려고 하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드트리는 여기에서 확인할 수 있습니다.&lt;br /&gt;&lt;a href=&quot;https://www.codetree.ai/&quot;&gt;https://www.codetree.ai/&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;나만의 북마크 분류 기준&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 북마크한 문제를 난이도만 기준으로 나누지 않습니다. 오히려 &amp;ldquo;내가 왜 이 문제를 다시 봐야 하는가&amp;rdquo;를 기준으로 분류하는 편입니다. 예를 들어, 한 번에 풀었지만 풀이가 지저분했던 문제, 접근법을 떠올리지 못했던 문제, 구현 실수가 반복된 문제, 개념 자체가 아직 불안한 문제를 따로 구분합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 주로 사용하는 분류 기준은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째는 `개념 재확인`입니다. 알고리즘 개념은 알고 있었지만 문제를 보자마자 바로 적용하지 못한 경우에 넣습니다. 두 번째는 `구현 실수`입니다. 로직은 맞았는데 인덱스, 조건문, 자료구조 사용에서 실수한 문제를 모읍니다. 세 번째는 `접근법 복습`입니다. 해설을 보면 이해가 되지만, 처음부터 혼자 떠올리기는 어려웠던 문제를 넣습니다. 마지막은 `시험 전 재풀이`입니다. 실전 감각을 위해 시험이나 코딩테스트 전에 다시 풀어볼 가치가 있는 문제를 모아둡니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 나누면 북마크가 단순한 저장함이 아니라, 제 약점을 보여주는 학습 기록이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-06-15 at 21.40.38.png&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5ucvb/dJMcagskZyh/mVCPDXNgSQMDy7e1x7jAa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5ucvb/dJMcagskZyh/mVCPDXNgSQMDy7e1x7jAa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5ucvb/dJMcagskZyh/mVCPDXNgSQMDy7e1x7jAa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5ucvb%2FdJMcagskZyh%2FmVCPDXNgSQMDy7e1x7jAa0%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;1312&quot; height=&quot;564&quot; data-filename=&quot;Screenshot 2026-06-15 at 21.40.38.png&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이번에 다시 본 문제: 트리 최적의 노드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 블로그 글에 사용한 사진은 코드트리의 `트리 최적의 노드` 문제입니다. 문제 설명을 보면 모든 간선의 길이가 1인 트리에서, 다른 모든 정점과의 거리 중 최댓값이 최소가 되는 노드를 구해야 합니다. 다시 말하면 어떤 노드를 골랐을 때 가장 먼 노드까지의 거리가 최대한 짧아지도록 하는 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 이 문제를 봤을 때는 단순히 모든 노드에서 DFS나 BFS를 돌려서 가장 먼 거리의 최솟값을 찾으면 된다고 생각했습니다. 하지만 그렇게 접근하면 노드 수가 커질 때 시간 복잡도가 커질 수 있습니다. 그래서 이 문제는 단순 탐색 문제가 아니라, 트리의 구조를 어떻게 해석할 것인지가 더 중요한 문제였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 풀면서 새롭게 깨달은 점은 &amp;ldquo;트리에서 중심이 되는 노드&amp;rdquo;를 찾는 관점입니다. 어떤 노드에서 가장 먼 노드까지의 거리를 최소화한다는 것은 결국 트리 전체의 지름과 중심을 생각해야 한다는 뜻이었습니다. 예전에는 문제 문장을 읽고 바로 코드부터 작성하려고 했지만, 이번에는 먼저 &amp;ldquo;이 조건이 트리에서 어떤 의미를 갖는가&amp;rdquo;를 해석하려고 했습니다. 그 과정에서 단순 구현보다 문제의 수학적 구조를 먼저 보는 습관이 조금씩 생기고 있다는 것을 느꼈습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;북마크를 다시 풀면서 내 것으로 만든 경험&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;북마크 문제를 다시 푸는 과정에서 가장 도움이 되는 것은, 예전에 틀렸던 이유를 다시 마주하게 된다는 점입니다. 처음 풀 때는 &amp;ldquo;아, 이건 어려운 문제구나&amp;rdquo; 정도로 넘어갔던 문제가, 다시 보면 &amp;ldquo;내가 트리의 지름 개념을 제대로 연결하지 못했구나&amp;rdquo;, &amp;ldquo;모든 노드에서 탐색하는 방식만 떠올렸구나&amp;rdquo;처럼 더 구체적인 약점으로 보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이가 중요하다고 생각합니다. 단순히 많이 푸는 것만으로는 실력이 늘었다고 착각하기 쉽습니다. 하지만 북마크한 문제를 다시 풀어보면, 내가 정말로 이해했는지 바로 드러납니다. 해설을 보고 이해한 것과, 며칠 뒤 혼자 다시 풀 수 있는 것은 완전히 다른 문제였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 `트리 최적의 노드` 문제도 처음에는 직관이 부족했지만, 다시 보면서 &amp;ldquo;가장 먼 노드까지의 거리&amp;rdquo;라는 표현이 나오면 트리의 지름, 중심, 거리 계산을 함께 떠올려야 한다는 연결고리를 만들 수 있었습니다. 이것이 이번 주차에 가장 확실하게 내 것으로 만든 부분입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드트리 커리큘럼과 북마크로 만든 복습 루틴&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 코드트리 커리큘럼을 따라가면서 새 문제를 푸는 시간과 북마크 문제를 다시 푸는 시간을 분리하려고 합니다. 새 문제를 푸는 시간에는 최대한 스스로 접근해 보고, 막히면 해설을 참고합니다. 그리고 그 문제를 완전히 이해하지 못했거나, 다시 풀 가치가 있다고 느껴지면 바로 북마크에 넣습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복습할 때는 북마크 폴더를 기준으로 순서를 정합니다. 먼저 `구현 실수` 폴더에 있는 문제를 짧게 풀면서 손을 풉니다. 그다음 `개념 재확인` 문제를 풀며 알고리즘 개념을 다시 정리합니다. 마지막으로 `접근법 복습` 폴더의 문제를 풀면서 사고 과정을 훈련합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 루틴의 장점은 오늘 무엇을 공부해야 할지 고민하는 시간이 줄어든다는 점입니다. 예전에는 &amp;ldquo;오늘은 어떤 문제를 풀지?&amp;rdquo;를 고르는 데도 시간이 꽤 걸렸습니다. 하지만 북마크 폴더를 만들어두면, 그날의 컨디션과 목적에 맞춰 바로 복습할 수 있습니다. 시간이 많으면 어려운 접근법 문제를 풀고, 시간이 부족하면 구현 실수 문제를 빠르게 다시 보는 식으로 조절할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;글을 마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코딩테스트 공부에서 북마크는 단순히 나중에 볼 문제를 저장하는 기능이 아니라, 나의 약점을 구조화하는 도구라고 생각합니다. 특히 코드트리처럼 커리큘럼이 잘 정리되어 있는 플랫폼에서는 새 문제 풀이와 북마크 복습을 함께 활용했을 때 학습 효율이 훨씬 좋아집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주차를 통해 느낀 점은, 좋은 복습 루틴은 의지력만으로 만들어지지 않는다는 것입니다. 내가 헷갈렸던 문제를 바로 저장하고, 왜 저장했는지 기준을 정하고, 다시 풀면서 약점을 확인하는 구조가 있어야 합니다. 앞으로도 코드트리의 커리큘럼과 북마크 기능을 활용해 단순히 문제 수를 늘리는 공부가 아니라, 틀린 문제를 확실히 내 것으로 만드는 공부를 이어가고 싶습니다.&lt;/p&gt;</description>
      <category>북마크</category>
      <category>코드트리</category>
      <category>코드트리후기</category>
      <category>코딩테스트</category>
      <author>Hun-bot</author>
      <guid isPermaLink="true">https://pro-train.tistory.com/192</guid>
      <comments>https://pro-train.tistory.com/192#entry192comment</comments>
      <pubDate>Mon, 15 Jun 2026 21:43:13 +0900</pubDate>
    </item>
    <item>
      <title>[코딩테스트 독학] 알림톡으로 바쁜 시험기간에도 코드트리 1일 1문제 루틴 유지하기</title>
      <link>https://pro-train.tistory.com/191</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;대학생에게 시험기간은 평소 엄격하게 유지하던 학습 루틴을 가장 강하게 위협하는 시기입니다. 전공 시험공부와 과제, 팀 프로젝트가 한꺼번에 몰아치다 보면 코딩테스트 준비는 우선순위에서 자연스럽게 밀리기 일쑤입니다. 한 번 흐름을 놓치면 시험이 끝난 후 다시 공부를 시작하기까지 몇 배의 의지력이 필요하고, 그동안 어렵게 쌓아 올린 연속 학습 기록이나 깃허브 잔디가 깨지는 것을 보며 큰 무력감을 느끼기도 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주가 저에게는 딱 그런 위기의 시기였습니다. 밀려드는 전공 시험공부 때문에 컴퓨터 앞에 진득하게 앉아 알고리즘 문제의 풀이 과정을 설계하고 최적화를 고민할 여유가 도저히 나지 않았습니다. 하지만 이러한 악조건 속에서도 코드트리가 제공하는 특별한 동기부여 시스템 덕분에 완벽하게 흐름을 놓치지 않고, 조금씩이라도 학습을 이어가며 루틴을 방어해낼 수 있었습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드트리의 강력한 동기부여 시스템: 학습 리마인더 알림톡과 깃허브 연동&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드트리는 사용자가 중도에 포기하지 않고 꾸준히 학습할 수 있도록 다각적인 동기부여 장치를 설계해 두었습니다. 대표적으로 자신이 푼 문제의 코드가 자동으로 개인 저장소에 기록되는 &lt;b&gt;깃허브(GitHub) 연동 기능&lt;/b&gt;, 매일매일 성실함을 증명하는 &lt;b&gt;연속 학습 일수 대시보드&lt;/b&gt;, 그리고 일상 속에서 학습 타이밍을 직접 찔러주는 &lt;b&gt;카카오톡 학습 리마인더 알림톡&lt;/b&gt;이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그중에서도 제가 이번 시험기간에 가장 치열하게 체감하고 큰 도움을 받은 기능은 바로 &lt;b&gt;학습 리마인더 알림톡&lt;/b&gt;이었습니다. 이 기능은 사용자가 설정한 특정 시간마다 카카오톡 메시지를 통해 오늘의 학습 상태를 직관적으로 상기시켜 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타 알고리즘 플랫폼을 이용할 때는 학습을 지속하기가 상대적으로 어려웠습니다. 대다수의 서비스는 사용자가 직접 웹사이트에 접속해야만 진도나 학습 현황을 볼 수 있거나, 기껏해야 이메일 알림을 보내는 수준에 그치기 때문입니다. 하지만 바쁜 일상 속에서 이메일은 수많은 광고성 메시지와 학교 공지사항에 묻혀 확인하지 못하는 경우가 다반사고, 스마트폰의 일반 앱 푸시 알림은 무의식적으로 옆으로 밀어서 지워버리기 십상입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 코드트리의 알림톡은 현대인이 매일 수십 번 이상 가장 높은 빈도로 확인하는 메신저인 카카오톡을 통해 직접 도달합니다. 메시지 창을 열 때마다 자연스럽게 눈에 밟히기 때문에, 접근성과 시각적 각인 효과 측면에서 타 서비스와는 비교가 되지 않을 정도로 강력한 강제성과 동기부여를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-06-08 at 11.26.45.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6I44I/dJMcagse68c/YJxEnkaBiQCUo33xGEAQT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6I44I/dJMcagse68c/YJxEnkaBiQCUo33xGEAQT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6I44I/dJMcagse68c/YJxEnkaBiQCUo33xGEAQT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6I44I%2FdJMcagse68c%2FYJxEnkaBiQCUo33xGEAQT0%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;516&quot; height=&quot;778&quot; data-filename=&quot;Screenshot 2026-06-08 at 11.26.45.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;바쁜 일상 속 체감 효과와 소중한 경험&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험공부를 하다가 집중력이 흐려져 잠시 쉬는 시간, 혹은 무심코 스마트폰을 켰을 때 도착해 있는 코드트리의 알림톡은 심리적으로 아주 신선한 자극제가 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 알림이 없었다면 '지금은 시험기간이니까 코딩테스트는 잠시 쉬고, 다음 주부터 다시 열심히 해야지'라며 타협하고 침대에 누웠을 것입니다. 하지만 눈앞에 도달한 리마인더 메시지를 보면 '거창하게 몇 시간 동안 어려운 골드 난이도 문제를 붙잡고 있지 못하더라도, 지금 당장 풀 수 있는 가벼운 개념 확인 문제나 기본 예제 한두 개만 풀고 다시 전공 책을 보자'라는 구체적인 행동지침으로 마음을 돌리게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 이번 주에는 많은 양의 문제를 깊이 있게 소화하지는 못했습니다. 그러나 알림톡이 울릴 때마다 책상에 앉아 키보드를 잡았고, 단 10분에서 20분이라도 코드트리에 접속해 코드 한 줄을 타이핑하는 시간을 가졌습니다. 객관적인 문제 풀이 수는 평소보다 적었을지라도, 매일 무언가를 지속하고 있다는 감각과 성취감은 시험기간이라는 스트레스 상황 속에서 슬럼프를 막아주는 든든한 방어선이 되어주었습니다. 학습의 연속성이 끊기지 않았다는 사실 자체가 스스로에게 큰 자신감을 심어주었습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;앞으로의 기대와 발전 방향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 시험기간을 무사히 넘기고 나면, 알림톡 리마인더와 함께 &lt;b&gt;깃허브 연동 기능&lt;/b&gt;을 더욱 본격적으로 결합하여 시너지 효과를 내고자 합니다. 코드트리에서 학습한 내용과 통과한 문제들이 별도의 수동 작업 없이 개인 깃허브 리포지토리에 자동으로 커밋되는 기능은 개발자에게 최고의 시각적 훈장과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매일 알림톡을 보고 사이트에 접속해 문제를 해결하면, 그 결과가 깃허브 프로필의 초록색 잔디로 실시간 잔잔하게 심어지는 구조를 만드는 것입니다. 카카오톡이 행동을 촉발하는 '트리거' 역할을 하고, 깃허브 잔디가 시각적인 '보상' 역할을 수행하는 완벽한 동기부여 사이클이 완성되는 셈입니다. 이러한 시스템적 환경이 받쳐준다면, 다가오는 방학 기간 동안 남들의 의지에만 의존하는 무른 방식이 아니라 시스템에 몸을 맡기는 견고한 '1일 1코테 루틴'을 완벽히 체화할 수 있을 것이라 확신합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;글을 마치며: 환경을 재설계하는 코딩테스트 독학&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 사람들이 코딩테스트 독학에 실패하는 이유는 실력이 부족해서가 아니라, 바쁜 일상 속에서 꾸준함을 유지할 수 있는 '환경'이 받쳐주지 못하기 때문입니다. 자신의 의지력만을 믿고 매일 밤 컴퓨터 앞에 앉기를 기도하는 것은 지속 가능하지 않습니다. 바쁜 시기일수록 시스템이 나를 강제로 깨우고 흔들어주는 환경을 구축해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드트리의 학습 리마인더와 연동 시스템은 의지에만 의존하던 기존의 불안정한 학습 방식을 강제적이고 환경 중심적인 구조로 재설계해 줍니다. 저처럼 학기 중 밀려드는 시험과 과제 속에서 코딩테스트 공부 흐름을 잃고 싶지 않은 분들, 그리고 매번 작심삼일로 끝나는 독학에 지친 모든 분께 코드트리의 리마인더 기능을 강력하게 추천합니다. 작은 알림 하나가 여러분의 완주를 도울 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학습 플랫폼 바로가기: &lt;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>
      <author>Hun-bot</author>
      <guid isPermaLink="true">https://pro-train.tistory.com/191</guid>
      <comments>https://pro-train.tistory.com/191#entry191comment</comments>
      <pubDate>Mon, 8 Jun 2026 11:29:38 +0900</pubDate>
    </item>
    <item>
      <title>CodeTree(코드 트리) - DP</title>
      <link>https://pro-train.tistory.com/190</link>
      <description>&lt;h1&gt;[코드트리] 시뮬레이션 알고리즘 약점 극복 학습 후기&lt;/h1&gt;
&lt;p&gt;지난 글에서는 코드트리 No Free Lunch 2026 청약챌린지를 시작하면서 갭체크를 진행했고, 그 결과를 통해 내 현재 위치를 확인했다. 당시 가장 크게 느낀 점은 “아는 문제는 확실히 풀지만, 모르는 유형은 접근조차 못 한다”는 것이었다. 특히 시뮬레이션 유형에서 그런 약점이 분명하게 드러났다.&lt;/p&gt;
&lt;p&gt;그래서 이번에는 코드트리의 Trail1을 따라가며, 내가 약하다고 느낀 시뮬레이션 유형을 중심으로 학습을 진행해 보기로 했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;코드트리 Trail: &lt;a href=&quot;https://www.codetree.ai/ko/trail-info&quot;&gt;https://www.codetree.ai/ko/trail-info&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;No Free Lunch 2026 청약챌린지: &lt;a href=&quot;https://www.codetree.ai/ko/no-free-lunch-2026&quot;&gt;https://www.codetree.ai/ko/no-free-lunch-2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;코드트리 커리큘럼을 따라가며 느낀 점&lt;/h2&gt;
&lt;p&gt;코드트리 커리큘럼을 따라가면서 느낀 가장 큰 장점은 레슨 단위의 구조가 꽤 명확하다는 점이었다. 단순히 문제 목록이 나열되어 있는 것이 아니라, 기본 개념을 익히고, 연습 문제를 풀고, 마지막에 테스트 문제로 확인하는 흐름이 있었다. 이 구조 덕분에 내가 어떤 개념을 알고 있는지, 어느 지점부터 막히는지를 비교적 쉽게 확인할 수 있었다.&lt;/p&gt;
&lt;p&gt;특히 시뮬레이션 문제를 풀 때 이 구조가 도움이 되었다. 처음에는 시뮬레이션이라는 말 자체가 어렵게 느껴졌다. DP나 그래프처럼 이름부터 복잡한 알고리즘은 아니지만, 막상 문제를 읽으면 조건이 길고, 예외 상황이 많고, 구현 순서를 잡기 어려웠다. 그래서 오히려 “무슨 알고리즘을 써야 하지?”보다 “이걸 코드로 어떻게 옮기지?”에서 더 많이 막혔다.&lt;/p&gt;
&lt;h2&gt;시뮬레이션 문제를 보며 달라진 풀이 감각&lt;/h2&gt;
&lt;p&gt;Trail1을 진행하면서 조금씩 알게 된 것은, 시뮬레이션 문제는 대단한 공식보다 문제의 흐름을 정확히 따라가는 능력이 중요하다는 점이었다. 날짜와 시간 계산, 좌표 이동, 구간 처리, 2차원 배열에서의 변화처럼 문제에서 요구하는 상황을 하나씩 변수와 조건문으로 바꿔야 했다.&lt;/p&gt;
&lt;p&gt;예전에는 문제를 읽고 바로 코드를 작성하려고 했지만, 이제는 먼저 입력값이 어떤 의미인지, 어떤 순서로 상태가 바뀌는지, 반복문 안에서 무엇을 갱신해야 하는지를 정리하려고 한다.&lt;/p&gt;
&lt;p&gt;기본 문제를 풀 때는 “이 정도는 할 수 있겠다”는 느낌이 있었지만, 연습 문제로 넘어가면 같은 개념이 조금씩 변형되어 나왔다. 이때부터 단순히 문법을 아는 것과 문제를 해결하는 것은 다르다는 것을 느꼈다. 예를 들어 배열 문제를 풀 때도 단순히 값을 저장하고 출력하는 것은 어렵지 않지만, 2차원 배열에서 특정 위치를 기준으로 이동하거나, 조건에 따라 값을 바꾸는 문제는 훨씬 더 신중하게 접근해야 했다.&lt;/p&gt;
&lt;p&gt;테스트 문제에서는 풀이 감각이 조금 달라졌다는 것을 느꼈다. 예전 같았으면 조건이 긴 문제를 보면 바로 막혔을 텐데, 이제는 문제를 작게 나누려고 했다. 먼저 변수로 관리해야 할 값이 무엇인지 정하고, 반복문이 몇 번 돌아야 하는지 생각하고, 조건문은 어떤 순서로 검사해야 하는지 정리했다. 물론 아직 한 번에 깔끔하게 풀지는 못하지만, 적어도 문제 앞에서 멈춰버리는 시간이 줄어든 것은 분명했다.&lt;/p&gt;
&lt;h2&gt;해설과 모범코드를 보며 느낀 점&lt;/h2&gt;
&lt;p&gt;코드트리의 해설과 모범코드도 도움이 되었다. 내가 작성한 코드는 처음에는 조건을 너무 복잡하게 나누거나, 불필요한 변수를 많이 만드는 경우가 있었다. 그런데 모범코드를 보면 같은 문제를 더 단순한 흐름으로 해결하는 경우가 많았다.&lt;/p&gt;
&lt;p&gt;특히 시뮬레이션 문제에서는 코드가 길어질수록 실수할 가능성이 커지기 때문에, 상태를 어떻게 단순하게 관리하는지가 중요하다는 것을 배웠다. 해설을 보면서 단순히 정답을 확인하는 것보다, 내 풀이와 비교하며 “어디서 복잡해졌는지”를 돌아볼 수 있었다.&lt;/p&gt;
&lt;h2&gt;다른 학습 서비스와 비교해보면&lt;/h2&gt;
&lt;p&gt;다른 학습 서비스와 비교했을 때, 백준은 다양한 문제를 많이 풀기에는 좋지만 처음 약점을 잡고 공부하기에는 어디서부터 시작해야 할지 막막할 때가 있었다. 프로그래머스는 문제 설명이 친절한 편이지만, 기초부터 유형별로 쌓아가는 흐름은 상대적으로 약하게 느껴질 때가 있었다.&lt;/p&gt;
&lt;p&gt;반면 코드트리는 갭체크로 현재 상태를 확인하고, Trail과 레슨을 통해 부족한 부분을 단계적으로 학습할 수 있다는 점이 좋았다. 지금 내 상황처럼 “아는 건 아는데 모르는 유형에서 멈추는 사람”에게는 꽤 잘 맞는 방식이라고 느꼈다.&lt;/p&gt;
&lt;h2&gt;앞으로의 학습 계획&lt;/h2&gt;
&lt;p&gt;이번 학습을 통해 시뮬레이션을 완전히 잘하게 되었다고 말하기는 어렵다. 여전히 조건이 길고 예외가 많은 문제를 만나면 시간이 오래 걸린다. 하지만 이전과 달라진 점은, 이제는 문제를 보고 바로 포기하기보다 조건을 하나씩 분해해서 생각하려고 한다는 것이다.&lt;/p&gt;
&lt;p&gt;앞으로도 Trail1을 마무리하면서 기본 문법, 반복문, 배열, 2차원 배열, 시뮬레이션 문제를 계속 정리할 예정이다. 그리고 Trail2로 넘어가기 전에 내가 자주 막혔던 문제들은 다시 풀어볼 생각이다.&lt;/p&gt;
&lt;p&gt;이번 챌린지의 목표는 단순히 문제 수를 채우는 것이 아니라, 모르는 유형을 만났을 때도 접근 방법을 떠올릴 수 있는 힘을 기르는 것이다.&lt;/p&gt;
&lt;h2&gt;마무리&lt;/h2&gt;
&lt;p&gt;갭체크를 통해 내 약점을 확인했고, Trail1을 통해 그 약점을 하나씩 채워가고 있다. 아직 갈 길은 멀지만, 적어도 지금은 내가 무엇을 모르고 있는지 알고 있다. 그 점에서 이번 코드트리 청약챌린지는 좋은 출발점이 되고 있다.&lt;/p&gt;</description>
      <category>알고리즘(Algorithm)</category>
      <category>Algorithm</category>
      <category>c++</category>
      <category>codetree</category>
      <category>코드트리</category>
      <category>코딩테스트</category>
      <author>Hun-bot</author>
      <guid isPermaLink="true">https://pro-train.tistory.com/190</guid>
      <comments>https://pro-train.tistory.com/190#entry190comment</comments>
      <pubDate>Sun, 31 May 2026 21:56:25 +0900</pubDate>
    </item>
    <item>
      <title>CodeTree(코드 트리) - Trail 1부터</title>
      <link>https://pro-train.tistory.com/189</link>
      <description>&lt;h1&gt;코드트리 No Free Lunch 2026 청약챌린지 시작!&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;갭체크로 확인한 나의 현재 위치와 Trail1 학습 계획&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드트리에서 진행하는 &lt;b&gt;&lt;a href=&quot;https://www.codetree.ai/ko/no-free-lunch-2026&quot;&gt;2026 청약챌린지&lt;/a&gt;&lt;/b&gt; 를 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적으로 문제를 풀기 전에 먼저 &lt;b&gt;갭체크&lt;/b&gt;를 진행했는데, 결과를 보면서 내 현재 상태를 꽤 명확하게 알 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론부터 말하면,&lt;br /&gt;&lt;b&gt;아는 건 확실하게 아는데, 모르는 건 손도 대지 못한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;갭체크 결과를 보고 느낀 점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갭체크 결과를 보면 내가 이미 알고 있는 개념의 문제들은 비교적 빠르고 안정적으로 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 기본 출력, 단순 반복문, 2차원 배열처럼 이전에 어느 정도 익숙했던 개념들은 큰 어려움 없이 풀 수 있었다.&lt;br /&gt;하지만 반대로 &lt;b&gt;시뮬레이션&lt;/b&gt;처럼 아직 충분히 익숙하지 않은 개념이 나오자, 문제를 시도조차 하지 못했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 시간이 부족해서 못 푼 게 아니라,&lt;br /&gt;문제를 읽고 나서도&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;어떻게 구현을 시작해야 하지?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라는 생각이 먼저 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분에서 내가 부족한 지점이 분명하게 드러났다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;나의 문제점: 모르는 개념 앞에서 멈춰버린다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 갭체크를 통해 가장 크게 느낀 점은 이것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 아는 문제는 빠르게 풀 수 있지만,&lt;br /&gt;모르는 유형의 문제를 만나면 접근 방법 자체를 떠올리지 못한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘 문제를 풀 때 중요한 것은 단순히 특정 개념을 아는 것만이 아니라,&lt;br /&gt;그 개념을 실제 문제 상황에 맞게 적용하는 능력이라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 시뮬레이션 문제는 날짜와 시간 계산, 진법 변환, 구간 계산, 도형의 넓이 계산처럼&lt;br /&gt;문제의 요구사항을 정확히 이해하고 그대로 코드로 옮기는 연습이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 나는 아직 이런 유형에 익숙하지 않아서,&lt;br /&gt;문제의 조건을 어떻게 정리하고 어떤 순서로 구현해야 하는지 감이 부족했다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그래서 시뮬레이션부터 공부하면 되겠다고 생각했다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갭체크 결과만 놓고 보면,&lt;br /&gt;당장 부족한 부분은 &lt;b&gt;시뮬레이션 I&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 처음에는 단순하게&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그럼 시뮬레이션부터 집중적으로 공부하면 되겠다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 다시 생각해보니, 기왕 코드트리 커리큘럼을 따라 공부하는 김에&lt;br /&gt;부족한 개념만 따로 떼어내기보다는 &lt;b&gt;앞쪽 Trail부터 차근차근 확인하면서 필요한 문제들을 골라 공부하는 방식&lt;/b&gt;이 더 좋겠다고 판단했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 아는 개념은 빠르게 지나가고,&lt;br /&gt;헷갈리거나 부족한 개념은 문제를 풀면서 보완하는 식으로 진행하면&lt;br /&gt;전체 흐름도 놓치지 않으면서 빈틈을 메울 수 있을 것 같았다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;학습 방향: Trail1부터 필요한 문제를 쏙쏙 골라 풀기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 챌린지에서 내가 선택한 방식은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Trail1부터 다시 훑어보기&lt;/b&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;일주일 안에 Trail1을 끝내고 Trail2로 넘어가기&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Trail1을 처음부터 끝까지 모든 문제를 완벽하게 다시 푸는 것보다는,&lt;br /&gt;내가 부족한 부분을 중심으로 필요한 문제들을 골라서 풀어보는 방식으로 진행할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말 그대로 &lt;b&gt;필요한 문제들을 쏙쏙 빼먹으면서 공부하는 전략&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;이번 주 목표&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주 목표는 명확하다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일주일 안에 Trail1을 끝내고 Trail2로 넘어가기&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 진도만 빼는 것이 목표는 아니다.&lt;br /&gt;Trail1을 진행하면서 내가 이미 알고 있는 부분과 아직 부족한 부분을 다시 구분하고,&lt;br /&gt;특히 문제를 만났을 때 멈춰버리는 유형을 줄이는 것이 목표다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Trail1을 마칠 때쯤에는 최소한 다음과 같은 상태가 되고 싶다.&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;2차원 배열 문제에서 구현 흐름을 자연스럽게 떠올리기&lt;/li&gt;
&lt;li&gt;시뮬레이션 문제를 보고 겁먹지 않고 조건을 하나씩 코드로 옮기기&lt;/li&gt;
&lt;li&gt;모르는 문제가 나와도 일단 접근 방법을 생각해보기&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;앞으로의 기록 방식&lt;/h2&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;/li&gt;
&lt;li&gt;막혔던 부분&lt;/li&gt;
&lt;li&gt;새롭게 알게 된 개념&lt;/li&gt;
&lt;li&gt;다시 풀어야 할 문제&lt;/li&gt;
&lt;li&gt;Trail 진행 상황&lt;/li&gt;
&lt;li&gt;시뮬레이션 문제를 풀면서 느낀 점&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &amp;ldquo;문제를 풀었다&amp;rdquo;로 끝내기보다는,&lt;br /&gt;내가 어떤 부분에서 막혔고 어떻게 해결했는지를 기록해두려고 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 갭체크는 단순한 테스트라기보다는&lt;br /&gt;내가 지금 어디에 서 있는지 확인할 수 있는 좋은 출발점이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아는 것은 확실하게 알고 있지만,&lt;br /&gt;모르는 것은 손도 대지 못하는 상태.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어찌 보면 부족한 부분이 분명하게 드러난 것이기 때문에 오히려 다행이라고 생각한다.&lt;br /&gt;이제는 무엇을 공부해야 하는지 알게 되었으니, 하나씩 채워나가면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 &lt;b&gt;Trail1 완주&lt;/b&gt;를 목표로 달려본다.&lt;br /&gt;그리고 다음 단계인 &lt;b&gt;Trail2&lt;/b&gt;로 넘어갈 수 있도록 꾸준히 기록하고 공부해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.codetree.ai/ko/trail-info&quot;&gt;https://www.codetree.ai/ko/trail-info&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.codetree.ai/ko/no-free-lunch-2026&quot;&gt;https://www.codetree.ai/ko/no-free-lunch-2026&lt;/a&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;갭체크&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-05-21 at 13.17.23.png&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;1428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwXxTO/dJMcacQHUis/UtXHwNWnxwV5axorraKRS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwXxTO/dJMcacQHUis/UtXHwNWnxwV5axorraKRS1/img.png&quot; data-alt=&quot;##&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwXxTO/dJMcacQHUis/UtXHwNWnxwV5axorraKRS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwXxTO%2FdJMcacQHUis%2FUtXHwNWnxwV5axorraKRS1%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;1850&quot; height=&quot;1428&quot; data-filename=&quot;Screenshot 2026-05-21 at 13.17.23.png&quot; data-origin-width=&quot;1850&quot; data-origin-height=&quot;1428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;##&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot 2026-05-21 at 13.17.27.png&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbvP2n/dJMcacQHUir/BWoXCLjBFcx0u0B9zW2MZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbvP2n/dJMcacQHUir/BWoXCLjBFcx0u0B9zW2MZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbvP2n/dJMcacQHUir/BWoXCLjBFcx0u0B9zW2MZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbvP2n%2FdJMcacQHUir%2FBWoXCLjBFcx0u0B9zW2MZk%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;1894&quot; height=&quot;832&quot; data-filename=&quot;Screenshot 2026-05-21 at 13.17.27.png&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;832&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘(Algorithm)</category>
      <category>Algorithm</category>
      <category>c++</category>
      <category>codetree</category>
      <category>갭체크</category>
      <category>알고리즘공부</category>
      <category>코딩테스트</category>
      <category>코테공부</category>
      <category>코테준비</category>
      <author>Hun-bot</author>
      <guid isPermaLink="true">https://pro-train.tistory.com/189</guid>
      <comments>https://pro-train.tistory.com/189#entry189comment</comments>
      <pubDate>Thu, 21 May 2026 15:28:26 +0900</pubDate>
    </item>
    <item>
      <title>프로그래머스 상품 별 오프라인 매출 구하기[lv.2]</title>
      <link>https://pro-train.tistory.com/188</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131533&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/131533&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  같은 제품의 코드끼리 묶기&lt;br /&gt;  총 판매 개수에 가격 곱하기&lt;br /&gt;  JOIN ON 구문 사용하기 (WHERE 구문도 상관 없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  문제에서 요구하는 정렬조건 따라가기&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 코드를 입력하세요
SELECT P.PRODUCT_CODE, (P.PRICE * SUM(S.SALES_AMOUNT)) AS SALES 
FROM PRODUCT P 
JOIN OFFLINE_SALE S ON P.PRODUCT_ID = S.PRODUCT_ID
GROUP BY P.PRODUCT_CODE
ORDER BY SALES DESC, P.PRODUCT_CODE;

-- 코드를 입력하세요
SELECT P.PRODUCT_CODE, (P.PRICE * SUM(S.SALES_AMOUNT)) AS SALES 
FROM PRODUCT P , OFFLINE_SALE S
WHERE P.PRODUCT_ID = S.PRODUCT_ID
GROUP BY P.PRODUCT_CODE
ORDER BY SALES DESC, P.PRODUCT_CODE;
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programmers/SQL</category>
      <category>Programmers</category>
      <category>SQL</category>
      <author>Hun-bot</author>
      <guid isPermaLink="true">https://pro-train.tistory.com/188</guid>
      <comments>https://pro-train.tistory.com/188#entry188comment</comments>
      <pubDate>Thu, 27 Mar 2025 15:51:02 +0900</pubDate>
    </item>
    <item>
      <title>Baekjoon 6550.ALL IN ALL(부분 문자열) c++ [Silver V]</title>
      <link>https://pro-train.tistory.com/187</link>
      <description>&lt;div class=&quot;index_toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Contents&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력은 여러 개의 테스트 케이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;s,t 10만을 넘지 않음 -&amp;gt; O(n)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자 하나씩 비교하면서 s가 완성되면 &quot;Yes&quot; 완성되지 못하면 &quot;No&quot;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1740022142812&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
using namespace std;

string is_subsequence(const string &amp;amp;s, const string &amp;amp;t)
{
    int s_idx = 0, t_idx = 0;

    while (s_idx &amp;lt; s.length() &amp;amp;&amp;amp; t_idx &amp;lt; t.length())
    {
        if (s[s_idx] == t[t_idx])
        {
            s_idx++;
        }
        t_idx++;
    }

    if (s_idx == s.length())
    {
        return &quot;Yes&quot;;
    }
    else
    {
        return &quot;No&quot;;
    }
}

int main()
{
    string s, t;

    while (cin &amp;gt;&amp;gt; s &amp;gt;&amp;gt; t)
    {
        cout &amp;lt;&amp;lt; is_subsequence(s, t) &amp;lt;&amp;lt; endl;
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Baekjoon/Silver</category>
      <category>Algorithm</category>
      <category>BaekJoon</category>
      <category>c++</category>
      <author>Hun-bot</author>
      <guid isPermaLink="true">https://pro-train.tistory.com/187</guid>
      <comments>https://pro-train.tistory.com/187#entry187comment</comments>
      <pubDate>Thu, 20 Feb 2025 12:32:08 +0900</pubDate>
    </item>
    <item>
      <title>SQL 고득점 Kit - SELECT</title>
      <link>https://pro-train.tistory.com/185</link>
      <description>&lt;div class=&quot;index_toc&quot;&gt;
&lt;div class=&quot;index_toc&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Contents&lt;/p&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;&lt;/ol&gt;
&lt;/div&gt;
&lt;ol id=&quot;toc&quot; style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;&lt;/ol&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3월에 태어난 여성 회원 목록 출력하기&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT MEMBER_ID, MEMBER_NAME, GENDER, 
DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE 
WHERE GENDER = 'W' 
AND DATE_OF_BIRTH LIKE '%-03-%'
AND TLNO IS NOT NULL
ORDER BY MEMBER_ID ASC;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서울에 위치한 식당 목록 출력하기&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT 
    R.REST_ID, R.REST_NAME, R.FOOD_TYPE, R.FAVORITES, R.ADDRESS, ROUND(AVG(RV.REVIEW_SCORE), 2) AS SCORE
FROM 
    REST_INFO R
JOIN 
    REST_REVIEW RV ON (R.REST_ID = RV.REST_ID)
WHERE 
    R.ADDRESS LIKE '서울%'
GROUP BY 
    R.REST_ID, R.REST_NAME, R.FOOD_TYPE, R.FAVORITES, R.ADDRESS
ORDER BY 
    SCORE DESC, R.FAVORITES DESC;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※주의사항 : '%서울%' -&amp;gt; 틀림[서울을 포함한 다른 지명이나 빌딩 이름이 있을 가능성] '서울%': 서울로 시작해야함(서울에 위치한 식당)&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;</description>
      <category>Programmers/SQL</category>
      <category>SELECT</category>
      <category>SQL</category>
      <category>고득점 Kit</category>
      <category>프로그래머스</category>
      <author>Hun-bot</author>
      <guid isPermaLink="true">https://pro-train.tistory.com/185</guid>
      <comments>https://pro-train.tistory.com/185#entry185comment</comments>
      <pubDate>Wed, 19 Feb 2025 16:08:06 +0900</pubDate>
    </item>
    <item>
      <title>대소문자 바꿔서 출력하기 c++ [LV.0]</title>
      <link>https://pro-train.tistory.com/184</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;ASCII 코드에서 대문자와 소문자의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어 알파벳은 &lt;b&gt;ASCII 코드&lt;/b&gt;에서 대소문자가 일정한 차이를 가지고 있다.&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;문자&lt;/th&gt;
&lt;th&gt;ASCII 코드(10진수)&lt;/th&gt;
&lt;th&gt;ASCII 코드(2진수)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;'A'&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;&lt;code&gt;01000001&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'a'&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;&lt;code&gt;01100001&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'B'&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;&lt;code&gt;01000010&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'b'&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;&lt;code&gt;01100010&lt;/code&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;'Z'&lt;/td&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;&lt;code&gt;01011010&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;'z'&lt;/td&gt;
&lt;td&gt;122&lt;/td&gt;
&lt;td&gt;&lt;code&gt;01111010&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;대소문자의 차이: 6번째 비트(0x20, 32)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소문자의 ASCII 값은 대문자의 ASCII 값보다 &lt;b&gt;항상 &amp;gt;32&lt;/b&gt;.&lt;br /&gt;'a' (97) - 'A' (65) = 32&lt;br /&gt;'b' (98) - 'B' (66) = 32&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진수에서는 &lt;b&gt;6번째 비트를 XOR연산을 사용해 반전&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;XOR 연산 (&lt;code&gt;c ^= 32&lt;/code&gt;) 코드&lt;/h2&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;

using namespace std;
string swap(string s){
    for(char &amp;amp;c :s) c ^=32;
    return s;
}

int main(void) {
    string str;
    cin &amp;gt;&amp;gt; str;
    cout &amp;lt;&amp;lt; swap(str);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programmers/TIP</category>
      <category>c++</category>
      <category>XOR</category>
      <category>대소문자</category>
      <category>프로그래머스</category>
      <author>Hun-bot</author>
      <guid isPermaLink="true">https://pro-train.tistory.com/184</guid>
      <comments>https://pro-train.tistory.com/184#entry184comment</comments>
      <pubDate>Sat, 15 Feb 2025 18:32:22 +0900</pubDate>
    </item>
    <item>
      <title>Baekjoon 2805.EKO(나무자르기) c++ [Silver II]</title>
      <link>https://pro-train.tistory.com/183</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;이분탐색&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬된 범위에 특정 값을 찾거나 최적의 값을 구할 때 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;left =0, right는 max로 설정 mid값을 잡아서 조건에 만족하는 최댓 값을 찾을 때까지 위해 반복&lt;/p&gt;
&lt;pre id=&quot;code_1738679455535&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

typedef long long ll;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int N, M;
    cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; M;
    vector&amp;lt;int&amp;gt; trees(N);
    for (int i = 0; i &amp;lt; N; i++)
    {
        cin &amp;gt;&amp;gt; trees[i];
    }
    int left = 0, right = *max_element(trees.begin(), trees.end()), sum = 0;
    while (left &amp;lt;= right)
    {
        int mid = (left + right) / 2;
        ll total = 0;
        for (int t : trees)
        {
            if (t &amp;gt; mid)
            {
                total += t - mid;
            }
        }
        if (total &amp;gt;= M)
        {
            sum = mid;
            left = mid + 1;
        }
        else
        {
            right = mid - 1;
        }
    }
    cout &amp;lt;&amp;lt; sum;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Baekjoon/Silver</category>
      <category>Algorithm</category>
      <category>BaekJoon</category>
      <category>c++</category>
      <author>Hun-bot</author>
      <guid isPermaLink="true">https://pro-train.tistory.com/183</guid>
      <comments>https://pro-train.tistory.com/183#entry183comment</comments>
      <pubDate>Tue, 4 Feb 2025 23:40:17 +0900</pubDate>
    </item>
    <item>
      <title>Baekjoon 2003.수들의 합2 c++ [Silver IV]</title>
      <link>https://pro-train.tistory.com/182</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Two pointer 기법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽으로 이동하면서 값을 더해 sum==M일 때 count를 올려주고, 해당 값이 M을 넘었을 때, left의 위치와 비교해서 지금까지 더해온 값을 모두 빼주며 sum을 초기화한다&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int N, M;
    cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; M;
    vector&amp;lt;int&amp;gt; A(N);
    for (int i = 0; i &amp;lt; N; i++)
    {
        cin &amp;gt;&amp;gt; A[i];
    }
    int left = 0, right = 0, sum = 0, count = 0;
    while (right &amp;lt; N)
    {
        sum += A[right];
        right++;
        while (sum &amp;gt; M &amp;amp;&amp;amp; left &amp;lt; right)
        {
            sum -= A[left];
            left++;
        }
        if (sum == M)
        {
            count++;
        }
    }
    cout &amp;lt;&amp;lt; count;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Baekjoon/Silver</category>
      <category>Algorithm</category>
      <category>c++</category>
      <author>Hun-bot</author>
      <guid isPermaLink="true">https://pro-train.tistory.com/182</guid>
      <comments>https://pro-train.tistory.com/182#entry182comment</comments>
      <pubDate>Tue, 4 Feb 2025 23:09:30 +0900</pubDate>
    </item>
  </channel>
</rss>