<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>tjdgus123 님의 블로그</title>
    <link>https://tjdgus123.tistory.com/</link>
    <description>tjdgus123 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 26 Jun 2026 17:43:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>tjdgus123</managingEditor>
    <item>
      <title>&amp;lt;프로그래머스 C++&amp;gt; H-Index 풀이 ( 정렬 )</title>
      <link>https://tjdgus123.tistory.com/104</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논문 n편 중 h번 이상 인용된 논문이 h편 이상이고, 나머지 논문이 h번 이하 인용되었을 때 h의 최댓값이 H-Index이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 H-Index를 구하는 문제이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzzDAg/dJMcagss6vO/UfB6DJxN5WAnbhLp5hd5KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzzDAg/dJMcagss6vO/UfB6DJxN5WAnbhLp5hd5KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzzDAg/dJMcagss6vO/UfB6DJxN5WAnbhLp5hd5KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzzDAg%2FdJMcagss6vO%2FUfB6DJxN5WAnbhLp5hd5KK%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;716&quot; height=&quot;258&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이 아이디어&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;내림차순 정렬&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;H-Index의 조건은 &quot;h번 이상 인용된 논문이 h편 이상&quot; 이다.&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 data-ke-size=&quot;size16&quot;&gt;내림차순 정렬 후 i+1번째까지 봤을 때 citations[ i ] &amp;gt;= i + 1이면, &quot;i+1편의 논문이 모두 i+1회 인용됐다&quot; 라는 의미가 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1782440157241&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[3, 0, 6, 1, 5] &amp;rarr; 내림차순 정렬 &amp;rarr; [6, 5, 3, 1, 0]

i=0: citations[0]=6 &amp;gt;= 1    (1편 이상이 1회 이상 인용)
i=1: citations[1]=5 &amp;gt;= 2    (2편 이상이 2회 이상 인용)
i=2: citations[2]=3 &amp;gt;= 3    (3편 이상이 3회 이상 인용)
i=3: citations[3]=1 &amp;gt;= 4  x  &amp;rarr; 멈춤&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건이 깨지는 순간, 이전까지의 개수가 H-Index이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1782440202272&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

int solution(vector&amp;lt;int&amp;gt; citations) {
    int answer = 0;
    sort(citations.begin(), citations.end(), greater&amp;lt;int&amp;gt;());

    for(int i = 0; i &amp;lt; citations.size(); ++i)
    {
        if(citations[i] &amp;gt;= i+1)
            answer++;
        else
            break;
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 흐름&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 내림차순 정렬&lt;/h4&gt;
&lt;pre id=&quot;code_1782440226650&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sort(citations.begin(), citations.end(), greater&amp;lt;int&amp;gt;());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인용 횟수가 많은 논문부터 순서대로 나열한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;greater&amp;lt;int&amp;gt;()를 이용해서 내림차순 정렬한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 조건 체크&lt;/h4&gt;
&lt;pre id=&quot;code_1782440255283&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(citations[i] &amp;gt;= i+1)
    answer++;
else
    break;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i + 1은 현재까지 확인한 논문 수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;citations[ i ] &amp;gt;= i + 1이면 i + 1편의 논문이 모두 i + 1회 이상 인용됐다는 의미이므로 answer를 증가시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건이 깨지는 상황부터는 확인할 필요가 없으니 바로 break한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;88:1-88:59;1475-1533&quot;&gt;내림차순 정렬하면 citations[i] &amp;gt;= i+1 조건 하나로 H-Index를 구할 수 있다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;89:1-89:35;1534-1568&quot;&gt;조건이 깨지는 순간 break해서 불필요한 탐색을 줄인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmers</category>
      <author>tjdgus123</author>
      <guid isPermaLink="true">https://tjdgus123.tistory.com/104</guid>
      <comments>https://tjdgus123.tistory.com/104#entry104comment</comments>
      <pubDate>Fri, 26 Jun 2026 11:18:41 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;프로그래머스 C++&amp;gt; 원형 수열의 연속 부분 수열 합 풀이 (set)</title>
      <link>https://tjdgus123.tistory.com/103</link>
      <description>&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;원형 수열은 처음과 끝이 연결된 형태이다. (n번째 다음이 바로 0번째로)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8z4Ut/dJMcag61P07/Db9CpYwIrsC5iHf4AYJ8jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8z4Ut/dJMcag61P07/Db9CpYwIrsC5iHf4AYJ8jK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8z4Ut/dJMcag61P07/Db9CpYwIrsC5iHf4AYJ8jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8z4Ut%2FdJMcag61P07%2FDb9CpYwIrsC5iHf4AYJ8jK%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;662&quot; height=&quot;523&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이 아이디어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 시작점에서 1, 2, 3개 ... n개까지 늘려가면서 합을 전부 구해 set에 넣는다.&lt;/p&gt;
&lt;pre id=&quot;code_1782271523453&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;i=0 (7이 시작점)
  7
  7+9
  7+9+1
  7+9+1+1
  7+9+1+1+4

i=1 (9가 시작점)
  9
  9+1
  9+1+1
  9+1+1+4
  9+1+1+4+7  &amp;larr; 원형으로 7까지
  ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원형 배열에서 끝을 넘어 처음으로 돌아오는건 %(element.size())로 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1782271556037&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;i=3, len=3: (3+2) % 5 = 0 &amp;rarr; elements[0] = 7  &amp;larr; 원형으로 돌아옴&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set이 중복을 자동으로 제거해주기 때문에 마지막에 sums.size()만 반환하면 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1782271586874&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;set&amp;gt;
using namespace std;

int solution(vector&amp;lt;int&amp;gt; elements) {
    int n = elements.size();
    set&amp;lt;int&amp;gt; sums;

    for(int i = 0; i &amp;lt; n; ++i)
    {
        int sum = 0;
        for(int len = 1; len &amp;lt;= n; ++len)
        {
            sum += elements[(i + len - 1) % n];
            sums.insert(sum);
        }
    }
    return sums.size();
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 흐름&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 시작점 순회&lt;/h3&gt;
&lt;pre id=&quot;code_1782271609182&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i = 0; i &amp;lt; n; ++i)
{
    int sum = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i는 부분 수열의 시작점을 의미한다. i가 바뀔때마다 sum을 0으로 초기화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 길이별 합을 누적&lt;/h3&gt;
&lt;pre id=&quot;code_1782271637265&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int len = 1; len &amp;lt;= n; ++len)
{
    sum += elements[(i + len - 1) % n];
    sums.insert(sum);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;len이 늘어날수록 sum에 다음 원소를 누적한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1782271649249&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;i=0 기준
len=1: sum = 7           &amp;rarr; 1개짜리 합
len=2: sum = 7+9 = 16    &amp;rarr; 2개짜리 합
len=3: sum = 16+1 = 17   &amp;rarr; 3개짜리 합
len=4: sum = 17+1 = 18   &amp;rarr; 4개짜리 합
len=5: sum = 18+4 = 22   &amp;rarr; 5개짜리 합&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매 단계마다 sums.insert(sum)으로 각 자릿수별 경우의 수 합을 set에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 원형 인덱스 처리&lt;/h3&gt;
&lt;pre id=&quot;code_1782271685841&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;elements[(i + len - 1) % n]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열 끝을 넘어가면 % n으로 자동으로 처음 항으로 넘어가도록 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1782271724049&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;i=3 기준
len=1: (3+0)%5 = 3 &amp;rarr; elements[3] = 1
len=2: (3+1)%5 = 4 &amp;rarr; elements[4] = 4
len=3: (3+2)%5 = 0 &amp;rarr; elements[0] = 7  &amp;larr; 원형!
len=4: (3+3)%5 = 1 &amp;rarr; elements[1] = 9
len=5: (3+4)%5 = 2 &amp;rarr; elements[2] = 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 결과 반환&lt;/h3&gt;
&lt;pre id=&quot;code_1782271912011&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return sums.size();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set이 중복을 자동으로 제거해주기 때문에 sums의 크기를 반환하면 이것이 서로 다른 합의 개수이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;139:1-139:54;1940-1993&quot;&gt;각 시작점에서 길이를 1씩 늘려가며 합을 누적하면 모든 연속 부분 수열 합을 구할 수 있다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;140:1-140:57;1994-2050&quot;&gt;(i + len - 1) % n으로 원형 배열에서 끝을 넘어 처음으로 돌아오는 것을 처리한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;141:1-141:54;2051-2104&quot;&gt;set이 중복을 자동 제거하므로 별도의 중복 처리 없이 size()만 반환하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmers</category>
      <author>tjdgus123</author>
      <guid isPermaLink="true">https://tjdgus123.tistory.com/103</guid>
      <comments>https://tjdgus123.tistory.com/103#entry103comment</comments>
      <pubDate>Wed, 24 Jun 2026 12:32:41 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;Unreal&amp;gt; 모듈 &amp;amp; 플러그인 만들기</title>
      <link>https://tjdgus123.tistory.com/102</link>
      <description>&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pLrXq/dJMcafAjqZW/7WRJ97cCkQSLhXd6zi9kF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pLrXq/dJMcafAjqZW/7WRJ97cCkQSLhXd6zi9kF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pLrXq/dJMcafAjqZW/7WRJ97cCkQSLhXd6zi9kF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpLrXq%2FdJMcafAjqZW%2F7WRJ97cCkQSLhXd6zi9kF0%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;869&quot; height=&quot;451&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 프로젝트 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼 에디터에서 아래 순서대로 프로젝트를 생성했다.&lt;/p&gt;
&lt;pre id=&quot;code_1782203368816&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Game -&amp;gt; Third Person -&amp;gt; C++ -&amp;gt; Scalable

프로젝트 이름 : HW10&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;1192&quot; data-origin-height=&quot;839&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHcMUk/dJMcadI9Q7u/tH9KH1LOQPRrSfnv4cX0H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHcMUk/dJMcadI9Q7u/tH9KH1LOQPRrSfnv4cX0H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHcMUk/dJMcadI9Q7u/tH9KH1LOQPRrSfnv4cX0H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHcMUk%2FdJMcadI9Q7u%2FtH9KH1LOQPRrSfnv4cX0H1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1192&quot; height=&quot;839&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;839&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Test 모듈 생성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;source 폴더 안에 Test 폴더를 새로 만들어 모듈 파일을 여기 안에서 생성했다.&lt;/p&gt;
&lt;pre id=&quot;code_1782209517782&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Source/
├── HW10/          &amp;larr; 기존 주 모듈
└── Test/          &amp;larr; 새로 만든 모듈
    ├── Test.Build.cs
    ├── Test.h
    └── Test.cpp&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;603&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgRBSN/dJMcahLD8EX/lFgqD7q3UvpVXReNdriBy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgRBSN/dJMcahLD8EX/lFgqD7q3UvpVXReNdriBy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgRBSN/dJMcahLD8EX/lFgqD7q3UvpVXReNdriBy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgRBSN%2FdJMcahLD8EX%2FlFgqD7q3UvpVXReNdriBy0%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;138&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;138&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;636&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wMGwa/dJMcacKoMnM/8HfkyUfml4Q1W2Yr9jtkV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wMGwa/dJMcacKoMnM/8HfkyUfml4Q1W2Yr9jtkV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wMGwa/dJMcacKoMnM/8HfkyUfml4Q1W2Yr9jtkV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwMGwa%2FdJMcacKoMnM%2F8HfkyUfml4Q1W2Yr9jtkV0%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;636&quot; height=&quot;164&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Test.Build.cs&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;pre id=&quot;code_1782209549782&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnrealBuildTool;

public class Test : ModuleRules
{
    public Test(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;

        PublicDependencyModuleNames.AddRange(new string[]
        {
            &quot;Core&quot;,
            &quot;CoreUObject&quot;,
            &quot;Engine&quot;
        });
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Test.h / Test.cpp&lt;/h3&gt;
&lt;pre id=&quot;code_1782209566586&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Test.h
#pragma once
#include &quot;CoreMinimal.h&quot;
#include &quot;Modules/ModuleManager.h&quot;

class FTestModule : public IModuleInterface
{
public:
    virtual void StartupModule() override;
    virtual void ShutdownModule() override;
};&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1782209570455&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Test.cpp
#include &quot;Test.h&quot;

void FTestModule::StartupModule()
{
    UE_LOG(LogTemp, Warning, TEXT(&quot;=== Test Module Started! ===&quot;));
}

void FTestModule::ShutdownModule()
{
    UE_LOG(LogTemp, Warning, TEXT(&quot;=== Test Module Shutdown! ===&quot;));
}

IMPLEMENT_MODULE(FTestModule, Test);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IMPLEMENT_MODULE&lt;/b&gt; 매크로가 없으면 모듈로 등록할 수 없다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 cpp파일을 만들고 실행했을 때 오류가 발생했는데, 이 부분이 없어서 그런 것이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언리얼이 모듈을 로드할 때 이 매크로가 진입점 역할을 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Target.cs 수정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;source 폴더에 있는&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;628&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oEOHb/dJMcahdP7wH/tMtxlqiEv2AZWMBmgLpDv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oEOHb/dJMcahdP7wH/tMtxlqiEv2AZWMBmgLpDv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oEOHb/dJMcahdP7wH/tMtxlqiEv2AZWMBmgLpDv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoEOHb%2FdJMcahdP7wH%2FtMtxlqiEv2AZWMBmgLpDv0%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;628&quot; height=&quot;65&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 파일을 수정해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1782211499168&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 변경 전
ExtraModuleNames.AddRange(new string[] { &quot;HW10&quot; });

// 변경 후
ExtraModuleNames.AddRange(new string[] { &quot;HW10&quot;, &quot;Test&quot; });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;.uproject 수정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HW10.uproject 파일의 내부를 수정해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈 배열에 &quot;Test&quot; 모듈을 추가해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EdVyR/dJMcahkD1rT/8oCa9mGv6Wii93hW8UUENK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EdVyR/dJMcahkD1rT/8oCa9mGv6Wii93hW8UUENK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EdVyR/dJMcahkD1rT/8oCa9mGv6Wii93hW8UUENK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEdVyR%2FdJMcahkD1rT%2F8oCa9mGv6Wii93hW8UUENK%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;343&quot; height=&quot;253&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LoadingPhase를 PreDefault로 설정한 이유는 &lt;b&gt;주 모듈(HW10)보다 Test모듈이 먼저 로드되어야&lt;/b&gt; 주 모듈에서 Test모듈의 클래스를 사용할 수 있기 때문이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TestActor 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈의 동작을 확인하기 위해서 Test모듈 안에 Actor를 만들었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttvAX/dJMcabkp0Gg/71bl1Acknl1KHchhVKckz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttvAX/dJMcabkp0Gg/71bl1Acknl1KHchhVKckz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttvAX/dJMcabkp0Gg/71bl1Acknl1KHchhVKckz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttvAX%2FdJMcabkp0Gg%2F71bl1Acknl1KHchhVKckz1%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;628&quot; height=&quot;150&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1782214026154&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// TestActor.cpp
#include &quot;TestActor.h&quot;

ATestActor::ATestActor()
{
    PrimaryActorTick.bCanEverTick = false;
}

void ATestActor::BeginPlay()
{
    Super::BeginPlay();

    UE_LOG(LogTemp, Warning, TEXT(&quot;=== TestActor BeginPlay! Test Module Working! ===&quot;));

    if (GEngine)
    {
        GEngine-&amp;gt;AddOnScreenDebugMessage(-1, 5.f, FColor::Green,
            TEXT(&quot;Test Module Working!&quot;));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 이 모듈에서 Actor의 BeginPlay가 실행되면 로그가 찍히도록 했다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주 모듈에서 TestActor 스폰&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HW10.Build.cs에 Test 의존성을 추가해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1782215041319&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PublicDependencyModuleNames.AddRange(new string[]
{
    &quot;Core&quot;, &quot;CoreUObject&quot;, &quot;Engine&quot;, &quot;InputCore&quot;,
    &quot;EnhancedInput&quot;,
    &quot;Test&quot;  // 추가
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HW10Character.cpp BeginPlay에서 스폰&lt;/p&gt;
&lt;pre id=&quot;code_1782215060369&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;TestActor.h&quot;

void AHW10Character::BeginPlay()
{
    Super::BeginPlay();

    FActorSpawnParameters SpawnParams;
    GetWorld()-&amp;gt;SpawnActor&amp;lt;ATestActor&amp;gt;(
        ATestActor::StaticClass(),
        GetActorLocation(),
        FRotator::ZeroRotator,
        SpawnParams
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;모듈 결과 확인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 하면 에디터를 처음 열었을 때, 모듈의 시작로그, 에디터의 실행을 했을 때, 액터의 BeginPlay 로그가 찍혀야 한다.&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;942&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8lX29/dJMcafUDwLh/UxtngvdkaGl4hKkyiO7Kj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8lX29/dJMcafUDwLh/UxtngvdkaGl4hKkyiO7Kj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8lX29/dJMcafUDwLh/UxtngvdkaGl4hKkyiO7Kj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8lX29%2FdJMcafUDwLh%2FUxtngvdkaGl4hKkyiO7Kj1%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;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 로그가 나오는 모습을 확인할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Temporary 플러그인 만들기&lt;/h2&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;&amp;nbsp;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;플러그인 폴더 구조 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 폴더에 Plugins폴더를 만들고 내부를 다음과 같이 구성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1782215612538&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Plugins/
└── Temporary/
    ├── Content/
    ├── Source/
    │   └── Temporary/
    │       ├── Temporary.Build.cs
    │       ├── Temporary.h
    │       └── Temporary.cpp
    └── Temporary.uplugin&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Temporary.uplugin 작성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플러그인의 메타데이터를 JSON형식으로 기입하는 파일이다.&lt;/p&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;441&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/osmiv/dJMcacp40kV/pqlylKHl56JVduah5htv1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/osmiv/dJMcacp40kV/pqlylKHl56JVduah5htv1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/osmiv/dJMcacp40kV/pqlylKHl56JVduah5htv1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fosmiv%2FdJMcacp40kV%2FpqlylKHl56JVduah5htv1k%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;441&quot; height=&quot;370&quot; data-origin-width=&quot;441&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CanContatinContent 를 true&lt;/b&gt;로 설정해야 콘텐츠 브라우저에서 플러그인 폴더가 보인다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;플러그인 모듈 파일 작성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈 구조는 Test모듈과 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Temporary.Build.cs&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dicROi/dJMcaaeIJNg/lBUjX9T2n1LyUF2caFhCKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dicROi/dJMcaaeIJNg/lBUjX9T2n1LyUF2caFhCKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dicROi/dJMcaaeIJNg/lBUjX9T2n1LyUF2caFhCKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdicROi%2FdJMcaaeIJNg%2FlBUjX9T2n1LyUF2caFhCKk%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;574&quot; height=&quot;428&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PublcIncludePaths.Add(ModuleDirectory); 는 이후에 나올 include 경로의 문제때문에 이를 해결하면서 추가했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Temporary.h&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KjSl2/dJMcabR9XVS/2vXmzDtsKVr1hOaoc8SUC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KjSl2/dJMcabR9XVS/2vXmzDtsKVr1hOaoc8SUC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KjSl2/dJMcabR9XVS/2vXmzDtsKVr1hOaoc8SUC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKjSl2%2FdJMcabR9XVS%2F2vXmzDtsKVr1hOaoc8SUC1%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;414&quot; height=&quot;270&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;270&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Temporary.cpp&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmOtlt/dJMcahEQhXi/NDf0upvUOKFjACMzB8NG6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmOtlt/dJMcahEQhXi/NDf0upvUOKFjACMzB8NG6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmOtlt/dJMcahEQhXi/NDf0upvUOKFjACMzB8NG6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmOtlt%2FdJMcahEQhXi%2FNDf0upvUOKFjACMzB8NG6k%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;545&quot; height=&quot;318&quot; data-origin-width=&quot;545&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;.uproject에 플러그인 등록&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 uproject 파일에서 Plugins 항목에 Temporary를 추가했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xuWSe/dJMb99Um6AM/CaIC1F71szKQIGxkH3K6Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xuWSe/dJMb99Um6AM/CaIC1F71szKQIGxkH3K6Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xuWSe/dJMb99Um6AM/CaIC1F71szKQIGxkH3K6Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxuWSe%2FdJMb99Um6AM%2FCaIC1F71szKQIGxkH3K6Tk%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;455&quot; height=&quot;339&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;플러그인 활용 - CharacterData클래스&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Temporary 플러그인 안에 UCharacterData 클래스를 만들어 캐릭터의 데이터를 저장하게 하고, 주 모듈의 캐릭터에서 해당 데이터를 출력해보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UCharacterData.h&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NPqfO/dJMcabdw7QP/UrZwsA6IXeBTWvQ09CdB90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NPqfO/dJMcabdw7QP/UrZwsA6IXeBTWvQ09CdB90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NPqfO/dJMcabdw7QP/UrZwsA6IXeBTWvQ09CdB90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNPqfO%2FdJMcabdw7QP%2FUrZwsA6IXeBTWvQ09CdB90%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;576&quot; height=&quot;552&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;UCharacterData.cpp&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cta9xe/dJMcaalpFd8/xhRrf2ePL1tA5gahw8jyRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cta9xe/dJMcaalpFd8/xhRrf2ePL1tA5gahw8jyRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cta9xe/dJMcaalpFd8/xhRrf2ePL1tA5gahw8jyRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcta9xe%2FdJMcaalpFd8%2FxhRrf2ePL1tA5gahw8jyRk%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;654&quot; height=&quot;171&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UObject를 상속받는 이유는 가비지컬렉터가 메모리를 자동 관리하고, UPROPERTY 매크로를 사용할 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 struct나 일반 class로는 이런 기능을 사용할 수 없다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;캐릭터에서 Data 사용&lt;/h3&gt;
&lt;pre id=&quot;code_1782216254866&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// HW10Character.h
#include &quot;CharacterData.h&quot;

// 클래스 안에 변수 선언
UPROPERTY()
TObjectPtr&amp;lt;UCharacterData&amp;gt; CharacterData;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1782216261567&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// HW10Character.cpp BeginPlay
void AHW10Character::BeginPlay()
{
    Super::BeginPlay();

    CharacterData = NewObject&amp;lt;UCharacterData&amp;gt;(this);

    if (IsValid(CharacterData))
    {
        FString Message = FString::Printf(
            TEXT(&quot;=== CharacterData: Name: %s | HP: %.0f | Speed: %.0f | Level: %d ===&quot;),
            *CharacterData-&amp;gt;CharacterName,
            CharacterData-&amp;gt;MaxHealth,
            CharacterData-&amp;gt;MoveSpeed,
            CharacterData-&amp;gt;Level
        );

        GEngine-&amp;gt;AddOnScreenDebugMessage(-1, 10.f, FColor::Yellow, Message);
        UE_LOG(LogTemp, Warning, TEXT(&quot;%s&quot;), *Message);
    }
}&lt;/code&gt;&lt;/pre&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;h3 data-ke-size=&quot;size23&quot;&gt;트러블슈팅 - include 경로를 찾지 못하는 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HW10Character.cpp 부분에서 에러가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1782216375478&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Error C1083: Cannot open include file: 'CharacterData.h': No such file or directory&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 오류의 원인은 HW10 모듈이 Temporary 플러그인의 헤더 파일 경로를 알지 못해서 나오는 오류이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 두 가지를 수정해서 해결했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Temporary.Build.cs에 include 경로 추가&lt;/h4&gt;
&lt;pre id=&quot;code_1782216422453&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.IO;  // 추가

// Build.cs 생성자 안에 추가
PublicIncludePaths.Add(ModuleDirectory);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 Build.cs 부분에서 잠깐 나왔던 부분이다.&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;ModuleDirectory는 Build.cs가 있는 폴더의 절대 경로를 자동으로 반환하는 내장변수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 이 모듈에 의존하는 다른 모듈들도 해당 경로를 include 경로로 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HW10.Build.cs에 Temporary 의존성 추가&lt;/h4&gt;
&lt;pre id=&quot;code_1782216507738&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PublicDependencyModuleNames.AddRange(new string[]
{
    &quot;Core&quot;, &quot;CoreUObject&quot;, &quot;Engine&quot;, &quot;InputCore&quot;,
    &quot;EnhancedInput&quot;, &quot;Test&quot;,
    &quot;Temporary&quot;  // 추가
});&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;최종 결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/em3eim/dJMb997Ukcv/OvXSi5kt7deoNHsEvL1bxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/em3eim/dJMb997Ukcv/OvXSi5kt7deoNHsEvL1bxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/em3eim/dJMb997Ukcv/OvXSi5kt7deoNHsEvL1bxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fem3eim%2FdJMb997Ukcv%2FOvXSi5kt7deoNHsEvL1bxk%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;719&quot; height=&quot;181&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 설정이 완료된 후 에디터를 켜고, PIE를 실행했을 때의 Output Log이다. 문제없이 잘 출력되는 모습을 확인할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;Build.cs, 헤더, cpp&lt;/b&gt; 세 파일이 최소 구성이다.&lt;/li&gt;
&lt;li&gt;모듈을 추가하면 &lt;b&gt;Target.cs와 .uproject&lt;/b&gt; 두 곳에 등록해야 빌드 대상이 된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LoadingPhase: PreDefault&lt;/b&gt;는 주 모듈보다 먼저 로드되어야 하는 모듈에 사용한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;StartupModule()&lt;/b&gt;은 에디터 시작 시 실행된다.&lt;/li&gt;
&lt;li&gt;플러그인은 &lt;b&gt;.uplugin 파일이 있어야&lt;/b&gt; 언리얼이 플러그인으로 인식한다.&lt;/li&gt;
&lt;li&gt;API매크로는 파일이 속한 모듈의 것을 사용해야 한다.&lt;/li&gt;
&lt;li&gt;다른 모듈의 헤더를 include 하려면&lt;b&gt; PublicIncludePaths와 PublicDependencyModuleNames&lt;/b&gt; 두 곳에 등록해야 한다.&lt;/li&gt;
&lt;li&gt;UObject를 상속받아야 &lt;b&gt;NewObject&amp;lt;&amp;gt; , UPROPERTY(), 가비지컬렉션 자동 관리&lt;/b&gt;를 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Unreal</category>
      <author>tjdgus123</author>
      <guid isPermaLink="true">https://tjdgus123.tistory.com/102</guid>
      <comments>https://tjdgus123.tistory.com/102#entry102comment</comments>
      <pubDate>Tue, 23 Jun 2026 21:13:05 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;프로그래머스 C++&amp;gt; 괄호 회전하기 풀이 (stack)</title>
      <link>https://tjdgus123.tistory.com/101</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대괄호, 중괄호, 소괄호로 이루어진 문자열 s를 왼쪽으로 x칸 회전했을 때 올바른 괄호 문자열이 되는 x의 개수를 return하는 문제이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kGLN0/dJMcacDCrYd/x03zs02wskYAUu2pmn941K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kGLN0/dJMcacDCrYd/x03zs02wskYAUu2pmn941K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kGLN0/dJMcacDCrYd/x03zs02wskYAUu2pmn941K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkGLN0%2FdJMcacDCrYd%2Fx03zs02wskYAUu2pmn941K%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;240&quot; height=&quot;240&quot; data-origin-width=&quot;240&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 문자열 회전&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x칸을 회전하는 것은 왼쪽 앞부분을 잘라 뒤에 붙이면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1782181349220&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;[](){}&quot; 를 2칸 회전
뒷부분: s.substr(2)    = &quot;(){}&quot;
앞부분: s.substr(0, 2) = &quot;[]&quot;
회전 결과 = &quot;(){}&quot; + &quot;[]&quot; = &quot;(){}[]&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1782181357466&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string rotated = s.substr(x) + s.substr(0, x);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 올바른 괄호 판별 (스택 사용)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여는 괄호를 stack에 push, 닫는 괄호는 스택의 top과 짝이 맞는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 문자를 처리한 후, 스택이 0이 되면 올바른 괄호라고 판단한다.&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;닫는 괄호가 나왔는데 스택이 비어있다면 false이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택 top이 대응하는 여는 괄호가 아니여도 false이다.&lt;/p&gt;
&lt;pre id=&quot;code_1782181456459&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;([)]&quot; 경우
( &amp;rarr; push
[ &amp;rarr; push
) &amp;rarr; top이 [ &amp;rarr; 짝 불일치 

&quot;)(&quot; 경우
) &amp;rarr; 스택 비어있음 &amp;rarr; 즉시&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1782181467587&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;stack&amp;gt;
using namespace std;

bool IsValid(string s)
{
    stack&amp;lt;char&amp;gt; st;
    for(char c : s)
    {
        if(c == '(' || c == '[' || c == '{')
            st.push(c);
        else
        {
            if(st.empty()) return false;
            char top = st.top();
            st.pop();
            if(c == ')' &amp;amp;&amp;amp; top != '(') return false;
            if(c == ']' &amp;amp;&amp;amp; top != '[') return false;
            if(c == '}' &amp;amp;&amp;amp; top != '{') return false;
        }
    }
    return st.empty();
}

int solution(string s) {
    int answer = 0;

    for(int i = 0; i &amp;lt; s.size(); ++i)
    {
        string rotated = s.substr(i) + s.substr(0, i);
        if(IsValid(rotated))
            answer++;
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 흐름&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 문자열 회전&lt;/h4&gt;
&lt;pre id=&quot;code_1782181486500&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string rotated = s.substr(i) + s.substr(0, i);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i칸 회전한 문자열을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;s.substr(i)는 i번째부터 끝까지, s.substr(0, i)는 앞에서부터 i까지이다. 두 개를 합치면 i칸 왼쪽으로 회전한 결과가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 여는 괄호 push&lt;/h4&gt;
&lt;pre id=&quot;code_1782181921860&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(c == '(' || c == '[' || c == '{')
    st.push(c);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여는 괄호를 stack에 push한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 닫는 괄호 체크&lt;/h4&gt;
&lt;pre id=&quot;code_1782181993892&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(st.empty()) return false;
char top = st.top();
st.pop();
if(c == ')' &amp;amp;&amp;amp; top != '(') return false;
if(c == ']' &amp;amp;&amp;amp; top != '[') return false;
if(c == '}' &amp;amp;&amp;amp; top != '{') return false;&lt;/code&gt;&lt;/pre&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;1. 스택이 비어있는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 스택이 비어있으면 짝이 없는 괄호이다.&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;2. 스택 top이 대응하는 여는 괄호가 아닌가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이 경우에는 괄호가 일치하지 않는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 최종 판별&lt;/h4&gt;
&lt;pre id=&quot;code_1782182069656&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return st.empty();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 문자를 처리한 후 스택이 비어있으면 올바른 괄호이다. 이 경우에 IsValid()함수에서 true를 반환한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;149:1-149:47;2262-2308&quot;&gt;x칸 회전은 s.substr(x) + s.substr(0, x)로 구현한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;150:1-150:55;2309-2363&quot;&gt;괄호 판별은 스택으로한다. 여는 괄호는 push, 닫는 괄호는 top과 짝 확인 후 pop한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;151:1-151:39;2364-2402&quot;&gt;닫는 괄호 체크 시 스택이 비어있는 경우도 반드시 처리해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmers</category>
      <author>tjdgus123</author>
      <guid isPermaLink="true">https://tjdgus123.tistory.com/101</guid>
      <comments>https://tjdgus123.tistory.com/101#entry101comment</comments>
      <pubDate>Tue, 23 Jun 2026 11:35:40 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;프로그래머스 C++&amp;gt; 귤 고르기 풀이 (unordered_map, greedy)</title>
      <link>https://tjdgus123.tistory.com/100</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;귤 k개를 골라 상자에 담을 때 크기 종류의 수를 최소화하는 문제이다.&lt;/p&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;487&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOcNcO/dJMcajimVcm/KXQLQt77WvuCyTJerq3XcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOcNcO/dJMcajimVcm/KXQLQt77WvuCyTJerq3XcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOcNcO/dJMcajimVcm/KXQLQt77WvuCyTJerq3XcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOcNcO%2FdJMcajimVcm%2FKXQLQt77WvuCyTJerq3XcK%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;487&quot; height=&quot;230&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1, 3, 2, 5, 4, 5, 2, 3]에서 크기별로 개수를 세면 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1782097421940&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;2 &amp;rarr; 2개
3 &amp;rarr; 2개
5 &amp;rarr; 2개
1 &amp;rarr; 1개
4 &amp;rarr; 1개&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개수 많은 순으로 정렬하면 [2, 2, 2, 1, 1,]&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;k = 6이면 2 + 2 + 2 = 6으로 세 종류를 담을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 해결 흐름&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;unordered_map으로 크기별 개수를 센다.&lt;/li&gt;
&lt;li&gt;개수만 꺼내 내림차순으로 정렬한다.&lt;/li&gt;
&lt;li&gt;개수가 많은 순서대로 k에서 빼며 종류 수를 센다.&lt;/li&gt;
&lt;li&gt;k가 0이하가 되는 순간 종료한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1782097516327&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;unordered_map&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

int solution(int k, vector&amp;lt;int&amp;gt; tangerine) {
    int answer = 0;
    unordered_map&amp;lt;int, int&amp;gt; ans;

    for(int fruit : tangerine)
        ans[fruit]++;

    vector&amp;lt;int&amp;gt; count;
    for(auto const&amp;amp; pair : ans)
        count.push_back(pair.second);

    sort(count.begin(), count.end(), greater&amp;lt;int&amp;gt;());

    for(int cnt : count)
    {
        k -= cnt;
        answer++;
        if(k &amp;lt;= 0) break;
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;unordered_map VS map&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개수를 세는 자료구조로 map과 unordered_map을 고민한 끝에 unordered_map을 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 자료구조의 차이는 다음과 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&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;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;map&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;unordered_map&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;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&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;O(log N)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(1) 평균&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;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&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;이 문제에선 귤 크기(key) 기준 정렬이 필요 없고 단순히 개수만 세면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map을 써도 정답 처리는 되겠지만 키를 자동 정렬하는 과정이 들어가 O(N log N)이 소요된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unordered_map을 사용하면 개수를 세는 과정을 O(N)으로 최적화할 수 있어 훨씬 빠르다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 흐름&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 크기별 개수 세기&lt;/h4&gt;
&lt;pre id=&quot;code_1782097977867&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;unordered_map&amp;lt;int, int&amp;gt; ans;
for(int fruit : tangerine)
    ans[fruit]++;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;귤 크기를 키, 개수를 값으로 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unordered_map을 이용해서 O(N)으로 처리할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 개수만 추출해서 내림차순 정렬&lt;/h4&gt;
&lt;pre id=&quot;code_1782098018010&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vector&amp;lt;int&amp;gt; count;
for(auto const&amp;amp; pair : ans)
    count.push_back(pair.second);

sort(count.begin(), count.end(), greater&amp;lt;int&amp;gt;());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크기는 상관없이 종류만 계산하면 되므로 pair.second만 꺼내 사용한다.&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;greater&amp;lt;int&amp;gt;()를 이용하면 내림차순 정렬이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 그리디 방식으로 담기&lt;/h4&gt;
&lt;pre id=&quot;code_1782098107143&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int cnt : count)
{
    k -= cnt;
    answer++;
    if(k &amp;lt;= 0) break;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개수가 많은 순서대로 k에서 빼면서 종류 수를 센다.&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;k가 0이하가 되는 순간 k개를 다 채운 것이므로 종료한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;134:1-134:44;2174-2217&quot;&gt;종류 수를 최소화하려면 개수가 많은 크기부터 담는 그리디 전략을 사용한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;135:1-135:54;2218-2271&quot;&gt;단순 개수 세기에는 map보다 unordered_map이 O(N)으로 더 효율적이다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;136:1-136:33;2272-2304&quot;&gt;크기(키)는 필요 없으므로 개수(값)만 꺼내 정렬한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmers</category>
      <category>c++</category>
      <category>Greedy</category>
      <category>sort</category>
      <category>unordered_map</category>
      <author>tjdgus123</author>
      <guid isPermaLink="true">https://tjdgus123.tistory.com/100</guid>
      <comments>https://tjdgus123.tistory.com/100#entry100comment</comments>
      <pubDate>Mon, 22 Jun 2026 12:16:18 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;프로그래머스 C++&amp;gt; 멀리 뛰기 풀이 (피보나치)</title>
      <link>https://tjdgus123.tistory.com/99</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 번에 1칸 또는 2칸을 뛸 수 있을 때, n칸을 이동하는 방법의 수를 1234567로 나눈 나머지를 return하는 문제이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh2pXA/dJMcabLrrGO/FvzRMUwhdkXMzffOdfAQR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh2pXA/dJMcabLrrGO/FvzRMUwhdkXMzffOdfAQR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh2pXA/dJMcabLrrGO/FvzRMUwhdkXMzffOdfAQR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh2pXA%2FdJMcabLrrGO%2FFvzRMUwhdkXMzffOdfAQR0%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;1536&quot; height=&quot;539&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이 아이디어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n칸에 도달하는 방법을 생각해보면, 마지막 점프가 1칸이었거나 2칸이었거나 둘 중 하나이다.&lt;/p&gt;
&lt;pre id=&quot;code_1781745479713&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;f(n) = f(n-1) + f(n-2)&lt;/code&gt;&lt;/pre&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;초기값은&lt;/p&gt;
&lt;pre id=&quot;code_1781745510368&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;f(1) = 1  &amp;rarr;  (1칸)
f(2) = 2  &amp;rarr;  (1+1칸), (2칸)&lt;/code&gt;&lt;/pre&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;&lt;a href=&quot;https://tjdgus123.tistory.com/95&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://tjdgus123.tistory.com/95&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1781745537386&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;&amp;lt;프로그래머스 C++&amp;gt; 피보나치 수 풀이(재귀 함수)&quot; data-og-description=&quot;문제F(0) = 0F(1) = 1 일때 F(n) = F(n-1) + (n-2)인 피보나치 수열에서 n번째 수를 1234567로 나눈 나머지를 return하는 문제이다.풀이 아이디어처음엔 재귀함수로 접근했다.int Fib(int n) { if(n 재귀 방식은 구현&quot; data-og-host=&quot;tjdgus123.tistory.com&quot; data-og-source-url=&quot;https://tjdgus123.tistory.com/95&quot; data-og-url=&quot;https://tjdgus123.tistory.com/95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/chgExc/dJMb9kUbYni/mWVBohLV33MmcowsWwmLz0/img.png?width=800&amp;amp;height=335&amp;amp;face=0_0_800_335,https://scrap.kakaocdn.net/dn/cHadKX/dJMb9llf9cw/kaKa87HZKas0wpan8zfSh1/img.png?width=800&amp;amp;height=335&amp;amp;face=0_0_800_335&quot;&gt;&lt;a href=&quot;https://tjdgus123.tistory.com/95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tjdgus123.tistory.com/95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/chgExc/dJMb9kUbYni/mWVBohLV33MmcowsWwmLz0/img.png?width=800&amp;amp;height=335&amp;amp;face=0_0_800_335,https://scrap.kakaocdn.net/dn/cHadKX/dJMb9llf9cw/kaKa87HZKas0wpan8zfSh1/img.png?width=800&amp;amp;height=335&amp;amp;face=0_0_800_335');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;프로그래머스 C++&amp;gt; 피보나치 수 풀이(재귀 함수)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제F(0) = 0F(1) = 1 일때 F(n) = F(n-1) + (n-2)인 피보나치 수열에서 n번째 수를 1234567로 나눈 나머지를 return하는 문제이다.풀이 아이디어처음엔 재귀함수로 접근했다.int Fib(int n) { if(n 재귀 방식은 구현&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tjdgus123.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제에서 푼 것 것처럼 반복문으로 해결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀로 구현하면 직관적이지만 n이 최대 2000이므로 중복 계산이 폭발적으로 늘어나 시간 초과가 발생한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1781745588251&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

long long solution(int n) {
    if(n &amp;lt;= 1) return n;

    long long a = 1, b = 1;
    for(int i = 2; i &amp;lt;= n; ++i)
    {
        long long c = (a + b) % 1234567;
        a = b;
        b = c;
    }
    return b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 흐름&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 초기값 설정&lt;/h4&gt;
&lt;pre id=&quot;code_1781746112762&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(n &amp;lt;= 1) return n;
long long a = 1, b = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a = f(1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b = f(2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루프 시작전, f(1)과 f(2)를 각각 담아둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 반복문으로 피보나치 계산&lt;/h4&gt;
&lt;pre id=&quot;code_1781746174833&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i = 2; i &amp;lt;= n; ++i)
{
    long long c = (a + b) % 1234567;
    a = b;
    b = c;
}&lt;/code&gt;&lt;/pre&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;n = 4일때,&lt;/p&gt;
&lt;pre id=&quot;code_1781746191823&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;초기: a=1(f1), b=1(f2)

i=2: c=(1+1)%1234567=2  &amp;rarr;  a=1, b=2   f(2)=2
i=3: c=(1+2)%1234567=3  &amp;rarr;  a=2, b=3   f(3)=3
i=4: c=(2+3)%1234567=5  &amp;rarr;  a=3, b=5   f(4)=5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루프가 i=n에서 끝날 때 b에 f(n)이 담겨있는 모습이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 결과&lt;/h4&gt;
&lt;pre id=&quot;code_1781746219143&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return b;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 b를 리턴한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;% 1234567을 매번 하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n이 최대 2000일 때, 피보나치 수는 천문학적으로 커져 long long으로도 표현이 불가능할 정도이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학적으로도 &lt;b&gt;(a + b) % m - ((a % m) + (b % m)) % m&lt;/b&gt; 이 성립하므로, 매번 나눠줘도 최종 결과가 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 중간에 나눠주는 것이 overflow를 방지할 수도 있어 계속 나눠주는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1781746328619&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;마지막에 한 번만 나누면
f(2000) = 천문학적으로 큰 수 &amp;rarr; overflow &amp;rarr; 틀린 답

매번 나누면
c = (a + b) % 1234567  // 항상 1234567 미만으로 유지 &amp;rarr; 정확한 답&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;126:1-126:63;1681-1743&quot;&gt;멀리 뛰기 경우의 수는 피보나치 수열과 동일한 점화식 f(n) = f(n-1) + f(n-2)을 따른다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;127:1-127:26;1744-1769&quot;&gt;재귀 대신 반복문으로 O(n)에 해결한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;128:1-128:44;1770-1813&quot;&gt;overflow 방지를 위해 매 반복마다 % 1234567을 적용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmers</category>
      <author>tjdgus123</author>
      <guid isPermaLink="true">https://tjdgus123.tistory.com/99</guid>
      <comments>https://tjdgus123.tistory.com/99#entry99comment</comments>
      <pubDate>Thu, 18 Jun 2026 10:32:28 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;프로그래머스 C++&amp;gt; n개의 최소공배수 (유클리스 호제법)</title>
      <link>https://tjdgus123.tistory.com/98</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n개의 수들의 배수 중 공통이 되는 가장 작은 최소공배수를 구하는 문제이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MDFRW/dJMcad3pREK/fGAK6Os2WL7ndc1tNWMAR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MDFRW/dJMcad3pREK/fGAK6Os2WL7ndc1tNWMAR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MDFRW/dJMcad3pREK/fGAK6Os2WL7ndc1tNWMAR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMDFRW%2FdJMcad3pREK%2FfGAK6Os2WL7ndc1tNWMAR0%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;227&quot; height=&quot;187&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&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;pre id=&quot;code_1781664272586&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LCM(a, b) = a * b / GCD(a, b)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GCD는 최대공약수, LCM은 최소공배수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 공식을 이용해서 구해볼 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GCD와 LCM&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;GCD(최대공약수)&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_1781664478585&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;12 = 2&amp;sup2; &amp;times; 3
 8 = 2&amp;sup3;

공통 인수: 2
2&amp;sup2;로 나누면 &amp;rarr; 12/4=3, 8/4=2 (true)
2&amp;sup3;으로 나누면 &amp;rarr; 12/8=1.5 (false)

GCD = 2&amp;sup2; = 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;LCM(최소공배수)&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_1781664513722&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;12 = 2&amp;sup2; &amp;times; 3
 8 = 2&amp;sup3;

2&amp;sup3; &amp;times; 3 = 24
24 / 12 = 2 (true)
24 / 8  = 3 (true)

LCM = 2&amp;sup3; &amp;times; 3 = 24&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1781664571607&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

int Gcd(int a, int b) {
    while(b) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

int Lcm(int a, int b)
{
    return a / Gcd(a, b) * b;
}

int solution(vector&amp;lt;int&amp;gt; arr) {
    int answer = arr[0];

    for(int i = 1; i &amp;lt; arr.size(); ++i)
        answer = Lcm(answer, arr[i]);

    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 흐름&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. GCD - 유클리드 호제법&lt;/h4&gt;
&lt;pre id=&quot;code_1781664593152&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int Gcd(int a, int b) {
    while(b) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GCD(a, b) = GCD(b, a%b) 원리를 반복문으로 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b가 0이 되는 순간의 a가 최대공약수이다.&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;예시로 a = 12, b = 8일 때의 코드의 흐름을 표현하면 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1781664640481&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a=12, b=8  &amp;rarr;  temp=8, b=12%8=4, a=8
a=8,  b=4  &amp;rarr;  temp=4, b=8%4=0,  a=4
a=4,  b=0  &amp;rarr;  종료
return 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. LCM()&lt;/h4&gt;
&lt;pre id=&quot;code_1781664659734&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int Lcm(int a, int b)
{
    return a / Gcd(a, b) * b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a * b / GCD 의 공식을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a * b를 먼저 계산하면&lt;b&gt; Overflow가 발생할 수 있으므로&lt;/b&gt; 먼저 나누고 곱하는 순서로 작성했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. n개의 LCM 계산&lt;/h4&gt;
&lt;pre id=&quot;code_1781664715431&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int answer = arr[0];
for(int i = 1; i &amp;lt; arr.size(); ++i)
    answer = Lcm(answer, arr[i]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 원소를 초기값으로 설정하고, 두 수씩 순서대로 LCM을 적용한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;179:1-179:51;2219-2269&quot;&gt;GCD는 유클리드 호제법 GCD(a, b) = GCD(b, a % b)으로 구한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;180:1-180:73;2270-2342&quot;&gt;LCM 공식은 a * b / GCD(a, b)이며, overflow 방지를 위해 a / GCD * b 순서로 계산한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;181:1-181:35;2343-2377&quot;&gt;n개의 LCM은 두 수씩 순서대로 LCM을 적용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmers</category>
      <author>tjdgus123</author>
      <guid isPermaLink="true">https://tjdgus123.tistory.com/98</guid>
      <comments>https://tjdgus123.tistory.com/98#entry98comment</comments>
      <pubDate>Wed, 17 Jun 2026 11:52:31 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;프로그래머스 C++&amp;gt; 예상 대진표 풀이 ( ceil() )</title>
      <link>https://tjdgus123.tistory.com/97</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;토너먼트 대회에서 N명이 참가하고, 매 라운드마다 인접한 번호끼리 대결한다. 그리고 이기는 사람이 다음 라운드에 올라간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A번 참가자와 B번 참가자가 몇 번째 라운드에서 만나는지 return하는 문제이다.&lt;/p&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;644&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNiFNb/dJMcafG0IAd/IDPhLFDOKAk4QsQxSGIXc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNiFNb/dJMcafG0IAd/IDPhLFDOKAk4QsQxSGIXc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNiFNb/dJMcafG0IAd/IDPhLFDOKAk4QsQxSGIXc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNiFNb%2FdJMcafG0IAd%2FIDPhLFDOKAk4QsQxSGIXc1%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;644&quot; height=&quot;361&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이 아이디어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매 라운드마다 참가자 번호가 절반으로 줄어든다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A와 B의 번호를 매 라운드마다 갱신하면서 두 번호가 갈라지는 순간이 만나는 라운드이다.&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;다음 라운드에서의 번호는 ceil(번호 / 2.0)으로 갱신한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpeTpW/dJMcagFVYDA/GHOwQz9OSqm1wsrWonD2q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpeTpW/dJMcagFVYDA/GHOwQz9OSqm1wsrWonD2q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpeTpW/dJMcagFVYDA/GHOwQz9OSqm1wsrWonD2q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpeTpW%2FdJMcagFVYDA%2FGHOwQz9OSqm1wsrWonD2q0%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;688&quot; height=&quot;488&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1781574454319&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1번&amp;harr;2번 &amp;rarr; 이긴 사람은 다음 라운드 1번  &amp;rarr;  ceil(1/2.0)=1, ceil(2/2.0)=1
3번&amp;harr;4번 &amp;rarr; 이긴 사람은 다음 라운드 2번  &amp;rarr;  ceil(3/2.0)=2, ceil(4/2.0)=2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A = 4, B = 7을 예시로 들어보면&lt;/p&gt;
&lt;pre id=&quot;code_1781574477974&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1라운드: a=ceil(4/2.0)=2,  b=ceil(7/2.0)=4  &amp;rarr;  2 &amp;ne; 4
2라운드: a=ceil(2/2.0)=1,  b=ceil(4/2.0)=2  &amp;rarr;  1 &amp;ne; 2
3라운드: a=ceil(1/2.0)=1,  b=ceil(2/2.0)=1  &amp;rarr;  1 == 1 (true) &amp;rarr; 3라운드에서 만남&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1781574493525&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;cmath&amp;gt;
using namespace std;

int solution(int n, int a, int b)
{
    int round = 0;
    while(1)
    {
        round++;
        a = ceil(a / 2.0);
        b = ceil(b / 2.0);
        if(a == b) break;
    }
    return round;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Ceil()을 쓰는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Ceil()&lt;/b&gt;은 &amp;lt;cmath&amp;gt; 헤더에 정의된 함수로 올림 연산을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올림 연산 말고도 다음과 같은 함수들이 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&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;ceil(x)&lt;/td&gt;
&lt;td&gt;올림&lt;/td&gt;
&lt;td&gt;ceil(3.5) = 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;floor(x)&lt;/td&gt;
&lt;td&gt;내림&lt;/td&gt;
&lt;td&gt;floor(3.5) = 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;round(x)&lt;/td&gt;
&lt;td&gt;반올림&lt;/td&gt;
&lt;td&gt;round(3.5) = 4&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;이 중에서 Ceil() 함수를 쓴 이유는 토너먼트에서 홀수 번호는 승리해서 다음 라운드로 넘어가게 되면 올림된 번호를 받게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1781576082513&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;7번 &amp;rarr; ceil(7/2.0) = ceil(3.5) = 4번&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 2.0으로 나누는 이유는 int / int 나눗셈은 정수 나눗셈이 되어 소수점이 버려지기 때문이다.&lt;/p&gt;
&lt;pre id=&quot;code_1781576104510&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;7 / 2   = 3   (정수 나눗셈 &amp;mdash; 내림)
7 / 2.0 = 3.5 (실수 나눗셈 &amp;mdash; ceil 적용 가능)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소수점이 버려지게 되면 올림 연산이 불가능해져 2.0으로 나누는 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 흐름&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 라운드 반복&lt;/h4&gt;
&lt;pre id=&quot;code_1781576133408&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while(1)
{
    round++;
    a = ceil(a / 2.0);
    b = ceil(b / 2.0);
    if(a == b) break;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매 라운드마다 a와 b를 다음 라운드 번호로 갱신한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번호가 같아지면 그 라운드에서 만나는 것이다. 따라서 번호가 같아질 때 break로 반복문을 빠져나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 두 사람이 만나는 조건&lt;/h4&gt;
&lt;pre id=&quot;code_1781576183803&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(a == b) break;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 설명과 같이 같은 번호가 되었다는 것은 같은 조에 배정되었다는 의미이기 때문에 이 시점의 round를 return하면 그게 정답이 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;트러블슈팅&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;a와 b의 갱신 방식을 잘못 선택함&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 a와 b를 이런식으로 갱신했다.&lt;/p&gt;
&lt;pre id=&quot;code_1781576319868&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;float A;
A = ceil(a / 2.0);  
a /= 2;          //정수 나눗셈으로&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ceil로 계산한 값과 정수 나눗셈으로 갱신한 값이 달라서 일부는 맞고 일부는 틀린 결과가 나왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 매개변수를 ceil로 갱신하는 방법으로 통일해서 이 오류를 수정했다.&lt;/p&gt;
&lt;pre id=&quot;code_1781576373111&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 수정한 부분
a = ceil(a / 2.0);
b = ceil(b / 2.0);&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;134:1-134:37;1982-2018&quot;&gt;다음 라운드 번호는 ceil(번호 / 2.0)으로 구한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;135:1-135:45;2019-2063&quot;&gt;int / int는 정수 나눗셈이므로 반드시 2.0으로 나눠야 한다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;136:1-136:35;2064-2098&quot;&gt;a == b가 되는 순간이 매칭되는 라운드이므로 그 때의 round를 리턴한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmers</category>
      <author>tjdgus123</author>
      <guid isPermaLink="true">https://tjdgus123.tistory.com/97</guid>
      <comments>https://tjdgus123.tistory.com/97#entry97comment</comments>
      <pubDate>Tue, 16 Jun 2026 11:20:15 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;프로그래머스 C++&amp;gt; 카펫 풀이 (브루트포스)</title>
      <link>https://tjdgus123.tistory.com/96</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중앙은 &quot;노란색&quot;, 테두리 1줄은 &quot;갈색&quot;인 격자 모양 카펫에서 갈색 격자 수 brown과 노랜삭 격자 수 yellow가 주어질 때, 카펫의 가로/세로 크기를 return하는 문제이다.&lt;/p&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;379&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTbzNZ/dJMcac4v3Pd/19hx1ncldpaUJtcXWQEd0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTbzNZ/dJMcac4v3Pd/19hx1ncldpaUJtcXWQEd0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTbzNZ/dJMcac4v3Pd/19hx1ncldpaUJtcXWQEd0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTbzNZ%2FdJMcac4v3Pd%2F19hx1ncldpaUJtcXWQEd0k%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;379&quot; height=&quot;193&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이 아이디어&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가로를 w, 세로를 h라고 하면 두 가지 관계식을 세울 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 전체 크기&lt;/h4&gt;
&lt;pre id=&quot;code_1781495710093&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;w * h = brown + yellow&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 갈색 테두리 수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테두리는 위 / 아래 / 좌 / 우 한 줄씩인데, 네 모서리는 중복으로 계산되기 때문에 4를 뺀다.&lt;/p&gt;
&lt;pre id=&quot;code_1781495720308&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;■ ■ ■ ■
■ □ □ ■
■ ■ ■ ■

위쪽:   w개
아래쪽: w개
왼쪽:   h개
오른쪽: h개
&amp;rarr; 2*w + 2*h - 4 (모서리 4개 중복 제거)

2*w + 2*h - 4 = brown&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;브루트포스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두 식을 연립해서 풀어도 가능하지만, 브루트포스 방식으로 접근하면 더 간단해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;w * h = total이므로, w와 h는 total의 약수의 쌍과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;h를 1부터 늘려가면서 total %&amp;nbsp; == 0인 경우에 brown 조건을 체크하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1781495957565&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;total = 12 (brown=10, yellow=2)

약수 쌍 탐색:
h=1: w=12  &amp;rarr;  2*12+2*1-4=22  &amp;ne; 10
h=2: w=6   &amp;rarr;  2*6+2*2-4=12   &amp;ne; 10
h=3: w=4   &amp;rarr;  2*4+2*3-4=10   == 10  &amp;rarr; [4, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가로가 세로보다 크거나 같아야 하므로 w &amp;lt; h가 되는 순간 더 이상 탐색할 필요가 없다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1781496001794&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

vector&amp;lt;int&amp;gt; solution(int brown, int yellow) {
    vector&amp;lt;int&amp;gt; answer;
    int total = brown + yellow;

    for(int h = 1; h &amp;lt;= total; ++h)
    {
        if(total % h == 0)
        {
            int w = total / h;
            if(w &amp;lt; h) break;

            if(2*w + 2*h - 4 == brown)
            {
                answer = {w, h};
                break;
            }
        }
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 흐름&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 전체 크기 계산&lt;/h4&gt;
&lt;pre id=&quot;code_1781496079612&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int total = brown + yellow;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 격자 수를 구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;w*h = total&lt;/b&gt;이므로 w와 h는 total의 약수의 쌍이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 약수 쌍 탐색&lt;/h4&gt;
&lt;pre id=&quot;code_1781496112225&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int h = 1; h &amp;lt;= total; ++h)
{
    if(total % h == 0)
    {
        int w = total / h;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;h를 1부터 늘려가면서 total을 나누어 떨어지는 경우에만 처리한다(약수인 경우).&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지가 0이면 h가 약수이고,&lt;b&gt; w = total / h&lt;/b&gt;로 가로길이를 구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 가로 세로 조건&lt;/h4&gt;
&lt;pre id=&quot;code_1781496162161&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(w &amp;lt; h) break;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 조건에서 가로가 세로보다 크거나 같아야 한다는 조건이 있었다. h가 커질수록 w는 작아지므로 w &amp;lt; h가 되는 순간 이후 약수 쌍은 모두 세로가 길어져 조건을 만족하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이후부터는 break로 탐색을 종료한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. brown 조건 체크&lt;/h4&gt;
&lt;pre id=&quot;code_1781496467890&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(2*w + 2*h - 4 == brown)
{
    answer = {w, h};
    break;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테두리 공식&lt;b&gt; 2 * w + 2 * h - 4가 brown&lt;/b&gt;과 일치하게 되면 정답이다. {w, h} 순서로 반환한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;145:1-145:50;2101-2150&quot;&gt;테두리 갈색 수는 &lt;b&gt;2 * w + 2 * h - 4&lt;/b&gt;로 표현된다&lt;/li&gt;
&lt;li data-sourcepos=&quot;146:1-146:45;2151-2195&quot;&gt;w * h = total이므로 h의 &lt;b&gt;약수 쌍을 브루트포스&lt;/b&gt;로 탐색한다&lt;/li&gt;
&lt;li data-sourcepos=&quot;147:1-147:39;2196-2234&quot;&gt;w &amp;lt; h가 되는 순간 break해서 불필요한 탐색을 줄인다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmers</category>
      <author>tjdgus123</author>
      <guid isPermaLink="true">https://tjdgus123.tistory.com/96</guid>
      <comments>https://tjdgus123.tistory.com/96#entry96comment</comments>
      <pubDate>Mon, 15 Jun 2026 13:08:43 +0900</pubDate>
    </item>
    <item>
      <title>&amp;lt;프로그래머스 C++&amp;gt; 피보나치 수 풀이(재귀 함수)</title>
      <link>https://tjdgus123.tistory.com/95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F(0) = 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F(1) = 1 일때 F(n) = F(n-1) + (n-2)인 피보나치 수열에서 n번째 수를 1234567로 나눈 나머지를 return하는 문제이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOyZ32/dJMcabdo3kQ/dGMxn8bt2kMJo87yTg1KcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOyZ32/dJMcabdo3kQ/dGMxn8bt2kMJo87yTg1KcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOyZ32/dJMcabdo3kQ/dGMxn8bt2kMJo87yTg1KcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOyZ32%2FdJMcabdo3kQ%2FdGMxn8bt2kMJo87yTg1KcK%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;206&quot; height=&quot;152&quot; data-origin-width=&quot;206&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&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;pre id=&quot;code_1781229649819&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int Fib(int n) {
    if(n &amp;lt; 2) return n;
    return Fib(n-1) + Fib(n-2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀 방식은 구현이 직관적이라서 사용하기 좋지만 시간복잡도가&amp;nbsp;&lt;b&gt;O(2^n)&lt;/b&gt;이라 n이 커질수록 급격히 느려진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fib(5)만 호출해도 Fib(3)이 2번 Fib(2)가 3번이 중복 호출되어 매우 비효율적이다.&lt;/p&gt;
&lt;pre id=&quot;code_1781229736924&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Fib(5)
├── Fib(4)
│   ├── Fib(3)  &amp;larr; 중복
│   └── Fib(2)  &amp;larr; 중복
└── Fib(3)      &amp;larr; 중복
    └── Fib(2)  &amp;larr; 중복&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n이 최대 100,000인 이 문제에서 재귀함수를 쓰면 시간 초과가 발생할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 반복문으로 바꿔 O(n)으로 해결하려고 한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1781229778757&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

int Fib(int n)
{
    if(n &amp;lt; 2) return n;
    int a = 0, b = 1;
    for(int i = 2; i &amp;lt;= n; ++i)
    {
        int c = (a + b) % 1234567;
        a = b;
        b = c;
    }
    return b % 1234567;
}

int solution(int n) {
    return Fib(n);
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;나머지를 매번 나누는 이유?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에서는 &quot;n번째 피보나치 수를 1234567로 나눈 나머지를 return&quot; 하라고 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 처음엔 n번째 수까지 피보나치를 적용한 후 마지막에 나눈 수를 return했다.&amp;nbsp;&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 data-ke-size=&quot;size16&quot;&gt;n = 100,000일 때 피보나치수는 천문학적으로 커져 int는 물론, long long으로도 표현이 불가능한 숫자가 된다.&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 data-ke-size=&quot;size16&quot;&gt;수학적으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(a + b) % m = ((a % m) + (b % m)) % m&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1781230224110&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 마지막에 한 번만 나누면
Fib(100000) = 천문학적으로 큰 수 &amp;rarr; overflow &amp;rarr; 오답

// 매번 나누면
c = (a + b) % 1234567  // 매 반복시 1234567 미만으로 유지 &amp;rarr; 정답&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드 흐름&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 초기값 설정&lt;/h4&gt;
&lt;pre id=&quot;code_1781230245352&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int a = 0, b = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀함수 기준 &lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;a는&amp;nbsp;&lt;/span&gt;F(n-2), b는 F(n-1)&lt;/b&gt;을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀 함수의 조건 중 하나인 명확한 이탈 조건을 명시해야 하기 때문에 시작값인 F(0) = 0과 F(1) = 1로 초기화해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 반복문으로 피보나치 계산&lt;/h4&gt;
&lt;pre id=&quot;code_1781230337237&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i = 2; i &amp;lt;= n; ++i)
{
    int c = (a + b) % 1234567;
    a = b;
    b = c;
}&lt;/code&gt;&lt;/pre&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;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&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;a&lt;/td&gt;
&lt;td&gt;F(n-2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;F(n-1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;F(n) = a + b&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;예시로 Fib(5)라고 했을 때,&lt;/p&gt;
&lt;pre id=&quot;code_1781230419481&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;초기: a=0(F0), b=1(F1)

i=2: c = a+b = 0+1 = 1           &amp;rarr; a=b=1,  b=c=1   // a=F(1), b=F(2)
i=3: c = a+b = 1+1 = 2           &amp;rarr; a=b=1,  b=c=2   // a=F(2), b=F(3)
i=4: c = a+b = 1+2 = 3           &amp;rarr; a=b=2,  b=c=3   // a=F(3), b=F(4)
i=5: c = a+b = 2+3 = 5           &amp;rarr; a=b=3,  b=c=5   // a=F(4), b=F(5)

return b = 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매 반복마다 a &amp;rarr; b &amp;rarr; c 순서로 한 칸씩 앞으로 당겨지는 구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c를 먼저 계산한 뒤 a=b, b=c 순서로 대입해야 한다. 순서가 바뀌면 a가 덮어씌워져서 c계산이 틀어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 결과 반환&lt;/h4&gt;
&lt;pre id=&quot;code_1781230432498&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return b % 1234567;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 결과도 한 번 더 나눠서 반환한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;처음 코드&lt;/h4&gt;
&lt;pre id=&quot;code_1781231222582&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(a &amp;gt; 1234567)
{
    a %= 1234567;
    b %= 1234567;
}
int c = a + b;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 두 가지 문제가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 1 - 조건이 틀림&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a &amp;gt; 1234567 일 때만 나머지 연산을 하게 되면, a가 1234566, b가 그보다 더 큰 수이면 더했을 때 범위를 벗어나게 되어 매번 나눠주는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 2 - 나누는 시점이 늦다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781231343090&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// a와 b를 먼저 나누고
a %= 1234567;
b %= 1234567;
// 그 다음 더함
int c = a + b;  // 여기서도 overflow 가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a와 b를 따로따로 나눠도 더하는 순간 다시 범위를 넘을 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;덧셈과 나머지 연산을 동시에 처리해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1781231368801&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int c = (a + b) % 1234567;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;195:1-195:56;3099-3154&quot;&gt;재귀 방식은 O(2^n)으로 n이 클 때 시간 초과가 발생한다. 반복문으로 O(n)으로 줄인다&lt;/li&gt;
&lt;li data-sourcepos=&quot;196:1-196:69;3155-3223&quot;&gt;(a + b) % m = ((a % m) + (b % m)) % m이 성립하므로 매번 나눠도 최종 결과가 동일하다&lt;/li&gt;
&lt;li data-sourcepos=&quot;197:1-197:33;3224-3256&quot;&gt;매번 나머지 연산을 적용해 overflow를 방지한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programmers</category>
      <author>tjdgus123</author>
      <guid isPermaLink="true">https://tjdgus123.tistory.com/95</guid>
      <comments>https://tjdgus123.tistory.com/95#entry95comment</comments>
      <pubDate>Fri, 12 Jun 2026 11:29:44 +0900</pubDate>
    </item>
  </channel>
</rss>