<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>나의 브을로오그으</title>
    <link>https://moneybugger.tistory.com/</link>
    <description>그냥 쓰기 시작한 블로그~</description>
    <language>ko</language>
    <pubDate>Tue, 30 Jun 2026 00:49:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>__jhp_+</managingEditor>
    <image>
      <title>나의 브을로오그으</title>
      <url>https://tistory1.daumcdn.net/tistory/5171356/attach/b2468faf4ecd4e1c972a165dd31267f7</url>
      <link>https://moneybugger.tistory.com</link>
    </image>
    <item>
      <title>#0. 이펙티브 코틀린</title>
      <link>https://moneybugger.tistory.com/209</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;914&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwr8sU/btsFUpx9Pzq/5XBn9BmmsAdKcVMqBucwOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwr8sU/btsFUpx9Pzq/5XBn9BmmsAdKcVMqBucwOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwr8sU/btsFUpx9Pzq/5XBn9BmmsAdKcVMqBucwOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdwr8sU%2FbtsFUpx9Pzq%2F5XBn9BmmsAdKcVMqBucwOk%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;1458&quot; height=&quot;914&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;914&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;/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;</description>
      <category>책과함께/이펙티브 코틀린</category>
      <category>이펙티브코틀린</category>
      <author>__jhp_+</author>
      <guid isPermaLink="true">https://moneybugger.tistory.com/209</guid>
      <comments>https://moneybugger.tistory.com/209#entry209comment</comments>
      <pubDate>Tue, 19 Mar 2024 09:31:47 +0900</pubDate>
    </item>
    <item>
      <title>#1. 에러 핸들링</title>
      <link>https://moneybugger.tistory.com/208</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 윈도우즈 함수의 대표적인 반환 자료형&lt;/b&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: 22.7907%;&quot;&gt;자료형&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;실패했을 때의 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;VOID&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;이 함수는 절대 실패 x, 아주 적은 수의 윈도우즈 함수만이 VOID 반환 자료형을 가짐.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;BOOL&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;함수 실패 시 FALSE(0), 성공 시 FALSE(0)이 아닌 값. 그렇기 때문에 TRUE와 비교 하지 말 것.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;HANDLE&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;함수가 실패하면 반환 값은 대개 NULL 이다.&lt;br /&gt;성공 시에는 유효한 오브젝트 핸들을 반환한다. 몇몇 함수들은 INVALID_HANDLE_VALUE(-1)를&lt;br /&gt;반환하는 경우가 있기 때문에 주의가 필요하다. 문서를 꼼꼼히 볼것.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;PVOID&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;함수가 실패하면 NULL을 반환. 성공 시 데이터를 저장하고 있는 메모리 주소를 가리킴.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 22.7907%;&quot;&gt;LONG/DWORD&lt;/td&gt;
&lt;td style=&quot;width: 77.2093%;&quot;&gt;이러한 종류의 함수는 대개 개수 같은 것을 반환한다.&lt;br /&gt;만약 개수 반환에 실패하면 대개 0이나 -1을 반환한다. 문서를 꼼꼼히 볼것.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 함수가 실패하면 왜 함수가 실패했는지의 여부를 알아내는 과정이 반드시 필요하다. 마이크로 소프트는 발생할 가능성이 있는 모든 에러 코드를 32비트 숫자로 정의해 두었다.&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;윈도우 함수가 실패하게 되면 내부적으로 함수를 호출한 스레드의 스레드의 지역 저장소(thread-local storage)에 적절한 에러 코드를 저장해 둔다. 이러한 매커니즘을 통해 여러 개의 스레드가 동시에 수행될 경우라도 상호간에 영향을 미치지 않고 각 스레드별로 에러 코드를 유지할 수 있게 된다. 호출한 함수가 실패한 것으로 판단되면 어떤 에러가 발생했는지 확인하기 위해 GetLastError 함수를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709961284946&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DWORD GetLastError();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 단순히 가장 최근에 호출된 함수의 에러 코드를 스레드 지역 저장소(thread-local storage)로부터 가져온다.&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;2) 에러코드의 구조&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메시지 ID(GetLastError 함수의 반환 값과 비교할 수 있도록 정의된 매크로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메시지 텍스트(영어로 된 에러 설명)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 에러 코드(메시지 ID 대신 이 값을 직접 사용해서는 안 된다.)&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;에러 발생 시 에러 코드를 획득하기 위해 바로 GetLastError() 함수를 호출해야 한다. 이 함수를 호출하기 전에 다른 함수를 호출하게 되면 다른 함수의 수행 결과가 겹쳐 써지게 된다. (함수 호출이 성공하면 ERROR_SUCCESS를 에러 코드로 기록한다.)&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;설령 함수 호출에 성공하였더라도 성공 사유가 다를 수 있기 때문에 마이크로소프트에서는 비슷한 매커니즘으로 지정해 놓았다. 몇몇 함수의 경우 함수 호출이 성공해도 부가적인 성공의 이유를 확인하기 위해 GetLastError()를 이용할 것을 명확하게 기술하고 있다.&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;3) 디버깅 수행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버깅 수행 동안에 스레드 지역 저장소(thread-local storage)에 기록된 에러 코드를 지속적으로 확인할 수 있으면 편리한데, 마이크로소프트의 Visual Studio 내에 포함된 디버거는 Watch 창을 통해 현재 수행중인 스레드의 마지막 에러 코드와 메시지 텍스트를 확인할 수 있는 기능을 제공하고 있다. 이를 위해 Watch 창에&amp;nbsp;&lt;b&gt;$err, hr&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) FormatMessage&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709961743898&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DWORD FormatMessage(
  [in]           DWORD   dwFlags,
  [in, optional] LPCVOID lpSource,
  [in]           DWORD   dwMessageId,
  [in]           DWORD   dwLanguageId,
  [out]          LPTSTR  lpBuffer,
  [in]           DWORD   nSize,
  [in, optional] va_list *Arguments
);&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;언어 식별자&lt;/b&gt;를 인자로 받기 때문에 언어 식별자에 준하는 언어로 메시지 텍스트를 구성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 최초에는 애플리케이션 개발자가 메시지를 번역하고 번역된 메시지를 스트링 테이블 리소스 형태로 .exe나 DLL 모듈에 포함시켜야 하지만, 이 함수를 통해서 그중 적절한 것을 선택할 수 있다.&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;size18&quot;&gt;&lt;b&gt;1. 자신만의 에러 코드를 정의하는 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709962118579&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;VOID SetLastError(DWORD dwErrCode);&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;&quot;WinError.h&quot;&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;1) 에러 코드의 의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;비트&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;31-30&lt;/td&gt;
&lt;td style=&quot;width: 23.1784%;&quot;&gt;29&lt;/td&gt;
&lt;td style=&quot;width: 10.155%;&quot;&gt;28&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;27-16&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;15-0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;내용&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;심각도&lt;/td&gt;
&lt;td style=&quot;width: 23.1784%;&quot;&gt;마이크로소프트/고객&lt;/td&gt;
&lt;td style=&quot;width: 10.155%;&quot;&gt;예약됨&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;식별 코드&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;예외 코드&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;0 = 성공&lt;br /&gt;1 = 정보&lt;br /&gt;2 = 주의&lt;br /&gt;3 = 에러&lt;/td&gt;
&lt;td style=&quot;width: 23.1784%;&quot;&gt;0 = 마이크로소프트&lt;br /&gt;가 정의한 코드&lt;br /&gt;1 = 고객이 정의한&lt;br /&gt;코드&lt;/td&gt;
&lt;td style=&quot;width: 10.155%;&quot;&gt;항상 0&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;256까지는&lt;br /&gt;마이크로소프트에&lt;br /&gt;의해 예약 됨.&lt;/td&gt;
&lt;td style=&quot;width: 16.6667%;&quot;&gt;마이크로소프트&lt;br /&gt;나 고객이 정의&lt;br /&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;마이크로소프트가 정의한 모든 에러 코드는 29번째 비트를 0으로 설정할 것을 규정하기 때문에 에러 코드를 직접 만드는 경우에는 겹치지 않는 것을 보장받으려면 1로 설정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. ErrorShow 예제 애플리케이션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[UI]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FboIt/btsFFSBeXHv/BNKB8A7d4qYxTxvFwhEAO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FboIt/btsFFSBeXHv/BNKB8A7d4qYxTxvFwhEAO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FboIt/btsFFSBeXHv/BNKB8A7d4qYxTxvFwhEAO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFboIt%2FbtsFFSBeXHv%2FBNKB8A7d4qYxTxvFwhEAO1%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;341&quot; height=&quot;104&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. EditControl&lt;/b&gt;: Sample이라고 작성된 EditBox의 경우 ID는 IDC_ERRORCODE이며, 해당 BOX에는 ErrorCode를 작성.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2&lt;/b&gt;. &lt;b&gt;Button&lt;/b&gt;: 해당 버튼 클릭 시 에러 코드에 맞는 메시지를 찾아서 하단의 EditControl에 표시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. EditControl&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[코드 분석]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1709962463896&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 에러코드를 획득
DWORD dwError = GetDlgItemInt(hWnd, IDC_ERRORCODE, NULL, FALSE);

// 에러 메시지를 저장하기 위한 버퍼
HLOCAL hLocal = NULL;

// 윈도우 메시지 문자열을 얻기 위해 기본 시스템 지역을 설정한다.
DWORD systemLocal = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);

// 에러 코드의 메시지를 가져온다.
BOOL fOk = FormatMessage(
	         	FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
         		FORMAT_MESSAGE_ALLOCATE_BUFFER, 
         		NULL, dwError, systemLocale, 
         		(PTSTR) &amp;amp;hlocal, 0, NULL
           );
if (fOk == FALSE) {
	// 에러 코드의 메시지 로드 실패 시 네트워크 문제인지 확인
	HMOUDLE hDll = LocalLibraryEx(TEXT(&quot;netmsg.dll&quot;), 
    	NULL, DONT_RESOLVE_DLL_REFERENCES);
    
    if (hDll != NULL) { 
    	fOk = FormatMessage(
	         	FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
         		FORMAT_MESSAGE_ALLOCATE_BUFFER, 
         		NULL, dwError, systemLocale, 
         		(PTSTR) &amp;amp;hlocal, 0, NULL
           	  );
         FreeLibrary(hDll);
    }
    
    if (fOk &amp;amp;&amp;amp; (hLocal != NULL)) { 
        SetDlgItemText(hwnd, IDC_ERRORTEXT, (PCTSTR) LocalLock(hlocal));
        LocalFree(hlocal);
     } else {
        SetDlgItemText(hwnd, IDC_ERRORTEXT, 
           TEXT(&quot;No text found for this error number.&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Windows</category>
      <category>Window-Via-c/c++</category>
      <category>windows</category>
      <category>에러핸들링</category>
      <category>제프리리처</category>
      <author>__jhp_+</author>
      <guid isPermaLink="true">https://moneybugger.tistory.com/208</guid>
      <comments>https://moneybugger.tistory.com/208#entry208comment</comments>
      <pubDate>Sat, 9 Mar 2024 14:49:29 +0900</pubDate>
    </item>
    <item>
      <title>[c++] 10026번 : 적록색약</title>
      <link>https://moneybugger.tistory.com/207</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/10026&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1668584265335&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;10026번: 적록색약&quot; data-og-description=&quot;적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N&amp;times;N인 그리드의 각 칸에 R(빨강), G(초록)&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/10026&quot; data-og-url=&quot;https://www.acmicpc.net/problem/10026&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hxFnm/hyQA8fbA9G/6AJ5fMnBWUCkG8Bk9zopkk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10026&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/10026&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hxFnm/hyQA8fbA9G/6AJ5fMnBWUCkG8Bk9zopkk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;10026번: 적록색약&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N&amp;times;N인 그리드의 각 칸에 R(빨강), G(초록)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1668584319117&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;stack&amp;gt;

using namespace std;

#define MAX_SIZE			100

bool IsValidate(char ch, char picture, bool isNormal)
{
	if (isNormal == true || picture == 'B')
	{
		return ch == picture;
	}
	else
	{
		return ch == 'R' || ch == 'G';
	}
}

void CheckBoard(
	int N,
	string board[],
	bool pass[][MAX_SIZE],
	bool isNormal,
	int x, int y
) {
	int offX[] = { -1, 0, 1, 0 };
	int offY[] = { 0, -1, 0, 1 };

	stack&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; st;

	char picture = board[y][x];
	bool isPush = false;

	st.emplace(x, y);
	while (!st.empty())
	{
		pair&amp;lt;int, int&amp;gt; node = st.top();

		int curX = node.first;
		int curY = node.second;

		pass[curY][curX] = true;

		for (int i = 0; i &amp;lt; 4; ++i)
		{
			int toX = curX + offX[i];
			int toY = curY + offY[i];
			if (toX &amp;lt; 0 || toY &amp;lt; 0 || toX &amp;gt;= N || toY &amp;gt;= N || pass[toY][toX] == true) 
			{
				continue;
			}
			else
			{
				if (IsValidate(board[toY][toX], picture, isNormal) == true)
				{
					isPush = true;
					st.emplace(toX, toY);
					break;
				}
			}
		}

		if (isPush == false)
		{
			st.pop();
		}
		else
		{
			isPush = false;
		}
	}

	return;
}

int Progress(int N, string board[], bool isNormal)
{
	int result = 0;
	bool pass[MAX_SIZE][MAX_SIZE] = { false, };

	for (int i = 0; i &amp;lt; N; ++i)
	{
		for (int j = 0; j &amp;lt; N; ++j)
		{
			if (pass[i][j] == true)
			{
				continue;
			}
			else
			{
				++result;
				CheckBoard(N, board, pass, isNormal, j, i);
			}
		}
	}

	return result;
}

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

	string board[MAX_SIZE];
	int N;
	cin &amp;gt;&amp;gt; N;
	cin.ignore();
	for (int i = 0; i &amp;lt; N; ++i)
	{
		getline(cin, board[i]);
	}

	int r1 = Progress(N, board, true);
	int r2 = Progress(N, board, false);

	cout &amp;lt;&amp;lt; r1 &amp;lt;&amp;lt; ' ' &amp;lt;&amp;lt; r2 &amp;lt;&amp;lt; '\n';
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/BaekJoon</category>
      <category>10026번</category>
      <category>BOJ</category>
      <category>적록색약</category>
      <author>__jhp_+</author>
      <guid isPermaLink="true">https://moneybugger.tistory.com/207</guid>
      <comments>https://moneybugger.tistory.com/207#entry207comment</comments>
      <pubDate>Wed, 16 Nov 2022 16:38:52 +0900</pubDate>
    </item>
    <item>
      <title>[c++] 9019번 : DSLR</title>
      <link>https://moneybugger.tistory.com/206</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9019&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/9019&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666759567744&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;9019번: DSLR&quot; data-og-description=&quot;네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/9019&quot; data-og-url=&quot;https://www.acmicpc.net/problem/9019&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3QqFi/hyQlwUqxT0/BUOvXCrc0uDkKkozUF6SSk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9019&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/9019&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3QqFi/hyQlwUqxT0/BUOvXCrc0uDkKkozUF6SSk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;9019번: DSLR&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1666855630076&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;queue&amp;gt;
#include &amp;lt;string&amp;gt;

using namespace std;

string Progress(int n, int ans)
{
	bool visited[10000] = { false, };
	queue&amp;lt;pair&amp;lt;int, string&amp;gt;&amp;gt; q;
	q.emplace(n, &quot;&quot;);
	visited[n] = true;

	while (q.empty() == false)
	{
		int cur = q.front().first;
		string cmd = q.front().second;
		q.pop();
		if (cur == ans)
		{
			return cmd;
		}

		int D, S, L, R;
		D = cur * 2 % 10000;
		S = cur - 1 &amp;lt; 0 ? 9999 : cur - 1;
		L = cur % 1000 * 10 + cur / 1000;
		R = cur % 10 * 1000 + cur / 10;

		if (visited[D] == false)
		{
			visited[D] = true;
			q.emplace(D, cmd + &quot;D&quot;);
		}

		if (visited[S] == false)
		{
			visited[S] = true;
			q.emplace(S, cmd + &quot;S&quot;);
		}

		if (visited[L] == false)
		{
			visited[L] = true;
			q.emplace(L, cmd + &quot;L&quot;);
		}

		if (visited[R] == false)
		{
			visited[R] = true;
			q.emplace(R, cmd + &quot;R&quot;);
		}
	}
}

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

	vector&amp;lt;int&amp;gt; cmdLine;
	int T, n, ans;
	cin &amp;gt;&amp;gt; T;
	for (int i = 0; i &amp;lt; T; ++i)
	{
		cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; ans;
		string cmdLine = Progress(n, ans);
		cout &amp;lt;&amp;lt; cmdLine &amp;lt;&amp;lt; '\n';
	}

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/BaekJoon</category>
      <category>9019번</category>
      <category>BOJ</category>
      <category>DSLR</category>
      <author>__jhp_+</author>
      <guid isPermaLink="true">https://moneybugger.tistory.com/206</guid>
      <comments>https://moneybugger.tistory.com/206#entry206comment</comments>
      <pubDate>Thu, 27 Oct 2022 16:27:21 +0900</pubDate>
    </item>
    <item>
      <title>[c++] 7662번 : 이중 우선순위 큐</title>
      <link>https://moneybugger.tistory.com/205</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7662&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/7662&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666661523294&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;7662번: 이중 우선순위 큐&quot; data-og-description=&quot;입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/7662&quot; data-og-url=&quot;https://www.acmicpc.net/problem/7662&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7662&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/7662&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;7662번: 이중 우선순위 큐&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1666755428924&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;queue&amp;gt;

using namespace std;

#define MAX_SIZE						1'000'000
#define DELETE_MIN_INSTRUCTION			-1
#define DELETE_MAX_INSTRUCTION			1


void SyncPriorityMinQ(
	bool* invalid,
	priority_queue&amp;lt;pair&amp;lt;int, int&amp;gt;, vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;, greater&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt;&amp;amp; minQ
)
{
	while (minQ.empty() == false &amp;amp;&amp;amp; invalid[minQ.top().second] == true)
	{
		minQ.pop();
	}

	return;
}

void SyncPriorityMaxQ(
	bool* invalid,
	priority_queue&amp;lt;pair&amp;lt;int, int&amp;gt;, vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt;&amp;amp; maxQ
) {
	while (maxQ.empty() == false &amp;amp;&amp;amp; invalid[maxQ.top().second] == true)
	{
		maxQ.pop();
	}

	return;
}

void PrintQ(
	priority_queue&amp;lt;pair&amp;lt;int, int&amp;gt;, vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt;&amp;amp; maxQ,
	priority_queue&amp;lt;pair&amp;lt;int, int&amp;gt;, vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;, greater&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt;&amp;amp; minQ
) {
	bool empty = maxQ.empty() || minQ.empty();
	if (empty == true)
	{
		cout &amp;lt;&amp;lt; &quot;EMPTY&quot; &amp;lt;&amp;lt; '\n';
	}
	else
	{
		cout &amp;lt;&amp;lt; maxQ.top().first &amp;lt;&amp;lt; ' ' &amp;lt;&amp;lt; minQ.top().first &amp;lt;&amp;lt; '\n';
	}

	return;
}

void Progress(
	priority_queue&amp;lt;pair&amp;lt;int, int&amp;gt;, vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt;&amp;amp; maxQ,
	priority_queue&amp;lt;pair&amp;lt;int, int&amp;gt;, vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;, greater&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt;&amp;amp; minQ
) {
	bool invalid[MAX_SIZE] = { false, };
	int N, num;
	char order;

	cin &amp;gt;&amp;gt; N;
	for (int index = 0; index &amp;lt; N; ++index)
	{
		cin &amp;gt;&amp;gt; order &amp;gt;&amp;gt; num;
		if (order == 'I')
		{
			minQ.emplace(num, index);
			maxQ.emplace(num, index);
		}
		else if (order == 'D')
		{
			if (num == DELETE_MIN_INSTRUCTION)
			{
				SyncPriorityMinQ(invalid, minQ);
				if (minQ.empty() == false)
				{
					int del = minQ.top().second;
					invalid[del] = true;
					minQ.pop();
				}
			}
			else if (num == DELETE_MAX_INSTRUCTION)
			{
				SyncPriorityMaxQ(invalid, maxQ);
				if (maxQ.empty() == false)
				{
					int del = maxQ.top().second;
					invalid[del] = true;
					maxQ.pop();
				}
			}

		}
	}

	SyncPriorityMinQ(invalid, minQ);
	SyncPriorityMaxQ(invalid, maxQ);
	return;
}

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

	int T;
	cin &amp;gt;&amp;gt; T;
	for (int i = 0; i &amp;lt; T; ++i)
	{
		vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; v1;
		vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; v2;
		v1.reserve(MAX_SIZE);
		v2.reserve(MAX_SIZE);

		priority_queue&amp;lt;pair&amp;lt;int, int&amp;gt;, vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt; maxQ(less&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;(), move(v1));
		priority_queue&amp;lt;pair&amp;lt;int, int&amp;gt;, vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;, greater&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt; minQ(greater&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;(), move(v2));

		Progress(maxQ, minQ);
		PrintQ(maxQ, minQ);
	}

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/BaekJoon</category>
      <category>7662번</category>
      <category>BOJ</category>
      <category>이중 우선순위 큐</category>
      <author>__jhp_+</author>
      <guid isPermaLink="true">https://moneybugger.tistory.com/205</guid>
      <comments>https://moneybugger.tistory.com/205#entry205comment</comments>
      <pubDate>Wed, 26 Oct 2022 12:37:33 +0900</pubDate>
    </item>
    <item>
      <title>[c++] 7576번 : 토마토</title>
      <link>https://moneybugger.tistory.com/204</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7576&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/7576&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666333237312&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;7576번: 토마토&quot; data-og-description=&quot;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M,N &amp;le; 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/7576&quot; data-og-url=&quot;https://www.acmicpc.net/problem/7576&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bof4j8/hyQayMhrI0/o3tSdlDlcOQm4WQt0WxrYk/img.jpg?width=430&amp;amp;height=388&amp;amp;face=0_0_430_388&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7576&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/7576&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bof4j8/hyQayMhrI0/o3tSdlDlcOQm4WQt0WxrYk/img.jpg?width=430&amp;amp;height=388&amp;amp;face=0_0_430_388');&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;7576번: 토마토&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M,N &amp;le; 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1666336772530&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;queue&amp;gt;

using namespace std;

#define RIPE				1
#define NOT_RIPE			0
#define NOTHING				-1

struct Point 
{
	int m;
	int n;
};

void RipeTomato(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; tomatoBox, queue&amp;lt;Point&amp;gt;&amp;amp; ripeQ, int M, int N)
{
	Point pt = ripeQ.front();

	for (int i = 0; i &amp;lt; 2; ++i)
	{
		for (int j = -1; j &amp;lt; 2; j += 2)
		{
			int m = pt.m + (i == 0 ? j : 0);
			int n = pt.n + (i == 1 ? j : 0);
			if (m &amp;lt; 0 || n &amp;lt; 0 || m &amp;gt;= M || n &amp;gt;= N)
			{
				continue;
			}
			else
			{
				if (tomatoBox[n][m] == NOT_RIPE)
				{
					tomatoBox[n][m] = RIPE;
					ripeQ.push(Point{ m, n });
				}
			}
		}
	}

	return;
}

bool IsRipeAll(const vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; tomatoBox, int M, int N) 
{
	for (int n = 0; n &amp;lt; N; ++n)
	{
		for (int m = 0; m &amp;lt; M; ++m)
		{
			if (tomatoBox[n][m] == NOT_RIPE)
			{
				return false;
			}
		}
	}
	return true;
}

int Progress(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; tomatoBox, int M, int N)
{
	int days = 0;
	queue&amp;lt;Point&amp;gt;ripeQ;

	for (int n = 0; n &amp;lt; N; ++n)
	{
		for (int m = 0; m &amp;lt; M; ++m)
		{
			if (tomatoBox[n][m] == RIPE)
			{
				ripeQ.push(Point{ m, n });
			}
		}
	}

	while(true)
	{
		int len = ripeQ.size();
		for (int i = 0; i &amp;lt; len; ++i)
		{
			RipeTomato(tomatoBox, ripeQ, M, N);
			ripeQ.pop();
		}
		
		if (ripeQ.empty() == true)
		{
			break;
		}
		else
		{
			++days;
		}
	}

	if (IsRipeAll(tomatoBox, M, N) == false)
	{
		days = -1;
	}

	return days;
}


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

	int input, M, N, days;
	cin &amp;gt;&amp;gt; M &amp;gt;&amp;gt; N;
	vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; tomatoBox(N, vector&amp;lt;int&amp;gt;());

	for (int i = 0; i &amp;lt; N; ++i)
	{
		tomatoBox[i].reserve(M);
		for (int j = 0; j &amp;lt; M; ++j)
		{
			cin &amp;gt;&amp;gt; input;
			tomatoBox[i].push_back(input);
		}
	}
	
	days = Progress(tomatoBox, M, N);
	cout &amp;lt;&amp;lt; days &amp;lt;&amp;lt; '\n';

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/BaekJoon</category>
      <category>7576번</category>
      <category>BOJ</category>
      <category>토마토</category>
      <author>__jhp_+</author>
      <guid isPermaLink="true">https://moneybugger.tistory.com/204</guid>
      <comments>https://moneybugger.tistory.com/204#entry204comment</comments>
      <pubDate>Fri, 21 Oct 2022 16:20:31 +0900</pubDate>
    </item>
    <item>
      <title>[c++] 7569번 : 토마토</title>
      <link>https://moneybugger.tistory.com/203</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7569&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/7569&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1666154594267&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;7569번: 토마토&quot; data-og-description=&quot;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M &amp;le; 100, 2 &amp;le; N &amp;le; 100, &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/7569&quot; data-og-url=&quot;https://www.acmicpc.net/problem/7569&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dP0Kh5/hyQa5w1Bcv/5UBUm3YFkc7eKRZTCmc0Lk/img.jpg?width=402&amp;amp;height=504&amp;amp;face=0_0_402_504&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7569&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/7569&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dP0Kh5/hyQa5w1Bcv/5UBUm3YFkc7eKRZTCmc0Lk/img.jpg?width=402&amp;amp;height=504&amp;amp;face=0_0_402_504');&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;7569번: 토마토&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M &amp;le; 100, 2 &amp;le; N &amp;le; 100,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1666164482487&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;queue&amp;gt;

using namespace std;

#define RIPE			1
#define NOT_RIPE		0
#define NEVER_RIPE		-1

int tomatoBox[101][101][101] = { 0, };
int M, N, H;

struct Point3 {
	int m;
	int n;
	int h;
};

bool IsNotRipeTomato() {
	for (int h = 1; h &amp;lt;= H; ++h)
	{
		for (int n = 1; n &amp;lt;= N; ++n)
		{
			for (int m = 1; m &amp;lt;= M; ++m)
			{
				if (tomatoBox[h][n][m] == NOT_RIPE)
				{
					return true;
				}
			}
		}
	}

	return false;
}

bool IsBoundOfBox(int m, int n, int h)
{
	return h &amp;gt;= 1 &amp;amp;&amp;amp; n &amp;gt;= 1 &amp;amp;&amp;amp; m &amp;gt;= 1 &amp;amp;&amp;amp; h &amp;lt;= H &amp;amp;&amp;amp; n &amp;lt;= N &amp;amp;&amp;amp; m &amp;lt;= M;
}

void ChangeTomato(queue&amp;lt;Point3&amp;gt;&amp;amp; tomatoQ, const Point3&amp;amp; _pt)
{
	int h, n, m;
	for (int i = 0; i &amp;lt; 3; ++i)
	{
		for (int j = -1; j &amp;lt; 2; j+=2)
		{
			h = i == 2 ? _pt.h + j : _pt.h;
			n = i == 1 ? _pt.n + j : _pt.n;
			m = i == 0 ? _pt.m + j : _pt.m;
			if (IsBoundOfBox(m, n, h) == true &amp;amp;&amp;amp; tomatoBox[h][n][m] == NOT_RIPE)
			{
				tomatoBox[h][n][m] = RIPE;
				tomatoQ.push(Point3{ m, n, h });
			}
		}
	}
	return;
}

int CountOfDaysForRipeTomato(queue&amp;lt;Point3&amp;gt;&amp;amp; tomatoQ) {
	int days = 0;

	while (true)
	{
		int len = tomatoQ.size();
		for (int i = 0; i &amp;lt; len; ++i)
		{
			Point3 tomatoInfo = tomatoQ.front();
			ChangeTomato(tomatoQ, tomatoInfo);
			tomatoQ.pop();
		}

		if (tomatoQ.empty() == true)
		{
			break;
		}
		else
		{
			++days;
		}
	}

	return IsNotRipeTomato() == true ? -1 : days;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	queue&amp;lt;Point3&amp;gt; tomatoQ;
	int days;

	cin &amp;gt;&amp;gt; M &amp;gt;&amp;gt; N &amp;gt;&amp;gt; H;
	for (int h = 1; h &amp;lt;= H; ++h)
	{
		for (int n = 1; n &amp;lt;= N; ++n)
		{
			for (int m = 1; m &amp;lt;= M; ++m)
			{
				cin &amp;gt;&amp;gt; tomatoBox[h][n][m];
				if (tomatoBox[h][n][m] == RIPE)
				{
					tomatoQ.push(Point3{ m, n, h });
				}
			}
		}
	}

	days = CountOfDaysForRipeTomato(tomatoQ);
	cout &amp;lt;&amp;lt; days &amp;lt;&amp;lt; '\n';

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/BaekJoon</category>
      <category>7569번</category>
      <category>BOJ</category>
      <category>토마토</category>
      <author>__jhp_+</author>
      <guid isPermaLink="true">https://moneybugger.tistory.com/203</guid>
      <comments>https://moneybugger.tistory.com/203#entry203comment</comments>
      <pubDate>Wed, 19 Oct 2022 16:31:02 +0900</pubDate>
    </item>
    <item>
      <title>[c++] 18870번 : 좌표 압축</title>
      <link>https://moneybugger.tistory.com/202</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18870&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/18870&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664861987780&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;18870번: 좌표 압축&quot; data-og-description=&quot;수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi &amp;gt; Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/18870&quot; data-og-url=&quot;https://www.acmicpc.net/problem/18870&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hcoDV/hyP0BWHSJd/RZWSmhtKGIb335cuKLnJB1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18870&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/18870&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hcoDV/hyP0BWHSJd/RZWSmhtKGIb335cuKLnJB1/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;18870번: 좌표 압축&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi &amp;gt; Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1665529462841&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	
	vector&amp;lt;int&amp;gt; v, back;
	int N, input;
	
	cin &amp;gt;&amp;gt; N;

	v.reserve(1'000'000);
	back.reserve(1'000'000);

	for (int i = 0; i &amp;lt; N; ++i)
	{
		cin &amp;gt;&amp;gt; input;
		v.push_back(input);
		back.push_back(input);
	}

	sort(v.begin(), v.end());
	v.erase(unique(v.begin(), v.end()), v.end());

	for (int i = 0; i &amp;lt; N; ++i)
	{
		cout &amp;lt;&amp;lt; lower_bound(v.begin(), v.end(), back[i]) - v.begin() &amp;lt;&amp;lt; '\n';
	}

	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/BaekJoon</category>
      <category>18870번</category>
      <category>BOJ</category>
      <category>좌표 압축</category>
      <author>__jhp_+</author>
      <guid isPermaLink="true">https://moneybugger.tistory.com/202</guid>
      <comments>https://moneybugger.tistory.com/202#entry202comment</comments>
      <pubDate>Wed, 12 Oct 2022 08:05:58 +0900</pubDate>
    </item>
    <item>
      <title>#24. 페이지 교체(Page replacement)</title>
      <link>https://moneybugger.tistory.com/201</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Demand Paging&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * 요구되어지는 페이지만 backing store에서 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * 프로그램 실행 계속에 따라 요구 페이지가 늘어나고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;언젠가는 메모리가 가득 차게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Memory full&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * 메모리가 가득 차면 추가로 페이지를 가져오기 위해 어떤 페이지는 backing store로 몰아내고 (page-out)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * 그 빈공간으로 페이지를 가져온다 (page-in)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * 용어 : &lt;span style=&quot;color: #ee2323;&quot;&gt;victim page (기왕이면 modify되지 않는 것)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Victim Page&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 어떤 페이지를 몰아낼 것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * 시간 절약을 위해 기왕이면 modify되지 않은 페이지를 victim으로 선택 (이때 페이지 별로 modified bit를 두어 수정 여부를 체크 = dirty bit)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Page reference string&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * CPU가 내는 주소 : 100 101 102 432 612 103 104 611 612&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * Page Size : 100 byte&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * 페이지 번호 1 1 1 4 6 ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(여기서 만약 CPU가 100번지 주소를 냈는데 page default가 발생해서 backing store에서 찾아 와야 하는 상황이 생겼다고 가정해보자. 그렇다면 101주소 부터는 default가 발생하지 않는다. 왜?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;page default 발생 시 backing store에서 1번 페이지를 통째로 메모리에 올리기 때문. 즉, 100~199번지 까지 하나의 페이지이고 절대 page default가 발생 할 수 없다. )&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;=&amp;gt; 만약 모든 페이지에서 page default가 발생했다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Page reference string = 1 4 6 1 6 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Page Replacement Algorithms&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * FIFO (First-In First-Out)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * OPT (Optimal)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * LRU (Least-Recently-Used)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;First-In First-Out (FIFO)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(Victim Page를 메모리에 가장 먼저 올라온 페이지를 희생양으로 삼는다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- Simplest&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; - Idea : 초기화 코드는 더 이상 사용되지 않을 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- 예제&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * 페이지 참조열 = 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * # of frames = 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * 15 page faults&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;- Belady`s Anomaly&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; * 프레임 수 (= 메모리 용량) 증가에 PF 회수 증가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(7 0 1 은 프레임 3 개만 올릴 수 있는 메모리에 page fault가 발생하여 Page-in이 일어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이후 2번째 페이지를 참조하려고 보니 없어서 page fault가 발생하여 FIFO 알고리즘에 따라 7번째 페이지를 page-out하고 2번 페이지를 page in 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;x -&amp;gt; 7 page in&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;x -&amp;gt; 0 page in&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;x -&amp;gt; 1 page in&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;7 page out -&amp;gt; 2 page in&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;x -&amp;gt; x&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;0 page out -&amp;gt; 3 page in&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1 page out -&amp;gt; 0 page in&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;....&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이걸 생각해 보면 0페이지를 page out 하지 않았다면 3번 페이지 이후 다시 0번 페이지를 page in 하는 상황이 생기지 않았을 것이다. 이런 방식으로 페이지 참조열에 따라 15번의 페이지 fault가 발생한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/운영체제</category>
      <category>FIFO paging</category>
      <category>OS</category>
      <category>운영체제</category>
      <author>__jhp_+</author>
      <guid isPermaLink="true">https://moneybugger.tistory.com/201</guid>
      <comments>https://moneybugger.tistory.com/201#entry201comment</comments>
      <pubDate>Tue, 11 Oct 2022 08:33:06 +0900</pubDate>
    </item>
    <item>
      <title>[c++] 17626번 : Four Squares</title>
      <link>https://moneybugger.tistory.com/200</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17626&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/17626&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1664861896123&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;17626번: Four Squares&quot; data-og-description=&quot;라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32&amp;nbsp;+ 1&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/17626&quot; data-og-url=&quot;https://www.acmicpc.net/problem/17626&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DdpRh/hyP0C2m7L5/YORhiUkJGVL6dYu4QlT4qK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17626&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/17626&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DdpRh/hyP0C2m7L5/YORhiUkJGVL6dYu4QlT4qK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;17626번: Four Squares&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32&amp;nbsp;+ 1&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;pre id=&quot;code_1664861942251&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;
using namespace std;

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

	int dp[50001] = { 0, };
	int n, j, cnt = 0;
	cin &amp;gt;&amp;gt; n;
	dp[0] = 0;
	dp[1] = 1;

	for (int i = 2; i &amp;lt;= n; ++i)
	{
		dp[i] = dp[i - 1];
		for (int j = 1; j * j &amp;lt;= i; ++j)
		{
			dp[i] = dp[i] &amp;lt; dp[i - j * j] ? dp[i] : dp[i - j * j];
		}
		dp[i]++;
	}

	cout &amp;lt;&amp;lt; dp[n] &amp;lt;&amp;lt; '\n';
	return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/BaekJoon</category>
      <category>17626번</category>
      <category>BOJ</category>
      <category>Four Squares</category>
      <author>__jhp_+</author>
      <guid isPermaLink="true">https://moneybugger.tistory.com/200</guid>
      <comments>https://moneybugger.tistory.com/200#entry200comment</comments>
      <pubDate>Tue, 4 Oct 2022 14:39:18 +0900</pubDate>
    </item>
  </channel>
</rss>