<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>GetComponent&amp;lt;('0')&amp;gt;</title>
    <link>https://getcomponent.tistory.com/</link>
    <description>모든 나를 받아들이기</description>
    <language>ko</language>
    <pubDate>Mon, 6 Jul 2026 17:03:29 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>흣</managingEditor>
    <image>
      <title>GetComponent&amp;lt;('0')&amp;gt;</title>
      <url>https://t1.daumcdn.net/cfile/tistory/99FAFC3C5B5ACB9004</url>
      <link>https://getcomponent.tistory.com</link>
    </image>
    <item>
      <title>bottom-up과 top-down 형식의 DP(백준 14238)</title>
      <link>https://getcomponent.tistory.com/176</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;백준 14238번을 풀면서 깨달은 점에 대해 정리.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14238&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/14238&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 DP를 쓸 때에는 dfs 재귀함수와 조합하는 편이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 (나의 경우에만 국한되는지는 모르나) dfs 재귀는 보통 &lt;b&gt;top-down 방식&lt;/b&gt;을 단순하게 짜기 위해 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 대표적인 예로 피보나치 수열을 dfs로 구현할 때의 dp 사용이 여기에 해당하겠다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2O0KO/btsHStMMu9n/dwajYwV4WvIRrlkR4Arkgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2O0KO/btsHStMMu9n/dwajYwV4WvIRrlkR4Arkgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2O0KO/btsHStMMu9n/dwajYwV4WvIRrlkR4Arkgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2O0KO%2FbtsHStMMu9n%2FdwajYwV4WvIRrlkR4Arkgk%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;914&quot; height=&quot;317&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 꼭 재귀방식의 dfs가 top-down으로만 사용되지는 않고 bottom-top 방식으로도 충분히 사용 가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백준 14238번 문제의 경우 bottom-top으로 구현할때 dp가 해야하는 역할은 아래와 같다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n3JU9/btsHR6xQEX5/H6uML82KQh20V7LoWnfqTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3JU9/btsHR6xQEX5/H6uML82KQh20V7LoWnfqTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3JU9/btsHR6xQEX5/H6uML82KQh20V7LoWnfqTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3JU9%2FbtsHR6xQEX5%2FH6uML82KQh20V7LoWnfqTk%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;967&quot; height=&quot;360&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;360&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같이 첨부해보는 내 답안 코드&lt;/p&gt;
&lt;pre id=&quot;code_1717914362695&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//https://www.acmicpc.net/problem/14238
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;cstring&amp;gt;

using namespace std;

int dp[51][51][51][3][3]; //[a개수][b개수][c개수][전전날일한사람][전날일한사람] 일 경우 차후 조합으로 가능한지 저장,  초기화 -1
string s;
string answer;
int maximum[3]; //abc 한도

bool go(int a, int b, int c, int before2day, int before1day)
{
    int &amp;amp;ans = dp[a][b][c][before2day][before1day];
    if(a+b+c == s.size())//탈출 조건
    {
        return ans = true;
    }
    if(ans != -1)
    {
        return ans;
    }

    //A - 유효성검사 필요 X
    if(a &amp;lt; maximum[0] &amp;amp;&amp;amp; go(a+1,b,c,before1day,0))
    {
        answer = 'A' + answer;
        return ans = true;
    }
    //B
    if(b &amp;lt; maximum[1] &amp;amp;&amp;amp; before1day != 1 &amp;amp;&amp;amp; go(a,b+1,c,before1day,1))
    {
        answer = 'B' + answer;
        return ans = true;
    }
    //C
    if(c &amp;lt; maximum[2] &amp;amp;&amp;amp; before1day != 2 &amp;amp;&amp;amp; before2day != 2 &amp;amp;&amp;amp; go(a,b,c+1,before1day,2))
    {
        answer = 'C' + answer;
        return ans = true;
    }

    return ans = false;
}

int main()
{
    cin &amp;gt;&amp;gt; s;
    for(auto a : s)
    {
        maximum[a-'A']++;
    }
    memset(dp, -1, sizeof(dp));


    if(go(0,0,0,0,0))//어차피 A는 조건에 안걸리므로 일한사람이 없어도 0으로 통일함
    {
        cout &amp;lt;&amp;lt; answer;
    }
    else
    {
        cout &amp;lt;&amp;lt; -1;
    }

}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>■ 알고리즘/◻ 개념</category>
      <author>흣</author>
      <guid isPermaLink="true">https://getcomponent.tistory.com/176</guid>
      <comments>https://getcomponent.tistory.com/176#entry176comment</comments>
      <pubDate>Sun, 9 Jun 2024 15:19:26 +0900</pubDate>
    </item>
    <item>
      <title>SQL 자격검정 실전문제(노랭이) 오답 기록</title>
      <link>https://getcomponent.tistory.com/175</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;I. 데이터 모델링의 이해&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;1. 데이터 모델링의 이해&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 데이터 모델링 유의점 헷갈리는 거&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비유연성 : 프로세스와 데이터의 정의를 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;분리&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;비일관성 : 데이터와 데이터 간 상호 연관 관계 명확히 정의 - 프로세스와 테이블의 &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;연계성&lt;/span&gt;&lt;/b&gt;을 낮춰야 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5-6. 데이터베이스 스키마 구조 헷갈리는 거&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 스키마 : &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;여러&lt;/b&gt;&lt;/span&gt; 사용자 관점, View (외뷰..로 외우자)&lt;/li&gt;
&lt;li&gt;개념 스키마 : &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;통합&lt;/b&gt;&lt;/span&gt; 사용자 관점, &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;모든&lt;/b&gt;&lt;/span&gt; 사용자 관점&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. 발생시점 기준의 엔티티 분류 : 기본 &amp;gt; 중심 &amp;gt; 행위 (기중행)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;30. 비식별자 관계, 식별자 관계&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;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;식별자 관계&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;비식별자 관계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;강한 연결관계&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;약한 연결관계&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;자식 주식별자에 포함&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;자식 일반속성에 포함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;실선&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;점선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;반드시 부모 엔터티에 자식이 종속됨&lt;br /&gt;자식 주식별자 구성에 부모 주식별자 포함 필요&lt;br /&gt;상속받은 주식별자 속성을 타 엔터티에 이전 필요&lt;br /&gt;조인 관계 최소화&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;약한 종속 관계&lt;br /&gt;자식 주식별자 구성은 독립적&lt;br /&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;2. 데이터 모델과 SQL&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;35. 정규형, 정규화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규화 : '&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;논리 데이터 모델&lt;/b&gt;&lt;/span&gt;'의 일관성 확보, 중복 제거&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 120px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;제 1 정규형&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;제 2 정규형&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;제 3 정규형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;속성 중복 X, 분해되지 않는 상태&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;일반속성은 주식별자 전체에 종속&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;일반속성 간 서로 종속 X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt; 원자성 충족 &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;완전 함수적 종속 상태&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;부분 함수적 종속 X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;이행적 함수 종속 X&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 60px;&quot;&gt;한 튜플안에 여러개가 들어가있는경우 (쉼표로 구분되어 여러개가 들어간다던지)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 60px;&quot;&gt;기본키가 아닌 다른 속성에 종속된 상태를 부분 함수적 종속이라고 함&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 60px;&quot;&gt;X를 통해 Y를 알고, Y를 통해 Z를 알 수 있어서 X-&amp;gt;Z 가 성립할 때 이를 이행적 함수 종속 상태라고 함&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;49. NULL&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NULL + 숫자 = NULL&lt;/li&gt;
&lt;li&gt;NULL (비교연산자) 숫자 = &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;Unknown&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;NVL/ISNULL : NULL을 치환할 때 사용&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;레코드 간 연산 중 NULL : 무시 / 컬럼간 연산 중 NULL : NULL&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;II. SQL 기본 및 활용&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;1. SQL 기본&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. SQL 명령어들 총정리&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 224px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;명령어 종류&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;명령어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 68px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 68px;&quot;&gt;DML(Manipulation 조작)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 68px;&quot;&gt;SELECT&lt;br /&gt;INSERT&lt;br /&gt;UPDATE&lt;br /&gt;DELETE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;DCL(Control)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;GRANT&lt;br /&gt;REVOKE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 68px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 68px;&quot;&gt;DDL(Definition)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 68px;&quot;&gt;CREATE&lt;br /&gt;ALTER&lt;br /&gt;DROP&lt;br /&gt;RENMAE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;TCL(Transaction Control)&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 34px;&quot;&gt;COMMIT&lt;br /&gt;ROLLBACK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 공백 문자('') 처리 in Oracle : NULL, in SQLServer : ''(그대로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14,27. GROUP BY에서는&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ALIAS(별칭) 사용 불가&lt;/li&gt;
&lt;li&gt;NULL도 집계에 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. NULL 관련 함수&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;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;함수명&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;NVL/ISNULL(표현식1, 표현식2)&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;표현식1 이 NULL이면 표현식2의 값을 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;NULLIF(표현식1, 표현식2)&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;표현식1,2가 서로 같으면 NULL, 다르면 표현식1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;COALESCE(표현식1, 표현식2, ...)&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;NULL이 아닌 최초의 표현식, 다 NULL이면 NULL&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;37. &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;순수 관계 연산자&lt;/b&gt;&lt;/span&gt; : SELECT, PROJECT, JOIN, DIVIDE (셀프조디)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;41. A INNER JOIN B INNER JOIN C ON ~~~~~ (X)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A INNER JOIN B ON ~~~~~ INNER JOIN C ON ~~~~~ (O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;43. TABLE 간 JOIN 조건이 없으면 : CROSS JOIN 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sOfdM/btsHBm8MUkS/TlSJRj3bNWhIVN1s7nG1Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sOfdM/btsHBm8MUkS/TlSJRj3bNWhIVN1s7nG1Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sOfdM/btsHBm8MUkS/TlSJRj3bNWhIVN1s7nG1Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsOfdM%2FbtsHBm8MUkS%2FTlSJRj3bNWhIVN1s7nG1Bk%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;1080&quot; height=&quot;1080&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;49. (+) JOIN : &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;왼쪽&lt;/b&gt;&lt;/span&gt;에 붙으면&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;&amp;nbsp;RIGHT OUTER&lt;/b&gt;&lt;/span&gt;, &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;오른쪽&lt;/b&gt;&lt;/span&gt;에 붙으면 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;LEFT OUTER&lt;/b&gt;&lt;/span&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;&lt;span style=&quot;color: #009a87;&quot;&gt;2. SQL 활용&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;54. UNION 에 ORDER BY는 마지막 줄에 한 번만 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;57. SQL 집계 함수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ROLLUP : &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;전체 합계까지&lt;/b&gt;&lt;/span&gt; 누적되는 게 특징&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEmL8o/btsHBXtQMMR/825TcNohjmpJyoIiuGykF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEmL8o/btsHBXtQMMR/825TcNohjmpJyoIiuGykF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEmL8o/btsHBXtQMMR/825TcNohjmpJyoIiuGykF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEmL8o%2FbtsHBXtQMMR%2F825TcNohjmpJyoIiuGykF0%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;501&quot; height=&quot;259&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;CUBE : &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;모든 조합&lt;/b&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E3ToA/btsHBBdyC4Y/moztm5Rp840VlA06bImQTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E3ToA/btsHBBdyC4Y/moztm5Rp840VlA06bImQTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E3ToA/btsHBBdyC4Y/moztm5Rp840VlA06bImQTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE3ToA%2FbtsHBBdyC4Y%2Fmoztm5Rp840VlA06bImQTk%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;659&quot; height=&quot;296&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;GROUPING SETS : &lt;b&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;소그룹에 대한 합계만 (조합하지 않음)&lt;/span&gt;&lt;/b&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rjSz0/btsHDhdAaHK/0PPl0FqVGYeakQ60D7XvTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rjSz0/btsHDhdAaHK/0PPl0FqVGYeakQ60D7XvTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rjSz0/btsHDhdAaHK/0PPl0FqVGYeakQ60D7XvTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrjSz0%2FbtsHDhdAaHK%2F0PPl0FqVGYeakQ60D7XvTk%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;546&quot; height=&quot;161&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;GROUPING : 집계결과에 대해 &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;1&lt;/b&gt;&lt;/span&gt;을 가지므로, CASE WHEN으로 1일 때 NULL을 변경하는데 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;70. EXISTS, NOT EXISTS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;SELECT 1 ?&lt;/b&gt;&lt;/span&gt; SELECT가 불필요해서 그냥 넣는 값이라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;72. 연관/비연관 서브쿼리&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;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;연관&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;비연관&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;서브쿼리가 메인쿼리 컬럼을 가지고 있는 형태&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;서브쿼리가 메인쿼리 컬럼을 가지고 있지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;메인쿼리의 조건을 확인 목적&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;메인쿼리에 값을 제공하기 위한 목적&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;지옥의 서브쿼리... 모르겠다;;&lt;/b&gt;&lt;/span&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;&lt;span style=&quot;color: #009a87;&quot;&gt;3. 관리 구문&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;99. CONSTRAINT&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ALTER TABLE [테이블명] ADD CONSTRAINT [제약조건명] [제약조건]&lt;/li&gt;
&lt;li&gt;CREATE 내에서 CONSTRAINT [제약조건명] [제약조건]&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;108. &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;외래키의 참조 무결성 제약&lt;/b&gt;&lt;/span&gt; :외래키 값은 NULL이거나 참조하는 릴레이션의 기본키 값과 동일해야 한다는 제약&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;113. &lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;참조 동작&lt;/b&gt;&lt;/span&gt;&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;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;DELETE/MODIFY ACTION&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;CASACADE&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;MASTER 삭제 시 CHILD 같이 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;SET NULL&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;MASTER 삭제 시 CHILD 해당 필드 NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;SET DEFAULT&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;MASTER 삭제 시 CHILD 해당 필드 DEFAULT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;RESTRICT&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;CHILD에 PK가 없는 경우만 MASTER 삭제 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;NO ACTION&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;참조무결성을 위반하는 삭제/수정 액션을 취하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;INSERT ACTION&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;AUTOMATIC&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;MASTER 테이블에 PK가 없는 경우 MASTER PK 생성 후 CHILD 입력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;SET NULL&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;MASTER 테이블에 PK가 없는 경우 CHILD 외부키를 NULL로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;SET DEFAULT&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;MASTER 테이블에 PK가 없는 경우 CHILD 외부키를 DEFAULT로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;DEPENDENT&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;MASTER 테이블에 PK가 존재할 때만 CHILD 입력 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;NO ACTION&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;참조무결성을 위반하는 입력 액션을 취하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;119. DELETE, TRUNCATE, DROP 비교하기&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;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;DROP&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;TRUNCATE&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;DELETE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;DDL&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;DDL(일부 DML 성격)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;DML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;AUTO COMMIT(ROLLBACK X)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;AUTO COMMIT(ROLLBACK X)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;USER COMMIT(ROLLBACK O)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;정의까지 다 삭제&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;뼈대는 남김(초기 상태로)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&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;</description>
      <category>■ 기타 공부들</category>
      <author>흣</author>
      <guid isPermaLink="true">https://getcomponent.tistory.com/175</guid>
      <comments>https://getcomponent.tistory.com/175#entry175comment</comments>
      <pubDate>Sat, 25 May 2024 00:08:07 +0900</pubDate>
    </item>
    <item>
      <title>[C++]10942: 팰린드롬?</title>
      <link>https://getcomponent.tistory.com/174</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀 + dp&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간복잡도를 보기위해 최악의 경우를 본다면 숫자 2000, 질문 100만이며 0.5초를 요구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자 2000 기준으로 본다면 O(n^2)는 가능한 범위에 들어온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 2중 반복문으로 모든 숫자에 대해 팰린드롬인지 아닌지를 확인하고 이를 저장한다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 무슨 질문이 나오던지간에 O(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;모든 숫자의 조합에 접근하는 순간 O(n^2)를 충족하기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범위에 대한 펠린드롬 파악 방법은 무조건 O(1)이어야 함.&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;일단 dp[n+1][n+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;질문에서 요구하는 답의 형식(1:팰린드롬임, 0:팰린드롬아님)으로 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자가 1개일때 -&amp;gt; 1 -&amp;gt; O(1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자가 2개일때 -&amp;gt; 같으면 1, 다르면 0 -&amp;gt; O(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;숫자가 3개이상일때부터는 같은 패턴을 보이는데,&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 59.6512%; height: 22px;&quot; border=&quot;1&quot; data-sheets-root=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ff0000;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #9900ff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #9900ff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #9900ff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #9900ff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #9900ff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #9900ff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #9900ff;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;background-color: #ff0000;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 빨간색끼리 같으면 1, 다르면 0 -&amp;gt; O(1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 보라색 범위가 팰린드롬인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의 AND 조건이라는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번의 경우, 범위 크기를 1부터 늘리는 방향으로 진행해왔기 때문에 보라색 범위는 이미 전 단계에서 구해서 저장했다. 그 값을 가져오면 되니 O(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;문제는 모든 조건을 구할 때 범위가 좀 드럽다는 점인데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대각선 방향 진행으로 우상단 방향 반복문을 진행해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 한 대각선의 row, col값의 합이 같다는 점을 이용해 row, col을 관리하면 되지만...&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;map[n+1][n+1]은 -1로 모두 초기화하였다. -1은 아직 기록되지 않았다는 뜻이다.&lt;/p&gt;
&lt;pre id=&quot;code_1715082050866&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool isF2(int a, int b)
{
    if(map[a][b] != -1)	//이미 저장된 여부가 있다면
        return map[a][b];
    if(a == b)	// 숫자 1개짜리 팰린드롬의 경우
        return map[a][b] = true;
    if(a &amp;gt; b)	// 짝수개일때 서로 크로스 되는 경우 예외처리
        return true;
    if(nums[a] != nums[b])	//본격적 검사 1 - 외곽 값이 서로 같은지
        return map[a][b] = false;
    
    return map[a][b] = isF2(a+1,b-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;종료조건인 숫자 1개, 크로스 경우(이건 예외처리라 저장하지 않는다) 를 먼저 확인한다음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;펠린드롬 여부를 검사한다. 검사 항목은 2가지이고 AND이기때문에 하나씩 조건검사해도 됨&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1677386021186&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//https://www.acmicpc.net/problem/10942
using namespace std;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;

vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; map;    //1 : 펠린드롬, 0: 펠린드롬 아님, -1: 아직 기록되지 않음
vector&amp;lt;int&amp;gt; nums;

bool isF2(int a, int b)
{
    if(map[a][b] != -1)
        return map[a][b];
    if(a == b)
        return map[a][b] = true;
    if(a &amp;gt; b)
        return true;
    if(nums[a] != nums[b])
        return map[a][b] = false;
    
    return map[a][b] = isF2(a+1,b-1);
}

int main()
{
    int N; scanf(&quot;%d&quot;, &amp;amp;N);
    map.resize(N+1,vector&amp;lt;int&amp;gt;(N+1,-1)); 
    nums.resize(N+1);
    for(int i = 1; i &amp;lt;= N; i++)
        scanf(&quot;%d&quot;, &amp;amp;nums[i]);
    int M;  scanf(&quot;%d&quot;, &amp;amp;M);
    while(M--)
    {
        int a, b;   scanf(&quot;%d %d&quot;,&amp;amp;a,&amp;amp;b);
        printf(&quot;%d\n&quot;,isF2(a,b));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기억할 점&lt;/h2&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;</description>
      <category>■ 알고리즘/◻ 백준</category>
      <author>흣</author>
      <guid isPermaLink="true">https://getcomponent.tistory.com/174</guid>
      <comments>https://getcomponent.tistory.com/174#entry174comment</comments>
      <pubDate>Tue, 7 May 2024 20:44:22 +0900</pubDate>
    </item>
    <item>
      <title>[C++]15486: 퇴사 2</title>
      <link>https://getcomponent.tistory.com/173</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bottom-up 방식이면 O(n)으로 가능하고, top-down이면 O(n^2)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 시간복잡도를 가늠해보면 n은 150만이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;O(n^2) 불가능하고, O(nlongn), O(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;수익의 최대는 일단 고려하지 않는다면, 아래와 같이 생각할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 오늘 상담을 한다면? : 이 상담이 끝나는 날 : 오늘 수익 + 오늘 상담 수익&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 오늘 상담을 하지 않는다면? : 아무것도 변하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i번째 날 수익을 버는 경우의 수는 다양하며, 이 경우의 수 중에서 최대의 수익을 버는 경우를 고려하려면...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대 수익을 저장하는 행렬(이든 벡터든) dp에 접근할때마다 max값으로 갱신한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 오늘 상담을 한다면? : dp[상담끝나는날] = max(기존수익, 오늘수익+오늘상담수익)&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;내가 오늘 상담을 하지 않는다면? :&amp;nbsp; dp[내일] = max(기존수익, 오늘수익)&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일부터 n일까지 한번씩 해주면 되니까 O(n)만에 문제 해결이 가능해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;O(n)이 되는 이유는 이 문제의 특성 상, 1일부터 n일까지 순서대로 채우면 무조건 max값이 보장된다는 점 때문이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(미래의 값이 과거에 영향을 줄 수 없음 - 시간의 특성이 반영된 문제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그게 아니면 모든 경우의 수를 고려해야하니 O(n^2)이 걸렸겠지?&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+1일 이하인경우만 계산하게끔 해줘야 런타임 에러가 발생하지 않음&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1677386021186&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//https://www.acmicpc.net/problem/15486
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;
vector&amp;lt;int&amp;gt; schedule;
vector&amp;lt;int&amp;gt; pay;
vector&amp;lt;int&amp;gt; dp;


int main()
{
    int n;  scanf(&quot;%d&quot;, &amp;amp;n);
    schedule.resize(n+1,0);
    pay.resize(n+1,0);
    dp.resize(n+2,0);
    for(int i = 1; i &amp;lt;= n; i++)
    {
        scanf(&quot;%d %d&quot;,&amp;amp;schedule[i], &amp;amp;pay[i]);
    }

    for(int i = 1; i &amp;lt;= n; i++)
    {
        //상담을 한다면
        if(i+schedule[i] &amp;lt;= n+1)
            dp[i+schedule[i]] = max(dp[i+schedule[i]], dp[i]+pay[i]);
        //상담을 하지 않는다면
        dp[i+1] = max(dp[i+1],dp[i]);
    }

    printf(&quot;%d&quot;,dp[n+1]);
    return 0;
}&lt;/code&gt;&lt;/pre&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;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;</description>
      <category>■ 알고리즘/◻ 백준</category>
      <author>흣</author>
      <guid isPermaLink="true">https://getcomponent.tistory.com/173</guid>
      <comments>https://getcomponent.tistory.com/173#entry173comment</comments>
      <pubDate>Tue, 7 May 2024 19:20:24 +0900</pubDate>
    </item>
    <item>
      <title>[C++]3111번: 검열</title>
      <link>https://getcomponent.tistory.com/172</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;stack 2개를 사용하여 문자열 그대로 / 리버스 문자열 2개를 대상으로 앞 뒤 제거를 진행하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 제거 범위가 겹치지 않도록 index를 저장해서 관리해줘야 한다!&lt;/p&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;1. 검열 문자열과, 신문 문자열을 뒤집어서도 저장 - right stack을 위해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. left stack point + right stack point의 합이 신문 문자열의 크기보다 작은 동안만 stack에 넣으며 검사를 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 앞뒤로 문자열을 나누었기 때문에, 마지막에 이 문자열을 합치면서 나오는 검열 문자열이 있는지 한 번 검사 - 겸사겸사 문자열을 합치기 위해 right stack에 있는 것들을 left stack에 넣으면서 검사하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. left stack에 들어가 있는 문자열을 출력&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;//https://www.acmicpc.net/problem/3111
using namespace std;

#include &amp;lt;iostream&amp;gt;
#include &amp;lt;stack&amp;gt;
#include &amp;lt;string&amp;gt;

#define     left    0
#define     right   1

stack&amp;lt;char&amp;gt; s[2];
int p[2];
int wsize, psize;
string word[2];
string paper[2];

// 현재 stack 상단에 검열 문자열이 있는지 확인
bool isCensored(stack&amp;lt;char&amp;gt; s, string &amp;amp;word)
{
    //검열 문자열보다 stack 크기가 작음 - false
    if(s.size() &amp;lt; word.size()) return false;
    for(int i = word.size()-1; i &amp;gt;= 0; i--)
    {
        char temp = s.top();    s.pop();
        if(temp != word[i]) return false;   
    }
    return true;
}

// 문자열에서 검열 문자열의 크기만큼 pop
void popWord(stack&amp;lt;char&amp;gt; &amp;amp;s)
{
    for(int i = 0; i &amp;lt; wsize; i++)
        s.pop();
}

// stack의 값을 뒤집어서 string으로 반환
string stackReverse(stack&amp;lt;char&amp;gt; &amp;amp;s)
{
    string result;
    while(!s.empty())
    {
        result = s.top() + result;
        s.pop();
    }
    return result;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin &amp;gt;&amp;gt; word[left] &amp;gt;&amp;gt; paper[left];
    wsize = word[left].size();
    psize = paper[left].size();

    for(int i = wsize-1; i &amp;gt;= 0; i--)
    {
        word[right] += word[left][i];
    }
    for(int i = psize-1; i &amp;gt;= 0; i--)
    {
        paper[right] += paper[left][i];
    }
    while(p[left] + p[right] &amp;lt; psize)
    {
        for(int i = 0; i &amp;lt; 2; i++)  // i(0) : left, i(1) : right
        {
            while(p[left]+p[right] &amp;lt; psize)    
            {
                // if(i == 0) cout &amp;lt;&amp;lt; &quot;left &quot; &amp;lt;&amp;lt; p[i] &amp;lt;&amp;lt; endl; else cout &amp;lt;&amp;lt; &quot;right &quot;&amp;lt;&amp;lt; p[i] &amp;lt;&amp;lt; endl;
                s[i].push(paper[i][p[i]++]);  //pointer 위치의 paper char 하나를 stack에 push하고 pointer += 1
                // cout &amp;lt;&amp;lt; s[i].top() &amp;lt;&amp;lt; &quot; &quot;;
                if(isCensored(s[i], word[i]))
                {//검열 문자열 상단에서 발견
                    // cout &amp;lt;&amp;lt; word[i] &amp;lt;&amp;lt; &quot; detected&quot; &amp;lt;&amp;lt; endl;
                    popWord(s[i]);
                    break;
                }
            }
        }
    }
    // right stack 을 left stack으로 몰아넣고 검열 단어가 나오는지 마지막으로 확인
    if(!s[right].empty())
    {
        while(!s[right].empty())
        {
            s[left].push(s[right].top());
            s[right].pop();
            if(isCensored(s[left], word[left]))
            {
                // cout &amp;lt;&amp;lt; word[left] &amp;lt;&amp;lt; &quot; detected \n&quot;;
                popWord(s[left]);
            }
        }
    }

    // left stack의 값 출력
    cout &amp;lt;&amp;lt; stackReverse(s[left]) &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 비슷하게 푼 문제를 stack으로 풀었는데, stack으로 푸려다가 더 시간이 오래걸리는게 아닌가 생각이 듦&lt;br /&gt;왜냐면, stack 검사도 pop했다가, 검열문자 발견되면 pop하는데 이게 완전히 중복되는 과정이다.&lt;br /&gt;그렇다고 stack을 reference로 참조시키기에는, 검열문자가 발견되지 않을 경우 push하는 불필요한 과정이 들어가고 말음&lt;br /&gt;그래서 stack대신 string으로 바꿨더니 1372ms로 통과(아슬아슬;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;//https://www.acmicpc.net/problem/3111
using namespace std;

#include &amp;lt;iostream&amp;gt;
#include &amp;lt;stack&amp;gt;
#include &amp;lt;string&amp;gt;

#define     left    0
#define     right   1

int p[2];
int wsize, psize;
string word[2];
string paper[2];
string leftright[2];

// 현재 stack 상단에 검열 문자열이 있는지 확인
bool isCensored(string &amp;amp;s, string &amp;amp;word)
{
    int ssize = s.size();
    //검열 문자열보다 크기가 작음 - false
    if(ssize &amp;lt; wsize) return false;
    for(int i = 0; i &amp;lt; wsize; i++)
    {
        if(s[ssize - wsize + i] != word[i]) return false;
    }

    return true;
}

// 문자열에서 검열 문자열의 크기만큼 제거
void popWord(string &amp;amp;s)
{
    s = s.substr(0,s.size()-wsize);
}

// stack의 값을 뒤집어서 string으로 반환
string stackReverse(stack&amp;lt;char&amp;gt; &amp;amp;s)
{
    string result;
    while(!s.empty())
    {
        result = s.top() + result;
        s.pop();
    }
    return result;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin &amp;gt;&amp;gt; word[left] &amp;gt;&amp;gt; paper[left];
    wsize = word[left].size();
    psize = paper[left].size();

    for(int i = wsize-1; i &amp;gt;= 0; i--)
    {
        word[right] += word[left][i];
    }
    for(int i = psize-1; i &amp;gt;= 0; i--)
    {
        paper[right] += paper[left][i];
    }
    while(p[left] + p[right] &amp;lt; psize)
    {
        for(int i = 0; i &amp;lt; 2; i++)  // i(0) : left, i(1) : right
        {
            while(p[left]+p[right] &amp;lt; psize)    
            {
                // if(i == 0) cout &amp;lt;&amp;lt; &quot;left &quot; &amp;lt;&amp;lt; p[i] &amp;lt;&amp;lt; endl; else cout &amp;lt;&amp;lt; &quot;right &quot;&amp;lt;&amp;lt; p[i] &amp;lt;&amp;lt; endl;
                leftright[i] += paper[i][p[i]++];
                // cout &amp;lt;&amp;lt; s[i].top() &amp;lt;&amp;lt; &quot; &quot;;
                if(isCensored(leftright[i], word[i]))
                {//검열 문자열 상단에서 발견
                    // cout &amp;lt;&amp;lt; word[i] &amp;lt;&amp;lt; &quot; detected&quot; &amp;lt;&amp;lt; endl;
                    popWord(leftright[i]);
                    break;
                }
            }
        }
    }

    // cout &amp;lt;&amp;lt; leftright[left] &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; leftright[right] &amp;lt;&amp;lt; endl;
    // right stack 을 left stack으로 몰아넣고 검열 단어가 나오는지 마지막으로 확인
    for(int i = leftright[right].size()-1; i &amp;gt;= 0; i--)
    {
        leftright[left] += leftright[right][i];
        if(isCensored(leftright[left], word[left]))
        {
            popWord(leftright[left]);
        }
    }
    cout &amp;lt;&amp;lt; leftright[left] &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기억할 점&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다른 사람의 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;substr 대신 &lt;code&gt;leftright&lt;/code&gt;에 index를 따로 지정해주는 방법이 있다.&lt;br /&gt;즉, &lt;code&gt;leftright&lt;/code&gt; 끝에서 검열 문자열이 발견되는 경우, 이 index를 검열문자열의 크기만큼 앞으로 땡겨버리는 것이다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 30.4651%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;l&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;u&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;k&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;a&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;s&gt;&lt;b&gt;n&lt;/b&gt;&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&lt;s&gt;&lt;b&gt;e&lt;/b&gt;&lt;/s&gt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;b&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;&amp;lt;&amp;lt;&lt;/td&gt;
&lt;td style=&quot;width: 14.2857%; height: 17px;&quot;&gt;a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lukane에서 ne가 검열문자열인 경우 index가 6인데, 발견되는 순간 ne의 크기인 2만큼 빼버린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 차후 입력을 b의 위치에서부터 하면 자연스럽게 해당 부분이 무시된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력할때도 b까지만 출력하게 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 이 방법을 사용하려면 index기반 값 입력이므로 string 대신 vector나 array사용이 필요해 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(string도 index를 통한 접근이 가능하지만 기존에 미리 특정 크기만큼 할당하는게 어려우므로... -string은 크기 지정 초기화 시 빈 채로 지정이 안돼서 메모리낭비로 보임)&lt;/p&gt;</description>
      <category>■ 알고리즘/◻ 백준</category>
      <author>흣</author>
      <guid isPermaLink="true">https://getcomponent.tistory.com/172</guid>
      <comments>https://getcomponent.tistory.com/172#entry172comment</comments>
      <pubDate>Sun, 5 May 2024 12:13:05 +0900</pubDate>
    </item>
    <item>
      <title>자주쓰지만 까먹는 것들</title>
      <link>https://getcomponent.tistory.com/169</link>
      <description>&lt;h1&gt;띄어쓰기로 string 분리 저장하기&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;    std::string sentence = &amp;quot;Hello world! This is a sentence.&amp;quot;;
    std::vector&amp;lt;std::string&amp;gt; words;

    // stringstream을 사용하여 string을 띄어쓰기로 분리
    std::stringstream ss(sentence);
    std::string word;
    while (ss &amp;gt;&amp;gt; word) {
        words.push_back(word);
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;특정 구분자로 string 분리 저장하기&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;    string str = &amp;quot;apple,banana,orange&amp;quot;;
    vector&amp;lt;string&amp;gt; vec;
    stringstream ss(str);
    string token;
    while(getline(ss,token,&amp;#39;,&amp;#39;))
        vec.push_back(token);
    for(const auto&amp;amp; ele : vec)
        cout &amp;lt;&amp;lt; ele &amp;lt;&amp;lt; endl;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;파일 열어서 쓰기&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;    char arr[]= &amp;quot;Hello, World!&amp;quot;;
    std::ofstream file(&amp;quot;output.txt&amp;quot;);
    if (file.is_open()) {
        file &amp;lt;&amp;lt; arr;
        file.close();
    }&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;파일 열어서 읽어오기&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-cpp&quot;&gt;ifstream file(&amp;quot;input.txt&amp;quot;);
vector&amp;lt;string&amp;gt; row;
if(file.is_open())
{
    string str;
    while(getline(file,str))
    {
        row.push_back(str));
    }
    file.close();    &lt;/code&gt;&lt;/pre&gt;</description>
      <category>■ C++</category>
      <author>흣</author>
      <guid isPermaLink="true">https://getcomponent.tistory.com/169</guid>
      <comments>https://getcomponent.tistory.com/169#entry169comment</comments>
      <pubDate>Thu, 23 Nov 2023 08:33:01 +0900</pubDate>
    </item>
    <item>
      <title>[C++]입국심사</title>
      <link>https://getcomponent.tistory.com/166</link>
      <description>&lt;h2&gt;풀이과정&lt;/h2&gt;
&lt;h3&gt;1차 시도(실패)&lt;/h3&gt;
&lt;p&gt;먼저, times를 오름차순 정렬한 뒤, etimes라는 벡터를 만든다.&lt;br&gt;times의 index에 대응하는 심사관에게 지금 대기할 경우, 대기자의 업무가 끝나는 시간이다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;    for(int index = 0; index &amp;lt; n; index++)
    {
        int min_index = min_element(etimes.begin(),etimes.end())-etimes.begin();
        etimes[min_index] += times[min_index];
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;들어가는 사람마다 etimes이 최소값인 index를 찾고, etimes를 업데이트해준다(검사시간만큼 더함)&lt;br&gt;[사람][etimes]&lt;br&gt;[1][14,10]&lt;br&gt;[2][14,20]&lt;br&gt;[3][21,20]&lt;br&gt;[4][21,30]&lt;br&gt;[5][28,30]&lt;br&gt;[6][35,30]&lt;br&gt;모든 사람에 대한 etimes를 끝낸 후, etimes는 다음 손님의 예상 종료시간이기 때문에 times만큼 값을 빼준다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;    for(int i = 0; i &amp;lt; times.size(); i++)
        etimes[i] -= times[i];
    answer = *max_element(etimes.begin(), etimes.end());&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;그러면 [35,30]이었던 값이 [28,20]이 되겠지?&lt;br&gt;여기서 max_element값을 answer로 반환한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;테스트 1 〉통과 (0.01ms, 4.11MB)&lt;br&gt;테스트 2 〉통과 (0.10ms, 3.66MB)&lt;br&gt;테스트 3 〉통과 (2.62ms, 4.18MB)&lt;br&gt;테스트 4 〉통과 (4968.05ms, 7.66MB)&lt;br&gt;테스트 5 〉실패 (시간 초과)&lt;br&gt;테스트 6 〉실패 (시간 초과)&lt;br&gt;테스트 7 〉실패 (시간 초과)&lt;br&gt;테스트 8 〉실패 (시간 초과)&lt;br&gt;테스트 9 〉통과 (4155.45ms, 4.18MB)&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;당연하게도 시간초과가 났다.&lt;/p&gt;
&lt;h4&gt;문제 분석&lt;/h4&gt;
&lt;p&gt;위 코드의 시간복잡도는 O(n)이다. 문제는 이 n이 최대 1,000,000,000이라는 것...&lt;br&gt;내 방식에서는 시간 초과가 불가피하다.&lt;/p&gt;
&lt;h3&gt;2차 시도(성공)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;이분 탐색&lt;/strong&gt; 문제 답게, 이분 탐색으로 풀어야 한다.&lt;br&gt;탐색 기준 : 시간&lt;br&gt;&lt;code&gt;low&lt;/code&gt; : 정렬한 times의 최소값 즉 &lt;code&gt;times[0]&lt;/code&gt;&lt;br&gt;&lt;code&gt;high&lt;/code&gt; : 모든 사람 &lt;code&gt;n&lt;/code&gt;이 최악의 심사관 즉, &lt;code&gt;times[times.size()-1]&lt;/code&gt;에게 갔을 때의 시간&lt;br&gt;조건 : 주어진 시간동안 모든 검사관이 받을 수 있는 사람과 n을 비교&lt;/p&gt;
&lt;p&gt;예제로 예시를 들자면,&lt;br&gt;&lt;code&gt;low&lt;/code&gt; : 7, &lt;code&gt;high&lt;/code&gt; : 10*6 = 60&lt;br&gt;mid : (7+60)/2 = 33부터 시작&lt;/p&gt;
&lt;p&gt;1) mid : 33일 때&lt;br&gt;최대 처리 가능 사람의 수 : 33/7+33/10 = 7&lt;br&gt;n인 6과 비교했을 시 &lt;code&gt;high&lt;/code&gt; &amp;gt; 왼쪽 탐색&lt;br&gt;&lt;code&gt;high&lt;/code&gt; = &lt;code&gt;mid&lt;/code&gt;-1 = 32 갱신&lt;/p&gt;
&lt;p&gt;2) mid : (32+7)/2 = 19&lt;br&gt;최대 처리 가능 사람의 수 : 19/7+19/10 = 3&lt;br&gt;n인 6과 비교했을 시 &lt;code&gt;low&lt;/code&gt; &amp;gt; 오른쪽 탐색&lt;br&gt;&lt;code&gt;low&lt;/code&gt; = &lt;code&gt;mid&lt;/code&gt;+1 = 20 갱신&lt;/p&gt;
&lt;p&gt;3) mid : (20+32)/2 = 26&lt;br&gt;최대 처리 가능 사람의 수 : 26/7 + 27/10 = 5&lt;br&gt;n인 6과 비교했을 시 &lt;code&gt;low&lt;/code&gt; &amp;gt; 오른쪽 탐색&lt;br&gt;&lt;code&gt;low&lt;/code&gt; = &lt;code&gt;mid&lt;/code&gt;+1 = 27 갱신&lt;/p&gt;
&lt;p&gt;4) mid : (27+32)/2 = 29&lt;br&gt;최대 처리 가능 사람의 수 : 29/7 + 29/10 = 6&lt;br&gt;n인 6과 비교했을 시 같으나, low &amp;lt; high인 상황이라 high = mid-1로 재갱신&lt;/p&gt;
&lt;p&gt;5) mid : (27+28)/2 = 27&lt;br&gt;최대 처리 가능 사람의 수 : 27/7 + 27/10 = 5&lt;br&gt;n인 6과 비교했을 시 &lt;code&gt;low&lt;/code&gt; &amp;gt;오른쪽 탐색&lt;br&gt;&lt;code&gt;low&lt;/code&gt; = &lt;code&gt;mid&lt;/code&gt; + 1 = 28 갱신&lt;/p&gt;
&lt;p&gt;6) low &amp;lt;= high 조건 불만족으로 while문 탈출&lt;/p&gt;
&lt;h3&gt;주의점&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;자료형자료형자료형자료형자료형자료형자료형자료형자료형&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;범위범위범위범위범위범위범위범위범위범위범위범위범위&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;코드&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-C++&quot;&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

long long solution(int n, vector&amp;lt;int&amp;gt; times) {
    long long answer = 0;
    sort(times.begin(),times.end());
    long long low = times[0];
    long long high = (long long)*(times.end()-1) * n;
    while(low &amp;lt;= high)
    {
        long long mid = (low+high)/2;
        long long people(0);
        for(int t : times)
        {
            people += mid/t;
            if(people &amp;gt;= n) break;  //추가 연산 하지 않게
        }
        if(people &amp;gt;= n)  //go to left
        {
            high = mid-1;
            answer = mid;
        }
        else //go to right
            low = mid + 1;


    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;기억할 점&lt;/h2&gt;
&lt;h2&gt;다른사람의 풀이&lt;/h2&gt;</description>
      <category>■ 알고리즘/◻ Programmers</category>
      <author>흣</author>
      <guid isPermaLink="true">https://getcomponent.tistory.com/166</guid>
      <comments>https://getcomponent.tistory.com/166#entry166comment</comments>
      <pubDate>Wed, 3 May 2023 11:29:47 +0900</pubDate>
    </item>
    <item>
      <title>[C++]단속카메라</title>
      <link>https://getcomponent.tistory.com/165</link>
      <description>&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;routes 오름차순 정렬&lt;/li&gt;
&lt;li&gt;카메라 범위 설정풀이과정순서대로 routes를 체크하기 위해 sort해준다.&lt;br /&gt;예제&lt;code&gt;[[-20,-15], [-14,-5], [-18,-13], [-5,-3]]&lt;/code&gt;의 경우&lt;br /&gt;&lt;code&gt;[[-20,-15], [-18,-13],[-14,-5],[-5,-3]]&lt;/code&gt; 으로 정렬한단 얘기&lt;br /&gt;이후 각 자동차마다 camera 설치 가능 범위를 정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BEHC5/btsc734Glsn/cLrNjf3UZXMILLMUnzHKm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BEHC5/btsc734Glsn/cLrNjf3UZXMILLMUnzHKm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BEHC5/btsc734Glsn/cLrNjf3UZXMILLMUnzHKm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBEHC5%2Fbtsc734Glsn%2FcLrNjf3UZXMILLMUnzHKm0%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;179&quot; height=&quot;58&quot; data-origin-width=&quot;179&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 처음 자동차를 감시할 수 있는 범위&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;178&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSAdz5/btsc0YJ8rDH/6dGDh051hB9SL2mUfQ2fo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSAdz5/btsc0YJ8rDH/6dGDh051hB9SL2mUfQ2fo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSAdz5/btsc0YJ8rDH/6dGDh051hB9SL2mUfQ2fo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSAdz5%2Fbtsc0YJ8rDH%2F6dGDh051hB9SL2mUfQ2fo0%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;178&quot; height=&quot;72&quot; data-origin-width=&quot;178&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째의 경우 (-18,-15)로 줄어든다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cefYvf/btsc2XKwptP/0y0vu7IR2cAwkfaQ6cQQs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cefYvf/btsc2XKwptP/0y0vu7IR2cAwkfaQ6cQQs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cefYvf/btsc2XKwptP/0y0vu7IR2cAwkfaQ6cQQs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcefYvf%2Fbtsc2XKwptP%2F0y0vu7IR2cAwkfaQ6cQQs1%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;465&quot; height=&quot;89&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&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;검사 조건은 camera 범위의 end값과 routes[i][0] 값을 비교하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkdeGk/btsdabniWfX/jV3biehv7gYJa90oZl4am0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkdeGk/btsdabniWfX/jV3biehv7gYJa90oZl4am0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkdeGk/btsdabniWfX/jV3biehv7gYJa90oZl4am0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkdeGk%2FbtsdabniWfX%2FjV3biehv7gYJa90oZl4am0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;157&quot; data-origin-width=&quot;550&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 구현하였다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;iostream&amp;gt;

using namespace std;

int solution(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; routes) {
    int answer = 1;
    int start = 0;
    int end = 0;
    bool cam = false;
    sort(routes.begin(), routes.end());
    for(int i = 0; i &amp;lt; routes.size(); i++)
    {
        if(routes[i][0] &amp;gt; end)
        {    //현재 범위(start,end)를 벗어나는 차량
            cam = false;
            answer++;
        }

        if(cam == false)    //새로운 카메라 범위 시작
        {
            cam = true;
            start = routes[i][0];
            end = routes[i][1];
        }
        else    //카메라 범위 업데이트
        {
            start = routes[i][0];
            end = min(end, routes[i][1]);
        }
    }
    return answr;
}&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;344&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UtIA6/btsdaaBVSdG/PcC1E2J4BIo5fx2Wlogdg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UtIA6/btsdaaBVSdG/PcC1E2J4BIo5fx2Wlogdg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UtIA6/btsdaaBVSdG/PcC1E2J4BIo5fx2Wlogdg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUtIA6%2FbtsdaaBVSdG%2FPcC1E2J4BIo5fx2Wlogdg0%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;344&quot; height=&quot;318&quot; data-origin-width=&quot;344&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기억할 점&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다른사람의 풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는&amp;nbsp;시작점&amp;nbsp;정렬로&amp;nbsp;풀었는데,&amp;nbsp;끝점&amp;nbsp;정렬로&amp;nbsp;풀면&amp;nbsp;범위&amp;nbsp;start,&amp;nbsp;end에서&amp;nbsp;start가&amp;nbsp;필요치&amp;nbsp;않다.&amp;nbsp;camera의&amp;nbsp;마지막&amp;nbsp;부분과&amp;nbsp;routes[i][0]을&amp;nbsp;비교하고,&amp;nbsp;필요에&amp;nbsp;따라&amp;nbsp;routes[i][1]로&amp;nbsp;start를&amp;nbsp;갱신해주면&amp;nbsp;된다.&amp;nbsp;&amp;nbsp;bool&amp;nbsp;변수도&amp;nbsp;없이&amp;nbsp;구현이&amp;nbsp;가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1682658797884&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;

using namespace std;

bool cmp(vector&amp;lt;int&amp;gt; a, vector&amp;lt;int&amp;gt; b) { return a[1] &amp;lt; b[1]; }

int solution(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; routes) {
    int answer = 0;
    int limit = -30001;
    sort(routes.begin(), routes.end(), cmp);
    for(int i = 0; i &amp;lt; routes.size(); i++){
        if(limit &amp;lt; routes[i][0]){
            answer++;
            limit = routes[i][1];
        }
    }
    return answer;
}&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;354&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/myWnm/btsc9cmVnAk/a9ymlcw7LxCyLuCtPi25m0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/myWnm/btsc9cmVnAk/a9ymlcw7LxCyLuCtPi25m0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/myWnm/btsc9cmVnAk/a9ymlcw7LxCyLuCtPi25m0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmyWnm%2Fbtsc9cmVnAk%2Fa9ymlcw7LxCyLuCtPi25m0%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;354&quot; height=&quot;345&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>■ 알고리즘/◻ Programmers</category>
      <author>흣</author>
      <guid isPermaLink="true">https://getcomponent.tistory.com/165</guid>
      <comments>https://getcomponent.tistory.com/165#entry165comment</comments>
      <pubDate>Fri, 28 Apr 2023 14:13:48 +0900</pubDate>
    </item>
    <item>
      <title>함수 오버로딩(Function Overloading)</title>
      <link>https://getcomponent.tistory.com/164</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;함수 오버로딩&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;같은 이름의 함수&lt;/b&gt;를 &lt;b&gt;두 개 이상 정의하여 사용&lt;/b&gt;하는 것&lt;br /&gt;함수명은 같으나, &lt;b&gt;parameter list 부분이 달라야 함&lt;/b&gt;&lt;br /&gt;함수 type(X), parameter 순서(O), type(O), 개수(O), 구성 etc... parameter list가 달라야 함.&lt;br /&gt;pointer의 &lt;b&gt;const&lt;/b&gt; 여부도 다른 type으로 인식함!&lt;br /&gt;parameter type 자동형변환에 의한 호출이 가능함. 단, 대표타입에 한해서&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Default Parameter&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수의 매개변수에 기본값을 정의할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;zephir&quot;&gt;&lt;code&gt;int Function(int, int, int = 1, int = 2);

int main()
{
    Function(1,2,3,4);    //default parameter 사용 X
    Function(1,2,3);    //(1,2,3,2)
    Function(1,2);        //(1,2,1,2)
    Function(1);        //error
    Function();            //error
    Function(1,2,,4);    //error -&amp;gt; 이런 구조는 불가능
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Default Parameter를 지정하면 그 이후의 parameter는 모두 Default Parameter로 지정되어야 함!&lt;/p&gt;
&lt;pre class=&quot;go&quot;&gt;&lt;code&gt;void func(int a = 10, int b, int c);    
void func(int a = 10, int b = 20, int c);    
void func(int a, int b = 20, int c);
void func(int(a = 10; int b, int c = 30);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 경우는 모두 불가능. default parameter를 부분적으로 사용하고 싶다면 다 뒤로 빼야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 overlading과 default parameter를 같이 사용 시, 형태의 모호함이 발생한다면 컴파일 오류가 난다.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;void prn(char *);
void prn(char *, int = 10);    //error!!&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실습 with ChatGPT&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Low Difficulty&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Write a C++ program that defines a function called print that takes a single argument of type int and prints it to the console. Then overload the print function to take a single argument of type double and prints it to the console as well. Use default parameter for the double version of print, so that the user can call the function with just one argument and it will be treated as a double by default.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;/*
Write a C++ program that defines a function called print that takes a single argument of type int and prints it to the console. 
Then overload the print function to take a single argument of type double and prints it to the console as well. 
Use default parameter for the double version of print, 
so that the user can call the function with just one argument and it will be treated as a double by default.
*/
#include &amp;lt;iostream&amp;gt;
using namespace std;

void print(int n)
{
    cout &amp;lt;&amp;lt; &quot;int print&quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; endl;
}

void print(double n = 0.0)
{
    cout &amp;lt;&amp;lt; &quot;double print&quot; &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; endl;
}

int main()
{
    int num = 3;
    double num2 = 2.5;
    print(3);
    print(num2);
    print();
    print(num);
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력 결과&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int print&lt;br /&gt;3&lt;br /&gt;double print&lt;br /&gt;2.5&lt;br /&gt;double print&lt;br /&gt;0&lt;br /&gt;int print&lt;br /&gt;3&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Medium Difficulty&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Write a C++ program that defines a function called sum that takes two arguments of type int and returns their sum.&lt;br /&gt;Then overload the sum function to take three arguments of type int and return their sum.&lt;br /&gt;Use default parameters for the third argument of the sum function,&lt;br /&gt;so that the user can call the function with just two arguments and the third argument will be assumed to be 0 by default.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Code&lt;/h4&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;/*
Write a C++ program that defines a function called sum that takes two arguments of type int and returns their sum. 
Then overload the sum function to take three arguments of type int and return their sum. 
Use default parameters for the third argument of the sum function, 
so that the user can call the function with just two arguments and the third argument will be assumed to be 0 by default.
*/
#include&amp;lt;iostream&amp;gt;
using namespace std;
int sum(int a, int b, int c=0)
{
    return a+b+c;
}

int main()
{
    cout &amp;lt;&amp;lt; sum(1,2) &amp;lt;&amp;lt; endl;
    cout &amp;lt;&amp;lt; sum(2,3,4) &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;출력 결과&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3&lt;br /&gt;9&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;High Difficulty&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Write a C++ program that defines a class called Rectangle with private member variables width and height. The class should have the following public member functions:&lt;br /&gt;&lt;br /&gt;A default constructor that sets both width and height to 0.&lt;br /&gt;A constructor that takes two arguments of type int and sets width and height to those values.&lt;br /&gt;A function called area that takes no arguments and returns the area of the rectangle (width times height).&lt;br /&gt;Overload the + operator to allow adding two Rectangle objects together, which should return a new Rectangle object whose width and height are the sums of the width and height of the two operands, respectively.&lt;br /&gt;Overload the &amp;lt;&amp;lt; operator to allow outputting a Rectangle object to the console. This should print the values of width and height of the Rectangle object.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Code&lt;/h4&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;/*
Write a C++ program that defines a class called Rectangle with private member variables width and height. 
The class should have the following public member functions:

A default constructor that sets both width and height to 0.
A constructor that takes two arguments of type int and sets width and height to those values.
A function called area that takes no arguments and returns the area of the rectangle (width times height).
Overload the + operator to allow adding two Rectangle objects together, 
which should return a new Rectangle object whose width and height are the sums of the width and height of the two operands, respectively.
Overload the &amp;lt;&amp;lt; operator to allow outputting a Rectangle object to the console. 
This should print the values of width and height of the Rectangle object.
*/

#include &amp;lt;iostream&amp;gt;
using namespace std;

class Rectangle {
    int height, width;
    public:
        Rectangle() : height(0), width(0) { }
        Rectangle(int a, int b) : height(a), width(b) { }
        int area()
        {
            return height * width;
        }
        Rectangle operator+(const Rectangle &amp;amp;obj);
        friend ostream&amp;amp; operator&amp;lt;&amp;lt;(ostream&amp;amp; os, const Rectangle &amp;amp;obj);
};

Rectangle Rectangle::operator+(const Rectangle &amp;amp;obj)
{
    Rectangle temp(height + obj.height, width + obj.width);
    return temp;    
}

ostream&amp;amp; operator&amp;lt;&amp;lt;(ostream&amp;amp; os, const Rectangle &amp;amp;obj)
{
    os &amp;lt;&amp;lt; &quot;height : &quot; &amp;lt;&amp;lt; obj.height &amp;lt;&amp;lt; &quot;, width : &quot; &amp;lt;&amp;lt; obj.width &amp;lt;&amp;lt; endl;
    return os;
}

int main()
{
    Rectangle rect1;
    cout &amp;lt;&amp;lt; rect1;
    Rectangle rect2(2, 3);
    Rectangle rect3(1, 1);
    cout &amp;lt;&amp;lt; rect2;
    cout &amp;lt;&amp;lt; rect2.area() &amp;lt;&amp;lt; endl;
    Rectangle rect4 = rect2 + rect3;
    cout &amp;lt;&amp;lt; rect4.area() &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;실행 결과&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;height : 0, width : 0&lt;br /&gt;height : 2, width : 3&lt;br /&gt;6&lt;br /&gt;12&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;갑자기 연산자 오버로딩을 시켜서 좀 당황하였다.&lt;/p&gt;</description>
      <category>■ C++</category>
      <author>흣</author>
      <guid isPermaLink="true">https://getcomponent.tistory.com/164</guid>
      <comments>https://getcomponent.tistory.com/164#entry164comment</comments>
      <pubDate>Tue, 4 Apr 2023 11:09:29 +0900</pubDate>
    </item>
    <item>
      <title>[C++]모음사전</title>
      <link>https://getcomponent.tistory.com/163</link>
      <description>&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;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이과정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 이렇게 풀라고 낸 의도는 아닐텐데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학식을 세워서 풀었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자릿수마다 A,E,I,O,U가 가능하니 5를 그만큼 곱한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A _ _ _ _ 의 경우의 수는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5자리인 경우 5*5*5*5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4자리인 경우 5*5*5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3자리인 경우 5*5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2자리인 경우 5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1자리인 경우 1(5^0)&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;맨 앞자리가 E이면 A _ _ _ _ 인 경우의 수만큼 앞에 존재하는 것이라 생각해서 식을 세웠다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 54.3023%; height: 85px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.7519%; height: 85px;&quot; rowspan=&quot;5&quot;&gt;AAAAE&lt;/td&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(1-1)*(5^4+5^3+5^2+5^1) + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(1-1)*(5^3+5^2+5^1) + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(1-1)*(5^2+5^1) + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(1-1)*(5^1) + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;E&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table style=&quot;letter-spacing: 0px; border-collapse: collapse; width: 54.3023%; height: 85px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.7519%; height: 85px;&quot; rowspan=&quot;4&quot;&gt;AAAE&lt;/td&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(1-1)*(5^4+5^3+5^2+5^1) + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(1-1)*(5^3+5^2+5^1) + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(1-1)*(5^2+5^1) + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;E&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(2-1)*(5^1) + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table style=&quot;border-collapse: collapse; width: 54.4186%; height: 13px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 23px;&quot;&gt;
&lt;td style=&quot;width: 12.7519%; height: 23px;&quot;&gt;I&lt;/td&gt;
&lt;td style=&quot;width: 9.96121%; height: 23px;&quot;&gt;I&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 23px;&quot;&gt;(3-1)*(5^4+5^3+5^2+5^1) + 3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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 style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.7519%; height: 85px;&quot; rowspan=&quot;3&quot;&gt;EIO&lt;/td&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;E&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(2-1)*(5^4+5^3+5^2+5^1) + 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;I&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(3-1)*(5^3+5^2+5^1) +3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(4-1)*(5^2+5^1) + 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;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1677386021186&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

int ctoi(char c)
{
    int num;
    switch(c)
    {
        case 'A':
            num = 1;
            break;
        case 'E':
            num = 2;
            break;
        case 'I':
            num = 3;
            break;
        case 'O':
            num = 4;
            break;
        case 'U':
            num = 5;
            break;
    }
    return num;
}

int solution(string word) {
    int answer = 0;
    for(int i = 0; i &amp;lt; word.length(); i++)
    {
        int powSum = 0;
        for(int j = 4-i; j&amp;gt;0; j--)
            powSum += pow(5,j);
 
        answer += (ctoi(word[i])-1) * powSum + ctoi(word[i]);
    }
    return answer;
}&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;280&quot; data-origin-height=&quot;133&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddajkk/btr22NY6Nty/ukP4u1S2fpEXOdwLpVJyf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddajkk/btr22NY6Nty/ukP4u1S2fpEXOdwLpVJyf0/img.png&quot; data-alt=&quot;이렇게 나와서 식겁했는데 그냥 오류였다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddajkk/btr22NY6Nty/ukP4u1S2fpEXOdwLpVJyf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fddajkk%2Fbtr22NY6Nty%2FukP4u1S2fpEXOdwLpVJyf0%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;280&quot; height=&quot;133&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;133&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이렇게 나와서 식겁했는데 그냥 오류였다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5RDO1/btr3a6C1T49/Hn9hNWBKZCRjAGDa4KbrYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5RDO1/btr3a6C1T49/Hn9hNWBKZCRjAGDa4KbrYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5RDO1/btr3a6C1T49/Hn9hNWBKZCRjAGDa4KbrYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5RDO1%2Fbtr3a6C1T49%2FHn9hNWBKZCRjAGDa4KbrYK%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;303&quot; height=&quot;440&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;다른 사람의 풀이&lt;/h2&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;pre id=&quot;code_1678432277526&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;

using namespace std;

int solution(string word) {
    string v = string(&quot;AEIOU&quot;);
    int a = word.size();

    for(int i = 0, b = 1; i &amp;lt; word.size(); i++, b *= 5)
        a += v.rfind(word[i]) * 781 / b;

    return a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;v.rfind(word[i])&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;AEIOU&quot;에서 word의 각 자리수와 일치하는 index를 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 쓴 코드에서 ctoi switch문으로 장황하게 A:1 E:2 I:3 O:4 U:5 한것을 하나로 일축한 방식이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;781&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpTMuU/btr27VPX0Ww/0UZB6cnZCD5e0A7rFWs2dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpTMuU/btr27VPX0Ww/0UZB6cnZCD5e0A7rFWs2dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpTMuU/btr27VPX0Ww/0UZB6cnZCD5e0A7rFWs2dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpTMuU%2Fbtr27VPX0Ww%2F0UZB6cnZCD5e0A7rFWs2dk%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;147&quot; height=&quot;56&quot; data-origin-width=&quot;147&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어, 위 예제 중 EIO에서 'I'는 (3-1)*(5^3+5^2+5^1) +3 라는 식을 도출했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3끼리 식을 묶으면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3(5^3+5^2+5^1+5^0)-(5^3+5^2+5^1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식을 하나로 통합하려면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3(5^3+5^2+5^1+5^0)-(5^3+5^2+5^1+5^0)+5^0 = &lt;b&gt;2*(5^3+5^2+5^1+5^0)+1&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 54.6511%; height: 157px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.7519%; height: 85px;&quot; rowspan=&quot;3&quot;&gt;EIO&lt;/td&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;E&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(1)*(5^4+5^3+5^2+5^1+5^0) + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;I&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(2)*(5^3+5^2+5^1+5^0) +1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 9.96121%; height: 17px;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 26.7393%; height: 17px;&quot;&gt;(3)*(5^2+5^1+5^0) + 1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2에 해당하는 값&lt;/b&gt;은 '&lt;b&gt;A':0, 'E':1, 'I':2, 'O':3, 'U':4&lt;/b&gt; 를 그대로 가져가면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 781을 b= 5, 5^2, 5^3 ... 이렇게 나눠준 이유는, &lt;b&gt;소숫점 자리 이하를 버리는 것&lt;/b&gt;이 Default이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5^4+5^3+5^2+5^1+1 을 5로 나누면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5^3+5^2+5^1+1+0.2 가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &lt;b&gt;0.2는 버려진다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 깔끔하게, 5^3+5^2+5^1+1 이 되는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;맨 뒷 항의 +1 은 자릿수마다 생기므로&lt;/b&gt; 맨 앞에서 &lt;b&gt;a = word.size();&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;b&gt;1. rfind를 통해 index로 AEIOU를 01234로 바꿔먹은 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 나머지가 안생기는 점을 이용해 5로 나누는 것&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;pre id=&quot;code_1678433666616&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

int solution(string word) {
    int answer = 0;
    string s = &quot;AEIOU&quot;;
    int powSum = 0;
    for(int i = 0; i &amp;lt; 5; i++)
        powSum += pow(5,i);
    for(int i = 0; i &amp;lt; word.length(); i++)
    {
        answer += s.rfind(word[i]) * powSum + 1;
        powSum/=5;
    }
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;781을 상수로 그대로 쓰는건 실제로는 좋지 않다 생각해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부에서 powSum으로 계산하는 과정을 추가했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Cr47/btr3akWfyBT/Bopv2l52eAHKr2TaZpGmaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Cr47/btr3akWfyBT/Bopv2l52eAHKr2TaZpGmaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Cr47/btr3akWfyBT/Bopv2l52eAHKr2TaZpGmaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Cr47%2Fbtr3akWfyBT%2FBopv2l52eAHKr2TaZpGmaK%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;311&quot; height=&quot;403&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 풀이는 어찌됐든간에 이중 반복문이라 O(n^2)의 시간복잡도를 지녔지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 풀이에서는 O(n)이 되어서 시간이 확실히 줄었다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;두번째 풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 거듭제곱의 합 계산에서 DP를 쓰는 방법이다. DP[0] = 1, DP[1] = 5를 주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DP[2]부터 DP[5] 까지 DP[i] = 5*(DP[i-1]+1)으로 구하는 방법이다. 그 외는 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>■ 알고리즘/◻ Programmers</category>
      <author>흣</author>
      <guid isPermaLink="true">https://getcomponent.tistory.com/163</guid>
      <comments>https://getcomponent.tistory.com/163#entry163comment</comments>
      <pubDate>Mon, 13 Mar 2023 19:41:53 +0900</pubDate>
    </item>
  </channel>
</rss>