<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>나의 개발일지</title>
    <link>https://bonnate.tistory.com/</link>
    <description>'나의 개발 일지' 블로그는 저의 개발 관련 학습과 성장 과정을 담은 공간입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 02:46:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>bonnate</managingEditor>
    <image>
      <title>나의 개발일지</title>
      <url>https://tistory1.daumcdn.net/tistory/5248309/attach/46dba94e02ed448897ae516e2f8fa099</url>
      <link>https://bonnate.tistory.com</link>
    </image>
    <item>
      <title>[C++][백준][알고리즘] 브루트 포스  </title>
      <link>https://bonnate.tistory.com/577</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;브루트 포스는 모든 경우의 수를 다 해보는 것이다.&lt;br /&gt;&lt;br /&gt;예를 들어, 비밀번호가 4자리이고, 숫자로만 이루어져 있다고 한다면 0000부터 9999까지 다 입력해보면 된다. &lt;br /&gt;비밀번호 4자리의 경우의 수는 10,000가지 이다.&lt;br /&gt;&lt;br /&gt;브루트 포스로 문제를 풀기 위해서는 다음과 같은 3가지 단계를 생각해볼 수 있다. &lt;br /&gt;1. 문제의 가능한 경우의 수를 계산해본다. &lt;br /&gt;2. 가능한 모든 방법을 다 만들어본다. &lt;br /&gt;3. 각각의 방법을 이용해 답을 구해본다&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;blockquote data-ke-style=&quot;style2&quot;&gt;N명의&amp;nbsp;사람이&amp;nbsp;한&amp;nbsp;줄로&amp;nbsp;서는&amp;nbsp;경우의&amp;nbsp;수&amp;nbsp;&amp;rarr;&amp;nbsp;N&amp;nbsp;&amp;times;&amp;nbsp;(N-1)&amp;nbsp;&amp;times;&amp;nbsp;&amp;hellip;&amp;nbsp;&amp;times;&amp;nbsp;1&amp;nbsp;=&amp;nbsp;N! &lt;br /&gt;N명의 사람 중에서 대표 두 명을 뽑는 경우의 수 &amp;rarr; N &amp;times; (N-1) / 2 &lt;br /&gt;N명의 사람 중에서 대표 세 명을 뽑는 경우의 수 &amp;rarr; N &amp;times; (N-1) &amp;times; (N-2) / 3! &lt;br /&gt;N명의 사람 중에서 반장 1명과 부반장 1명을 뽑는 경우의 수 &amp;rarr; N &amp;times; (N-1) &lt;br /&gt;N명의 사람이 있을 때, 각 사람이 영화를 볼지, 보지 않을지 결정한다. 가능한 조합의 수 &amp;rarr; 2N&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2309번&lt;/h2&gt;
&lt;figure id=&quot;og_1709220414917&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;2309번: 일곱 난쟁이&quot; data-og-description=&quot;아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2309&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2309&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGw4XD/hyVuetOakr/6HdKBjtg6C5PGEcFIMohNk/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/2309&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2309&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGw4XD/hyVuetOakr/6HdKBjtg6C5PGEcFIMohNk/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;2309번: 일곱 난쟁이&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 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;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709220423521&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Online C++ compiler to run C++ program online
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;vector&amp;gt;
using namespace std;

bool ch[9];
int arr[9];
int sel[9];
bool isFinish = false;

void dfs(int s, int p)
{
    if(isFinish)
        return;
    
    if(p == 7)
    {
        int sum = 0;
        for(int i = 0; i &amp;lt; 7; ++i)
            sum += arr[sel[i]];
            
        if(sum == 100)
        {
            vector&amp;lt;int&amp;gt; res;
            for(int i = 0; i &amp;lt; 7; ++i)
                res.push_back(arr[sel[i]]);
            sort(res.begin(), res.end());
            for(int i = 0; i &amp;lt; 7; ++i)
                printf(&quot;%d\n&quot;, res[i]);
            isFinish = true;
        }

    }
    else
    {
        for(int i = 0; i &amp;lt; 9; ++i)
        {
            if(!ch[i])
            {
                ch[i] = true;
                sel[p] = i;
                dfs(s + 1, p + 1);
                ch[i] = false;
            }
        }
    }
}

int main() {
    for(int i = 0; i &amp;lt; 9; ++i)
        scanf(&quot;%d&quot;, &amp;amp;arr[i]);
        
    dfs(0, 0);

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS를 이용하여 9개 중 7개를 선택하는 조합을 구하는 알고리즘을 사용하여 문제를 해결하였습니다. 7개를 골랐다면, 그 요소들의 합이 100인지 검사하여 마무리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3085번&lt;/h2&gt;
&lt;figure id=&quot;og_1709463236793&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;3085번: 사탕 게임&quot; data-og-description=&quot;예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/3085&quot; data-og-url=&quot;https://www.acmicpc.net/problem/3085&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ylH26/hyVue19UaD/6rXVbRS2h9pVKK6uELKqd0/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/3085&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/3085&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ylH26/hyVue19UaD/6rXVbRS2h9pVKK6uELKqd0/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;3085번: 사탕 게임&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;N^2크기의 배열에서 상하좌우 원소를 서로 swap하여 가장 긴 행, 열의 크기를 리턴하는 문제입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709463295630&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Online C++ compiler to run C++ program online
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cmath&amp;gt;
#include &amp;lt;climits&amp;gt;
using namespace std;

char board[50][50];
int N;
int ans = INT_MIN;

int dx[4] { -1, +1, 0 ,0 };
int dy[4] { 0, 0, -1, +1 };

void check() {
	char c;
	
	// 행 계산
	for (int i = 0; i &amp;lt; N; i++) 
	{
		int count = 1; // 1개부터 시작
		c = board[i][0]; // 시작은 행의 첫번째 원소부터
		for (int j = 1; j &amp;lt; N; j++) 
		{
		    // c와 같은 char라면, 연속된 길이
			if ((board[i][j] == c))
				++count;
			else 
			    count = 1;
		    
		    // 연속에 상관 없이 다음 c는 현재 위치의 char
			c = board[i][j];
			
			// 개수 갱신
			ans = max(ans, count);
		}
	}

	// 열 계산
	for (int i = 0; i &amp;lt; N; i++) 
	{
		int count = 1; // 1개부터 시작
		c = board[0][i];
		for (int j = 1; j &amp;lt; N; j++) 
		{
			if ((board[j][i] == c))
				++count;
			else 
			    count = 1;
			    
			c = board[j][i];
			
			ans = max(ans, count);
		}
	}
}

int main() {
    cin &amp;gt;&amp;gt; N;
    for(int i = 0; i &amp;lt; N; ++i)
        for(int j = 0; j &amp;lt; N; ++j)
            cin &amp;gt;&amp;gt; board[i][j];
            
    for(int y = 0; y &amp;lt; N; ++y) // col
        for(int x = 0; x &amp;lt; N; ++x) // row
            for(int k = 0; k &amp;lt; 4; ++k) // 4 path
            {
                // 각 방향을 구하기
                int ddy = y + dy[k];
                int ddx = x + dx[k];
                
                // 벗어난경우 무시
                if(ddy &amp;lt; 0 || ddx &amp;lt; 0 || ddy == N || ddx == N)
                    continue;
                    
                // swap 후 개수를 계산한 후 다시 되돌리기
                swap(board[y][x], board[ddy][ddx]);
                check();
                swap(board[y][x], board[ddy][ddx]);
            }
            
    printf(&quot;%d&quot;, ans);

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dx, dy를 이용하여 네 방향에 swap을 하고, check를 통해 연속된 가장 긴 길이를 리턴합니다.&lt;/li&gt;
&lt;li&gt;swap을 한 후에는 다시 swap을 하여 원상태를 유지합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1476번&lt;/h2&gt;
&lt;figure id=&quot;og_1709524751039&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;1476번: 날짜 계산&quot; data-og-description=&quot;준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는&amp;nbsp;나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다. 지구를 나타&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1476&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1476&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ekBt8p/hyVudPYFmf/CJWgD5fDAYNXWN0JNpkjqk/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/1476&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1476&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ekBt8p/hyVudPYFmf/CJWgD5fDAYNXWN0JNpkjqk/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;1476번: 날짜 계산&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는&amp;nbsp;나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다. 지구를 나타&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_1709524711967&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() {

    int year = 1;
    
    int E, S, M;
    cin &amp;gt;&amp;gt; E &amp;gt;&amp;gt; S &amp;gt;&amp;gt; M;
    
    int e = 1, s = 1, m = 1;

    for(int i = 1; i &amp;lt;= 7980; ++i)
    {
        if(e == E &amp;amp;&amp;amp; s == S &amp;amp;&amp;amp; m == M)
        {
            printf(&quot;%d&quot;, i);
            break;
        }
        
        ++e;
        ++s;
        ++m;
        
        if(e == 16)
            e = 1;
        if(s == 29)
            s = 1;
        if(m == 20)
            m = 1;
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 문제는 총 경우의 수를 파악하는것이 중요한 문제입니다.&lt;/li&gt;
&lt;li&gt;가능한 총 경우의 수는 15 * 28 *19로 7980에 해당합니다. e가 15, s가 28, m이 19에 해당할 때 마지막 값이 됩니다.&lt;/li&gt;
&lt;li&gt;1부터 7890까지 반복하여 조건에 따라 e, s, m을 변경해주어 입력값과 일치해지면 정답을 출력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1107번&lt;/h2&gt;
&lt;figure id=&quot;og_1709530555717&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;1107번: 리모컨&quot; data-og-description=&quot;첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 &amp;le; N &amp;le; 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 &amp;le; M &amp;le; 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1107&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1107&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bRExcV/hyVudJekUD/N7ol2JDaqCiFGIzLKsxIMk/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/1107&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1107&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bRExcV/hyVudJekUD/N7ol2JDaqCiFGIzLKsxIMk/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;1107번: 리모컨&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 &amp;le; N &amp;le; 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 &amp;le; M &amp;le; 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이&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_1709530574248&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;
#include &amp;lt;string&amp;gt;
#include &amp;lt;cmath&amp;gt;
#include &amp;lt;climits&amp;gt;
using namespace std;

// 선택 가능한 모든 버튼
vector&amp;lt;int&amp;gt; numbers { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

// DFS에서 선택한 원소의 번호
int sel[10] { 0, };

// 입력
int N = 0, M = 0;

// 정답
int answer = INT_MAX;

void dfs(int s, int length)
{
    // length만큼 골랐다면?
    if(s == length)
    {
        int num = 0;
       
       // 앞에서부터 조립하여 숫자 생성 
        for(int i = 0; i &amp;lt; length; ++i)
            num += (pow(10, length - i - 1) * numbers[sel[i]]);
            
        // 최소값 갱신
        answer = min(answer, length + abs(N - num));
    }
    else
    {
        // 0부터 중복하여 선택
        for(int i = 0; i &amp;lt; numbers.size(); ++i)
        {
            sel[s] = i;
            dfs(s + 1, length);
        }
    }
}

int main() {
    int input;

    cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; M;
    
    for(int i = 0; i &amp;lt; M; ++i)
    {
        cin &amp;gt;&amp;gt; input;
        numbers.erase(find(numbers.begin(), numbers.end(), input));
    }
    
    // 모든 버튼이 망가진경우?
    if(M == 10)
    {
        cout &amp;lt;&amp;lt; abs(100 - N);
        return 0;
    }
    
    // 모든 버튼이 망가지지 않은경우?
    if(M == 0)
    {
        cout &amp;lt;&amp;lt; min((int)to_string(N).size(), abs(100 - N));
        return 0;
    }    

    int length = to_string(N).size();
    
    // 요구 자리 수 - 1
    if(length &amp;gt; 1)
        dfs(0, length - 1);
    
    // 요구 자리 수    
    dfs(0, length);
    
    // 요구 자리 수 + 1
    dfs(0, length + 1);

    cout &amp;lt;&amp;lt; min(answer, abs(100 - N));

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS를 활용하여 문제를 해결하였습니다. 선택 가능한 버튼에서 M개를 제외한 나머지 중 N의 자리수만큼 중복을 허용하여 선택을 합니다.&lt;/li&gt;
&lt;li&gt;선택된 값에서 N을 빼어 최소값을 갱신할 수 있습니다.&lt;/li&gt;
&lt;li&gt;문제 자체는 간단하다고 생각하였으나, 내부적으로 고려해야 할 다양하고 복잡한 조건이 있어 실수가 있었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1709530677185&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;글 읽기 - ****리모컨 질문게시판에있는 모든 반례 모음****&quot; data-og-description=&quot;댓글을 작성하려면 로그인해야 합니다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/board/view/31853&quot; data-og-url=&quot;https://www.acmicpc.net/board/view/31853&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kuUqH/hyVuhrk2HT/Y4p0IBAUWiLuz0yDrggG80/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/board/view/31853&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/board/view/31853&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kuUqH/hyVuhrk2HT/Y4p0IBAUWiLuz0yDrggG80/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;글 읽기 - ****리모컨 질문게시판에있는 모든 반례 모음****&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;댓글을 작성하려면 로그인해야 합니다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709530894332&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;
bool broken[10];
int possible(int c) {
    if (c == 0) {
        if (broken[0]) {
            return 0;
        } else {
            return 1;
        }
    }
    int len = 0;
    while (c &amp;gt; 0) {
        if (broken[c % 10]) {
            return 0;
        }
        len += 1;
        c /= 10;
    }
    return len;
}
int main() {
    int n;
    cin &amp;gt;&amp;gt; n;
    int m;
    cin &amp;gt;&amp;gt; m;
    for (int i = 0; i &amp;lt; m; i++) {
        int x;
        cin &amp;gt;&amp;gt; x;
        broken[x] = true;
    }
    int ans = n - 100;
    if (ans &amp;lt; 0) {
        ans = -ans;
    }
    for (int i = 0; i &amp;lt;= 1000000; i++) {
        int c = i;
        int len = possible(c);
        if (len &amp;gt; 0) {
            int press = c - n;
            if (press &amp;lt; 0) {
                press = -press;
            }
            if (ans &amp;gt; len + press) {
                ans = len + press;
            }
        }
    }
    printf(&quot;%d\n&quot;, ans);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더욱 효율적인 코드로, DFS를 사용하지 않고, 0부터 1000000까지 반복하여 해당 i에 고장난 버튼이 포함되어있는지 검사하여 나아가는 방법입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14500번&lt;/p&gt;
&lt;figure id=&quot;og_1709533646024&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;14500번: 테트로미노&quot; data-og-description=&quot;폴리오미노란 크기가 1&amp;times;1인 정사각형을 여러 개 이어서 붙인 도형이며, 다음과 같은 조건을 만족해야 한다. 정사각형은 서로 겹치면 안 된다. 도형은 모두 연결되어 있어야 한다. 정사각형의 변&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/14500&quot; data-og-url=&quot;https://www.acmicpc.net/problem/14500&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/VJ5nj/hyVuiqfI5l/b0hawEK9M2xr5oOECvkbuk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/Rw7qQ/hyVuhZbAWi/q8RtYDXo5YfEQfTO9NIi20/img.png?width=500&amp;amp;height=333&amp;amp;face=0_0_500_333&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14500&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/14500&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/VJ5nj/hyVuiqfI5l/b0hawEK9M2xr5oOECvkbuk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/Rw7qQ/hyVuhZbAWi/q8RtYDXo5YfEQfTO9NIi20/img.png?width=500&amp;amp;height=333&amp;amp;face=0_0_500_333');&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;14500번: 테트로미노&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;폴리오미노란 크기가 1&amp;times;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_1709533630525&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;

int main() {
    
    int N, M;
    int arr[500][500];
    
    scanf(&quot;%d %d&quot;, &amp;amp;N, &amp;amp;M);
    for(int i = 0; i &amp;lt; N; ++i)
        for(int j = 0; j &amp;lt; M; ++j)
            scanf(&quot;%d&quot;, &amp;amp;arr[i][j]);
            
    int ans = 0;
    for (int i = 0; i &amp;lt; N; ++i) {
        for (int j = 0; j &amp;lt; M; ++j) {
            /*
                 
            */
            if (j+3 &amp;lt; M) {
                int temp = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i][j+3];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                 
                 
                 
                 
            */
            if (i+3 &amp;lt; N) {
                int temp = arr[i][j] + arr[i+1][j] + arr[i+2][j] + arr[i+3][j];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                 
                 
            */
            if (i+1 &amp;lt; N &amp;amp;&amp;amp; j+2 &amp;lt; M) {
                int temp = arr[i][j] + arr[i+1][j] + arr[i+1][j+1] + arr[i+1][j+2];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                 
                 
                 
            */            
            if (i+2 &amp;lt; N &amp;amp;&amp;amp; j+1 &amp;lt; M) {
                int temp = arr[i][j] + arr[i][j+1] + arr[i+1][j] + arr[i+2][j];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                 
                     
                
            */               
            if (i+1 &amp;lt; N &amp;amp;&amp;amp; j+2 &amp;lt; M) {
                int temp = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j+2];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                   
                   
                 
            */             
            if (i+2 &amp;lt; N &amp;amp;&amp;amp; j-1 &amp;gt;= 0) {
                int temp = arr[i][j] + arr[i+1][j] + arr[i+2][j] + arr[i+2][j-1];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                     
                 
            */              
            if (i-1 &amp;gt;= 0 &amp;amp;&amp;amp; j+2 &amp;lt; M) {
                int temp = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i-1][j+2];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                 
                 
                 
            */               
            if (i+2 &amp;lt; N &amp;amp;&amp;amp; j+1 &amp;lt; M) {
                int temp = arr[i][j] + arr[i+1][j] + arr[i+2][j] + arr[i+2][j+1];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                 
                 
            */               
            if (i+1 &amp;lt; N &amp;amp;&amp;amp; j+2 &amp;lt; M) {
                int temp = arr[i][j] + arr[i][j+1] + arr[i][j+2] + arr[i+1][j];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                 
                   
                   
            */              
            if (i+2 &amp;lt; N &amp;amp;&amp;amp; j+1 &amp;lt; M) {
                int temp = arr[i][j] + arr[i][j+1] + arr[i+1][j+1] + arr[i+2][j+1];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                 
                 
            */                 
            if (i+1 &amp;lt; N &amp;amp;&amp;amp; j+1 &amp;lt; M) {
                int temp = arr[i][j] + arr[i][j+1] + arr[i+1][j] + arr[i+1][j+1];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                   
                 
            */               
            if (i-1 &amp;gt;= 0 &amp;amp;&amp;amp; j+2 &amp;lt; M) {
                int temp = arr[i][j] + arr[i][j+1] + arr[i-1][j+1] + arr[i-1][j+2];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                 
                 
                   
            */               
            if (i+2 &amp;lt; N &amp;amp;&amp;amp; j+1 &amp;lt; M) {
                int temp = arr[i][j] + arr[i+1][j] + arr[i+1][j+1] + arr[i+2][j+1];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                 
                   
            */              
            if (i+1 &amp;lt; N &amp;amp;&amp;amp; j+2 &amp;lt; M) {
                int temp = arr[i][j] + arr[i][j+1] + arr[i+1][j+1] + arr[i+1][j+2];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                   
                 
                 
            */              
            if (i+2 &amp;lt; N &amp;amp;&amp;amp; j-1 &amp;gt;= 0) {
                int temp = arr[i][j] + arr[i+1][j] + arr[i+1][j-1] + arr[i+2][j-1];
                if (ans &amp;lt; temp) ans = temp;
            }
            /*
                   
                 
                
                 
                   
            */ 
            if (j+2 &amp;lt; M) {
                int temp = arr[i][j] + arr[i][j+1] + arr[i][j+2];
                if (i-1 &amp;gt;= 0) {
                    int temp2 = temp + arr[i-1][j+1];
                    if (ans &amp;lt; temp2) ans = temp2;
                }
                if (i+1 &amp;lt; N) {
                    int temp2 = temp + arr[i+1][j+1];
                    if (ans &amp;lt; temp2) ans = temp2;
                }
            }
            /*
                   
                 
                   
                  
                 
                 
                 
            */             
            if (i+2 &amp;lt; N) {
                int temp = arr[i][j] + arr[i+1][j] + arr[i+2][j];
                if (j+1 &amp;lt; M) {
                    int temp2 = temp + arr[i+1][j+1];
                    if (ans &amp;lt; temp2) ans = temp2;
                }
                if (j-1 &amp;gt;= 0) {
                    int temp2 = temp + arr[i+1][j-1];
                    if (ans &amp;lt; temp2) ans = temp2;
                }
            }
        }
    }
    
    printf(&quot;%d&quot;, ans);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;N*M만큼 반복하여 해당 위치에 가능한 모든 모양의 테트로미노에 해당하는 위치에서 값을 계산하여 최고값을 갱신합니다.&lt;/li&gt;
&lt;li&gt;문제 자체는 간단하지만, 19개의 테트로미노 모양에 대한 조건식을 정확하게 써야 오류가 나지 않습니다.
&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1709533934556&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 a[500][500];
int block[19][3][2] = {
    {{0,1}, {0,2}, {0,3}},
    {{1,0}, {2,0}, {3,0}},
    {{1,0}, {1,1}, {1,2}},
    {{0,1}, {1,0}, {2,0}},
    {{0,1}, {0,2}, {1,2}},
    {{1,0}, {2,0}, {2,-1}},
    {{0,1}, {0,2}, {-1,2}},
    {{1,0}, {2,0}, {2,1}},
    {{0,1}, {0,2}, {1,0}},
    {{0,1}, {1,1}, {2,1}},
    {{0,1}, {1,0}, {1,1}},
    {{0,1}, {-1,1}, {-1,2}},
    {{1,0}, {1,1}, {2,1}},
    {{0,1}, {1,1}, {1,2}},
    {{1,0}, {1,-1}, {2,-1}},
    {{0,1}, {0,2}, {-1,1}},
    {{0,1}, {0,2}, {1,1}},
    {{1,0}, {2,0}, {1,1}},
    {{1,0}, {2,0}, {1,-1}},
};
int main() {
    int n, m;
    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;
    for (int i=0; i&amp;lt;n; i++) {
        for (int j=0; j&amp;lt;m; j++) {
            cin &amp;gt;&amp;gt; a[i][j];
        }
    }
    int ans = 0;
    for (int i=0; i&amp;lt;n; i++) {
        for (int j=0; j&amp;lt;m; j++) {
            for (int k=0; k&amp;lt;19; k++) {
                bool ok = true;
                int sum = a[i][j];
                for (int l=0; l&amp;lt;3; l++) {
                    int x = i+block[k][l][0];
                    int y = j+block[k][l][1];
                    if (0 &amp;lt;= x &amp;amp;&amp;amp; x &amp;lt; n &amp;amp;&amp;amp; 0 &amp;lt;= y &amp;amp;&amp;amp; y &amp;lt; m) {
                        sum += a[x][y];
                    } else {
                        ok = false;
                        break;
                    }
                }
                if (ok &amp;amp;&amp;amp; ans &amp;lt; sum) {
                    ans = sum;
                }
            }
        }
    }
    cout &amp;lt;&amp;lt; ans &amp;lt;&amp;lt; '\n';
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 정답보다 보다 개선된 형태로, 3차원 배열에 0,0을 기준으로하여 상대적인 위치에 나머지 세개의 블록을 두는 방식으로 구현한 방식입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6064번&lt;/h2&gt;
&lt;figure id=&quot;og_1709536552862&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;6064번: 카잉 달력&quot; data-og-description=&quot;입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 한 줄로 구성된다. &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/6064&quot; data-og-url=&quot;https://www.acmicpc.net/problem/6064&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/9wkbg/hyVudP2Kre/GCjUBZDMb4wT0ma8decla1/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/6064&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/6064&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/9wkbg/hyVudP2Kre/GCjUBZDMb4wT0ma8decla1/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;6064번: 카잉 달력&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 한 줄로 구성된다.&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_1709536561534&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() {
    int T;
    cin &amp;gt;&amp;gt; T;
    for(int i = 0; i &amp;lt; T; ++i)
    {
        int M, N, X, Y;
        cin &amp;gt;&amp;gt; M &amp;gt;&amp;gt; N &amp;gt;&amp;gt; X &amp;gt;&amp;gt; Y;
        
        --X, --Y;
        // 1씩 빼면 나머지를 활용하여 문제를 해결할 수 있음
        // X와 Y중 하나를 고정하여 문제를 해결하기
        // X를 고정한다고 가정했을 때, Y의 값을 찾아 정답을 구하기
        
        /*
            1을 빼지 않았을 때
            &amp;bull; 1: &amp;lt;1,1&amp;gt;
            &amp;bull; 2: &amp;lt;2,2&amp;gt;
            &amp;bull; 3: &amp;lt;3,3&amp;gt;
            &amp;bull; 4: &amp;lt;4,4&amp;gt;
            &amp;bull; 5: &amp;lt;5,5&amp;gt;
            &amp;bull; 6: &amp;lt;1,6&amp;gt;
            &amp;bull; 7: &amp;lt;2,7&amp;gt;
            &amp;bull; 8: &amp;lt;3,1&amp;gt;
            &amp;bull; 9: &amp;lt;4,2&amp;gt;
            &amp;bull; 10: &amp;lt;5,3&amp;gt;
            
            1을 빼면 X, Y중 하나를 고정하여 해결 가능
            0부터 X, Y는 차례대로 루프로 고정됨
            &amp;bull; 0: &amp;lt;0,0&amp;gt;
            &amp;bull; 1: &amp;lt;1,1&amp;gt;
            &amp;bull; 2: &amp;lt;2,2&amp;gt;
            &amp;bull; 3: &amp;lt;3,3&amp;gt;
            &amp;bull; 4: &amp;lt;4,4&amp;gt; (첫 사이클 동안은 값이 동일함)
            &amp;bull; 5: &amp;lt;0,5&amp;gt;
            &amp;bull; 6: &amp;lt;1,6&amp;gt;
            &amp;bull; 7: &amp;lt;2,0&amp;gt;
            &amp;bull; 8: &amp;lt;3,1&amp;gt;
            &amp;bull; 9: &amp;lt;4,2&amp;gt;
            &amp;bull; 10: &amp;lt;0,3&amp;gt;
        */
        
        // 조합을 찾았는가?
        bool ok = false;
        
        // int k = X를 하는 이유는 첫 X의 값과 Y는 동일하기 때문
        // 
        // k += M을 하는 이유는 M을 더하면 X축이 고정되는 원리
        // k += M을 하여 고정된 축에서 k % M == Y라면, 해당 조합을 찾은 것
        for (int k = X; k &amp;lt; (N * M); k += M) 
        {
            if (k % N == Y) 
            {
                cout &amp;lt;&amp;lt; k + 1 &amp;lt;&amp;lt; '\n';
                ok = true;
                break;
            }
        }
        if (!ok)
            cout &amp;lt;&amp;lt; -1 &amp;lt;&amp;lt; '\n';

    }
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1씩 빼면 나머지를 활용하여 문제를 해결할 수 있습니다. 이는 날짜계산 문제와 비슷합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1748번&lt;/h2&gt;
&lt;figure id=&quot;og_1709538443834&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;1748번: 수 이어 쓰기 1&quot; data-og-description=&quot;첫째 줄에 N(1 &amp;le; N &amp;le; 100,000,000)이 주어진다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1748&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1748&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/irlXt/hyVuqaL2zs/dZa0HK8BUVJL0b7cygTTCk/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/1748&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1748&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/irlXt/hyVuqaL2zs/dZa0HK8BUVJL0b7cygTTCk/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;1748번: 수 이어 쓰기 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N(1 &amp;le; N &amp;le; 100,000,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_1709538434277&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cmath&amp;gt;

int sizes[9] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

int main() {
    long long int answer = 0;
    int N;
    scanf(&quot;%d&quot;, &amp;amp;N);
    
    int digit = 1;
    for(; digit &amp;lt;= 10; ++digit)
    {
        if(!(N / (int)pow(10, digit - 1)))
        {
            --digit;
            break;
        }
    }
    
    for(int i = 1; i &amp;lt; digit; ++i)
        answer += (pow(10, i) - pow(10, i - 1)) * i;

    answer += (N - (int)pow(10, digit - 1) + 1) * sizes[digit - 1];
       
    printf(&quot;%lld&quot;, answer);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;digit를 구하여 자리수-1까지 9 * 10^n만큼 더합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한자리는 9, 두자리는 90, 세자리는 900...으로 증가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;마지막 digit는 꽉 차있지 않기 때문에 pow(10, digit - 1)를 빼주어 해당 자리수의 크기만큼 곱하여 정답을 리턴합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/577</guid>
      <comments>https://bonnate.tistory.com/577#entry577comment</comments>
      <pubDate>Sun, 3 Mar 2024 20:10:05 +0900</pubDate>
    </item>
    <item>
      <title>[C++][백준][알고리즘] 최대공약수, 최소공배수, 소수  </title>
      <link>https://bonnate.tistory.com/576</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;최대 공약수는 Greatest Common Divisor으로 GCD라고 씁니다.&lt;br /&gt;최소 공배수는 Least Common Multiple으로 LCM으로 씁니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2609번&lt;/h2&gt;
&lt;figure id=&quot;og_1709197056428&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;2609번: 최대공약수와 최소공배수&quot; data-og-description=&quot;첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2609&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2609&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c8rHDU/hyVqgNvh8u/7vTuf5mJpN3MiSUmxNeKM1/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/2609&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2609&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c8rHDU/hyVqgNvh8u/7vTuf5mJpN3MiSUmxNeKM1/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;2609번: 최대공약수와 최소공배수&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.&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_1709197513464&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;

/*
    [최대 공약수]
    유클리드 호제법 알고리즘
    
    1. 작은 수로 큰 수를 나눕니다.
    2. 나머지가 0이 될 때까지 계속 나눕니다.
    3. 나머지가 0이 되면, 해당 나누는 수가 두 수의 최대공약수가 됩니다.
    
    // 입력: 18, 24
    먼저 24를 18로 나눕니다.
    24 &amp;divide; 18 = 1 ... 6
    나머지가 0이 아니므로, 이제 18을 나머지로, 6을 나눕니다.
    18 &amp;divide; 6 = 3 ... 0
    나머지가 0이 되었으므로, 이 때의 나누는 수인 6이 18과 24의 최대공약수입니다. 따라서 최대공약수(GCD)는 6입니다.
*/

/*
    [최소 공배수]
    두 수의 곱을 그들의 최대공약수로 나누는 것으로 구할 수 있습니다.
    
    // 입력: 18, 24
    18과 24의 최대공약수는 6입니다.
    18 * 24 / 6은 72입니다.
*/

int gcd(int x, int y)
{
    if(y == 0)
        return x;
    else return gcd(y, x % y);
}

int main() {
    int a, b;
    scanf(&quot;%d %d&quot;, &amp;amp;a, &amp;amp;b);
    
    int g = gcd(a, b);
    
    printf(&quot;%d\n%d&quot;, g, a * b / g);

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대 공약수는 다음과 같이 계산합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작은 수로 큰 수를 나눕니다.&lt;/li&gt;
&lt;li&gt;나머지가 0이 될 때까지 계속 나눕니다.&lt;/li&gt;
&lt;li&gt;나머지가 0이 되면, 해당 나누는 수가 두 수의 최대공약수가 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최소 공배수는 다음과 같이 계산합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두&amp;nbsp;수의&amp;nbsp;곱을&amp;nbsp;그들의&amp;nbsp;최대공약수로&amp;nbsp;나누는&amp;nbsp;것으로&amp;nbsp;구할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1978번&lt;/h2&gt;
&lt;figure id=&quot;og_1709198104774&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;1978번: 소수 찾기&quot; data-og-description=&quot;첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1978&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1978&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQPVpC/hyVuemZOCf/v8aWtTwgPtEzTFp5A5q9IK/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/1978&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1978&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQPVpC/hyVuemZOCf/v8aWtTwgPtEzTFp5A5q9IK/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;1978번: 소수 찾기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 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_1709198095118&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;cmath&amp;gt;

int main() {
    int N, input;
    int answer = 0;
    scanf(&quot;%d&quot;, &amp;amp;N);

    for(int i = 0; i &amp;lt; N; ++i)
    {
        scanf(&quot;%d&quot;, &amp;amp;input);    
        bool isPrime = true;
        
        for(int i = 2; i &amp;lt;= sqrt(input); ++i)
            if( input % i == 0)
            {
                
                isPrime = false;
                break;
            }   
        
        if(input != 1 &amp;amp;&amp;amp; isPrime)
            ++answer;
    }

    printf(&quot;%d&quot;, answer);

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최대 100개의 테스트 케이스가 소수인지 검사하여 소수의 개수를 리턴합니다.&lt;/li&gt;
&lt;li&gt;약수의 성질을 활용하여 sqrt(input)까지 검사하여 i로 나누어 떨어지지 않는다면 소수로 볼 수 있습니다.&lt;/li&gt;
&lt;li&gt;에라토스테네스의 체를 활용하여 매우 큰 범위의 소수를 더욱 빠르게 구할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1709198260300&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[C++] 소수의 개수 (에라토스테네스의 체)&quot; data-og-description=&quot; 문제 자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요. 만약 20이 입력되면 1부터 20까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19로 총 8개입니다. ℹ️ 조건 제한시간&quot; data-og-host=&quot;bonnate.tistory.com&quot; data-og-source-url=&quot;https://bonnate.tistory.com/386&quot; data-og-url=&quot;https://bonnate.tistory.com/386&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JO362/hyVqrBvDrM/3zV6asqMgqsCbjXXMNKTEK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/JOW4U/hyVqwizhs6/gj54zDiKYuwF6rKsq1L390/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://bonnate.tistory.com/386&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bonnate.tistory.com/386&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JO362/hyVqrBvDrM/3zV6asqMgqsCbjXXMNKTEK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/JOW4U/hyVqwizhs6/gj54zDiKYuwF6rKsq1L390/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;[C++] 소수의 개수 (에라토스테네스의 체)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt; 문제 자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요. 만약 20이 입력되면 1부터 20까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19로 총 8개입니다. ℹ️ 조건 제한시간&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bonnate.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9020번&lt;/h2&gt;
&lt;figure id=&quot;og_1709198385753&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;9020번: 골드바흐의 추측&quot; data-og-description=&quot;1보다 큰 자연수&amp;nbsp;중에서 &amp;nbsp;1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 &amp;times; 3 이기 때문에 소수가 아&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/9020&quot; data-og-url=&quot;https://www.acmicpc.net/problem/9020&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8KBFo/hyVuslfbvF/LOzHC81u0Hmwb6Fh3GsptK/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/9020&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/9020&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8KBFo/hyVuslfbvF/LOzHC81u0Hmwb6Fh3GsptK/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;9020번: 골드바흐의 추측&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1보다 큰 자연수&amp;nbsp;중에서 &amp;nbsp;1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 &amp;times; 3 이기 때문에 소수가 아&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_1709198836459&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;
using namespace std;

vector&amp;lt;bool&amp;gt; isPrime(10001, true);

int main() {
    // 에라토스테네스의 체
    isPrime[0] = isPrime[1] = false;
    for(int i = 2; i &amp;lt; 10001; ++i)
        if(isPrime[i])
            for(int j = i * 2; j &amp;lt;= 10001; j += i)
                isPrime[j] = false;
            
    int T, n;
    scanf(&quot;%d&quot;, &amp;amp;T);
    for(int i = 0; i &amp;lt; T; ++i)
    {
        scanf(&quot;%d&quot;, &amp;amp;n);
        
        // 중간부터 시작하기
        int left = n / 2;
        while(true)
        {
            // 에라토스테네스의 체 배열에서 left, right가 모두 소수라면?
            if(isPrime[left] &amp;amp;&amp;amp; isPrime[n - left])
            {
                // 출력 후 종료
                printf(&quot;%d %d\n&quot;, left, n - left);
                break;
            }
    
            --left;
        }
    }
    
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에라토스테네스의 체를 기반으로 소수를 효울적으로 찾은 후 테스트케이스에 접근합니다.&lt;/li&gt;
&lt;li&gt;각 테스트케이스의 입력에서 중간값부터 시작하여 left, right의 값이 모두 소수인지 확인하여 소수라면, 정답을 출력하고 마무리합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/576</guid>
      <comments>https://bonnate.tistory.com/576#entry576comment</comments>
      <pubDate>Thu, 29 Feb 2024 18:28:59 +0900</pubDate>
    </item>
    <item>
      <title>[C++][백준][알고리즘] 약수  </title>
      <link>https://bonnate.tistory.com/575</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1037번&lt;/h2&gt;
&lt;figure id=&quot;og_1709190942772&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;1037번: 약수&quot; data-og-description=&quot;첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1037&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1037&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cNkhol/hyVunKYpds/uBwiiYIrky4ikcQ2oTo4Yk/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/1037&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1037&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cNkhol/hyVunKYpds/uBwiiYIrky4ikcQ2oTo4Yk/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;1037번: 약수&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;양수 A는 진짜약수(1과 자기 자신을 제외)한 값 중에서 최소값과 최대값을 서로 곱하면 자기 자신이 나옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;17427번&lt;/h2&gt;
&lt;figure id=&quot;og_1709193415636&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;17427번: 약수의 합 2&quot; data-og-description=&quot;두 자연수 A와 B가 있을 때, A = BC를 만족하는 자연수 C를 A의 약수라고 한다. 예를 들어, 2의 약수는 1, 2가 있고, 24의 약수는 1, 2, 3, 4, 6, 8, 12, 24가 있다. 자연수 A의 약수의 합은 A의 모든 약수를 더&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/17427&quot; data-og-url=&quot;https://www.acmicpc.net/problem/17427&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rNhRz/hyVuqOuBmK/IBI2SkmbPzC6zcLnSRRIr0/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/17427&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/17427&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rNhRz/hyVuqOuBmK/IBI2SkmbPzC6zcLnSRRIr0/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;17427번: 약수의 합 2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;두 자연수 A와 B가 있을 때, A = BC를 만족하는 자연수 C를 A의 약수라고 한다. 예를 들어, 2의 약수는 1, 2가 있고, 24의 약수는 1, 2, 3, 4, 6, 8, 12, 24가 있다. 자연수 A의 약수의 합은 A의 모든 약수를 더&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;틀린 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1709193452880&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;climits&amp;gt;
#include &amp;lt;cmath&amp;gt;

using namespace std;

int main() {
	int N;
	int answer = 0;
	scanf(&quot;%d&quot;, &amp;amp;N);
	
	for(int i = 1; i &amp;lt;= N; ++i)
	    for(int j = 1; j &amp;lt;= sqrt(i); ++j)
	        if(i % j == 0)
	        {
	            int temp = i / j;
	            if(temp != j)
	                answer += temp;
	        
	            answer += j;
	        }

    printf(&quot;%d&quot;, answer);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sqrt를 사용하여 n *&amp;nbsp; &lt;b&gt;&amp;radic;&lt;/b&gt;n으로 계산할 수 있습니다. 하지만 이 방법은 제한 시간 0.5초를 벗어난 크기입니다.&lt;/li&gt;
&lt;li&gt;1,000,000 * 1,000은 1,000,000,000(10억)으로, 10초정도 소요되는 풀이 방법으로 해결할 수 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;맞은 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1709193631139&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;climits&amp;gt;
#include &amp;lt;cmath&amp;gt;

using namespace std;

int main() {
	int N;
	long long answer = 0; // 수는 매우 커질 수 있기에 long long int로 선언
	scanf(&quot;%d&quot;, &amp;amp;N);
	
	/*
	    N이하 자연수 중 3을 약수로 갖는 수의 개수는 N / 3개!
	    그 이유는, 3의 배수로 이루어진 수는 N으로 나누어 떨어질 때 무조건 
	    그 수를 약수로 포함하기 때문!
	    
	    N이하의 자연수 중에서 1을 약수로 갖는 수의 개수는 &amp;lfloor;N/1&amp;rfloor;개
        N이하의 자연수 중에서 2를 약수로 갖는 수의 개수는 &amp;lfloor;N/2&amp;rfloor;개
        N이하의 자연수 중에서 3을 약수로 갖는 수의 개수는 &amp;lfloor;N/3&amp;rfloor;개
        ...
        N이하의 자연수 중에서 i를 약수로 갖는 수의 개수는 &amp;lfloor;N/i&amp;rfloor;개
	*/
	for(int i = 1; i &amp;lt;= N; ++i)
	{
	    int cnt = N / i;
	    answer += cnt * i;
	}

    // lld: long long int 출력
    printf(&quot;%lld&quot;, answer);
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배수를 활용한 방식으로 문제를 해결하였습니다.&lt;/li&gt;
&lt;li&gt;N이하의 자연수 중에서 1을 약수로 갖는 수의 개수는 &amp;lfloor;N/1&amp;rfloor;개로 볼 수 있습니다. 그 이유는 1의 배수로 이루어진 수는 해당 수가 모두 1을 약수로 가지기 때문입니다.&lt;/li&gt;
&lt;li&gt;예를 들어 9 이하의 자연수 중 3을 약수로 가지는 개수는 9/3으로 계산하여 3이 나옵니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3, 6, 9는 3의 배수이며, 이 수들은 모두 3을 약수로 가지게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이런 방식으로 접근하여 1~N까지의 모든 약수의 합을 구하려면 N번 반복하면 문제를 해결할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;17425번&lt;/h2&gt;
&lt;figure id=&quot;og_1709195905836&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;17425번: 약수의 합&quot; data-og-description=&quot;두 자연수 A와 B가 있을 때, A = BC를 만족하는 자연수 C를 A의 약수라고 한다. 예를 들어, 2의 약수는 1, 2가 있고, 24의 약수는 1, 2, 3, 4, 6, 8, 12, 24가 있다. 자연수 A의 약수의 합은 A의 모든 약수를 더&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/17425&quot; data-og-url=&quot;https://www.acmicpc.net/problem/17425&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cqUJsK/hyVur7HlJi/egIyfP96qDjnKcXV7jXup1/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/17425&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/17425&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cqUJsK/hyVur7HlJi/egIyfP96qDjnKcXV7jXup1/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;17425번: 약수의 합&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;두 자연수 A와 B가 있을 때, A = BC를 만족하는 자연수 C를 A의 약수라고 한다. 예를 들어, 2의 약수는 1, 2가 있고, 24의 약수는 1, 2, 3, 4, 6, 8, 12, 24가 있다. 자연수 A의 약수의 합은 A의 모든 약수를 더&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_1709195936755&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;
using namespace std;

const int MAX = 1000000;

int main() {
    vector&amp;lt;long long&amp;gt; dp(MAX + 1, 1);
    vector&amp;lt;long long&amp;gt; s(MAX + 1, 0);
    
    // 인덱스 번호에 해당하는 배수를 누적하여 저장
    // i의 배수가 가리키는 값은 i를 항상 약수로 가지는 성질
    for (int i = 2; i &amp;lt;= MAX; ++i) 
        for (int j = 1; i * j &amp;lt;= MAX; ++j) 
            dp[i * j] += i;

    // 인덱스 번호의 약수 합을 누적하여 차례대로 저장
    for (int i = 1; i &amp;lt;= MAX; ++i)
        s[i] = s[i - 1] + dp[i];

    int T, N;
    scanf(&quot;%d&quot;, &amp;amp;T);
    
    for(int i = 0; i &amp;lt; T; ++i)
    {
        scanf(&quot;%d&quot;, &amp;amp;N);
        printf(&quot;%lld\n&quot;, s[N]);
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;17427번과 같은 문제이지만, 테스트케이스가 추가되어 각 테스트케이스를 각각 구하게 된다면 시간초과하는 문제입니다.&lt;/li&gt;
&lt;li&gt;이 문제는 dp를 이용하여 MAX까지의 값을 일단 구하고, g(n)을 s라는 벡터에 미리 저장하여 모든 테스트 케이스에 대비하여 출력을 마지막에 하는 방식으로 해결하였습니다.&lt;/li&gt;
&lt;/ul&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>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/575</guid>
      <comments>https://bonnate.tistory.com/575#entry575comment</comments>
      <pubDate>Thu, 29 Feb 2024 17:49:39 +0900</pubDate>
    </item>
    <item>
      <title>[C++][백준][알고리즘] 나머지 연산  </title>
      <link>https://bonnate.tistory.com/574</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;10430번&lt;/h2&gt;
&lt;figure id=&quot;og_1709187759382&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;10430번: 나머지&quot; data-og-description=&quot;첫째 줄에 A, B, C가 순서대로 주어진다. (2&amp;nbsp;&amp;le; A, B, C &amp;le; 10000)&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/10430&quot; data-og-url=&quot;https://www.acmicpc.net/problem/10430&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHzgqa/hyVuiQqOK3/XzX8jr6Cl0omQmsIKdZDXk/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/10430&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/10430&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHzgqa/hyVuiQqOK3/XzX8jr6Cl0omQmsIKdZDXk/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;10430번: 나머지&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 A, B, C가 순서대로 주어진다. (2&amp;nbsp;&amp;le; A, B, C &amp;le; 10000)&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;덧셈, 곱셉, 뺄셈에서는 다음과 같은 식을 성립합니다. (나머지는 불가능)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(A+B) mod M = ((A mod M) + (B mod M)) mod M
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(4 + 7) % 3 = 11 % 3 = 2&lt;/li&gt;
&lt;li&gt;(4 % 3 + 7 % 3) = (1 + 1) % 3 = 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(A&amp;times;B) mod M = ((A mod M) &amp;times; (B mod M)) mod M
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(4 * 7) % 3 = 28 % 3 = 1&lt;/li&gt;
&lt;li&gt;(4 % 3 * 7 % 3) = (1 * 1) % 3= 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(A-B) mod M = ((A mod M) - (B mod M)) mod M
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(7 - 3) % 3 = 4 % 3 = 1&lt;/li&gt;
&lt;li&gt;(7 % 3 - 3 % 3) = (1 - 0) % 3 = 1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단, 뺄셈에서는 프로그래밍 언어에 따라 부호가 다르게 나옵니다. C++은 음수를 지원합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(6 % 3 ‒ 5 % 3) % 3 = (0 ‒ 2) % 3 = -2 % 3 = -2?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4375번&lt;/h2&gt;
&lt;figure id=&quot;og_1709187115529&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;4375번: 1&quot; data-og-description=&quot;2와 5로 나누어 떨어지지 않는 정수 n(1 &amp;le; n &amp;le; 10000)가 주어졌을 때, 각 자릿수가 모두 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/4375&quot; data-og-url=&quot;https://www.acmicpc.net/problem/4375&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b7NAjd/hyVqnslzZ3/20kAnKryvsIUnBUXslzTD0/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/4375&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/4375&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b7NAjd/hyVqnslzZ3/20kAnKryvsIUnBUXslzTD0/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;4375번: 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2와 5로 나누어 떨어지지 않는 정수 n(1 &amp;le; n &amp;le; 10000)가 주어졌을 때, 각 자릿수가 모두 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.&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;p data-ke-size=&quot;size16&quot;&gt;나머지 연산이 포함된 문제는 다음과 같은 고려할 사항이 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수의 크기가 int,longlong의 범위를 넘어갈 수 있기 때문에, 수를 실제로 만들 수 없다.&lt;/li&gt;
&lt;li&gt;Java의 BigInteger,Python은 수의 범위 제한이 없어서 수를 실제로 만들 수 있지만,&amp;nbsp;수의 크기가 커지면 나누는데 걸리는 시간도 매우 오래 걸린다.&lt;/li&gt;
&lt;/ul&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;/h3&gt;
&lt;pre id=&quot;code_1709189320037&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;

int main() {
    int n;
    
    while(scanf(&quot;%d&quot;, &amp;amp;n) != EOF)
    {
        int digit = 1;
        long long value = 1;
        
        while(true)
        {
            value *= 10;
            value += 1;
            ++digit;
            
            if(value % n == 0)
            {
                printf(&quot;%d\n&quot;, digit);
                break;
            }
        }
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 먼저 생각할 수 있는 방법으로, 단순히 실제 value의 값을 1111111... 처럼 늘려 mod 연산이 0이 나올때까지 반복하여 계산할 수 있습니다. 하지만 이 방법은 시간 초과가 나 더 효율적인 방법을 찾아야 했습니다.&lt;/li&gt;
&lt;/ul&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;/h3&gt;
&lt;pre id=&quot;code_1709189376794&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;

int main() {
    int n;
    
    while(scanf(&quot;%d&quot;, &amp;amp;n) != EOF)
    {
        int digit = 0; // 자리 수
        int remains = 1 % n; // 나머지
        
        while(true)
        {
            /*
                1 % 3 = 1
                11 % 3 = (1 * 10 + 1) % 3 = ({1 % 3} * 10 + 1) % 3
                111 % 3 = (11 * 10 + 1) % 3 = ({11 % 3} * 10 + 1) % 3
                1111 % 3 = (111 * 10 + 1) % 3 = ({111 % 3} * 10 + 1) % 3
                
                규칙: 이전 계산 값의 나머지 값을 활용하면 수가 무수히
                커지지 않고 계산할 수 있음!
            */
            
            // 나머지 연산의 성질을 이용한 식
            int remains = (remains * 10 + 1) % n;
            ++digit;
            
            if(remains == 0)
            {
                printf(&quot;%d\n&quot;, digit);
                break;
            }
        }
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나머지 연산자의 성질을 이용한 방법으로 해결하였습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 % 3 = 1&lt;/li&gt;
&lt;li&gt;11 % 3 = (1 * 10 + 1) % 3 = ({1 % 3} * 10 + 1) % 3&lt;/li&gt;
&lt;li&gt;111 % 3 = (11 * 10 + 1) % 3 = ({11 % 3} * 10 + 1) % 3&lt;/li&gt;
&lt;li&gt;1111&amp;nbsp;%&amp;nbsp;3&amp;nbsp;=&amp;nbsp;(111&amp;nbsp;*&amp;nbsp;10&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;%&amp;nbsp;3&amp;nbsp;=&amp;nbsp;({111&amp;nbsp;%&amp;nbsp;3}&amp;nbsp;*&amp;nbsp;10&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;%&amp;nbsp;3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위 식과 같이 식을 분해하면 이전 값을 활용하여 수가 커지지 않고 계산을 이어나갈 수 있습니다.&lt;/li&gt;
&lt;li&gt;예를 들어, 1이 10000자리인 매우 큰 수의 나머지가 3이라고 하였을때, 10001자리는 다음과 같이 구할 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(3 * 10 + 1) % N&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/574</guid>
      <comments>https://bonnate.tistory.com/574#entry574comment</comments>
      <pubDate>Thu, 29 Feb 2024 15:54:53 +0900</pubDate>
    </item>
    <item>
      <title>[C++][백준 15649번] N과 M (1) ⭐</title>
      <link>https://bonnate.tistory.com/573</link>
      <description>&lt;figure id=&quot;og_1709109317331&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;15649번: N과 M (1)&quot; data-og-description=&quot;한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/15649&quot; data-og-url=&quot;https://www.acmicpc.net/problem/15649&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bdIE6S/hyVqiYIcfS/d5S8LKgW1asisO5bP8Vxb0/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/15649&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/15649&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bdIE6S/hyVqiYIcfS/d5S8LKgW1asisO5bP8Vxb0/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;15649번: N과 M (1)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연수&amp;nbsp;N과&amp;nbsp;M이&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;아래&amp;nbsp;조건을&amp;nbsp;만족하는&amp;nbsp;길이가&amp;nbsp;M인&amp;nbsp;수열을&amp;nbsp;모두&amp;nbsp;구하는&amp;nbsp;프로그램을&amp;nbsp;작성하시오.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;li&gt;N개의 자연수 중 M개를 선택하여 모든 가능한 순서대로 배열하여 만들어야 합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ch는 인덱스 번호에 삽입한 자연수입니다.&lt;/li&gt;
&lt;li&gt;used는 해당 인덱스 번호를 사용하였는지 검사하기 위해 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;{1, 2}와 {2, 1}은 서로 다른 순열입니다. 이는 조합과 다릅니다.&lt;/li&gt;
&lt;li&gt;Permutations 함수에서 s가 M(선택할 개수)와 같다면 해당 함수는 종료됩니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;s는 현재 선택한 개수를 뜻합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0부터 N까지 반복하여 used[i]가 false인 경우에만 ch에 저장한 후, s + 1을 하여 다음 DFS로 넘어갑니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1709109336135&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Online C++ compiler to run C++ program online
#include &amp;lt;iostream&amp;gt;

int N, M;

int ch[8];
int used[8];

void Permutations(int s)
{
	if (s == M)
	{
		for (int i = 0; i &amp;lt; M; ++i)
			printf(&quot;%d &quot;, ch[i] + 1);
		printf(&quot;\n&quot;);
	}
	else
	{
		for (int i = 0; i &amp;lt; N; ++i)
			if (!used[i])
			{
				used[i] = true;
				ch[s] = i;
				Permutations(s + 1);
				used[i] = false;
			}
	}
}

int main() 
{
    scanf(&quot;%d %d&quot;, &amp;amp;N, &amp;amp;M);
    
    Permutations(0);

    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>algorithms (C++)</category>
      <category>dfs</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/573</guid>
      <comments>https://bonnate.tistory.com/573#entry573comment</comments>
      <pubDate>Wed, 28 Feb 2024 17:38:23 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 양과 늑대  </title>
      <link>https://bonnate.tistory.com/572</link>
      <description>&lt;figure id=&quot;og_1709107322254&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dcmVtR/hyVuoXfL3G/sqg4zr0csJpFaCVvipavZ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dkp2v2/hyVqpXN4e0/8Jjt27jfjyVja9m6K4fPo1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dcmVtR/hyVuoXfL3G/sqg4zr0csJpFaCVvipavZ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dkp2v2/hyVqpXN4e0/8Jjt27jfjyVja9m6K4fPo1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2진 트리 모양 초원의 각 노드에 늑대와 양이 한 마리씩 놓여 있습니다. 이 초원의 루트 노드에서 출발하여 각 노드를 돌아다니며 양을 모으려 합니다. 각 노드를 방문할 때 마다 해당 노드에 있던 양과 늑대가 당신을 따라오게 됩니다. 이때, 늑대는 양을 잡아먹을 기회를 노리고 있으며, 당신이 모은 양의 수보다 늑대의 수가 같거나 더 많아지면 바로 모든 양을 잡아먹어 버립니다. 당신은 중간에 양이 늑대에게 잡아먹히지 않도록 하면서 최대한 많은 수의 양을 모아서 다시 루트 노드로 돌아오려 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsze6g/btsFlPruo5M/vSyQXfxZPKDpjYKAeQXZLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsze6g/btsFlPruo5M/vSyQXfxZPKDpjYKAeQXZLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsze6g/btsFlPruo5M/vSyQXfxZPKDpjYKAeQXZLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsze6g%2FbtsFlPruo5M%2FvSyQXfxZPKDpjYKAeQXZLk%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;1000&quot; height=&quot;1000&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를&amp;nbsp;들어,&amp;nbsp;위&amp;nbsp;그림의&amp;nbsp;경우(루트&amp;nbsp;노드에는&amp;nbsp;항상&amp;nbsp;양이&amp;nbsp;있습니다)&amp;nbsp;0번&amp;nbsp;노드(루트&amp;nbsp;노드)에서&amp;nbsp;출발하면&amp;nbsp;양을&amp;nbsp;한마리&amp;nbsp;모을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;다음으로&amp;nbsp;1번&amp;nbsp;노드로&amp;nbsp;이동하면&amp;nbsp;당신이&amp;nbsp;모은&amp;nbsp;양은&amp;nbsp;두&amp;nbsp;마리가&amp;nbsp;됩니다.&amp;nbsp;이때,&amp;nbsp;바로&amp;nbsp;4번&amp;nbsp;노드로&amp;nbsp;이동하면&amp;nbsp;늑대&amp;nbsp;한&amp;nbsp;마리가&amp;nbsp;당신을&amp;nbsp;따라오게&amp;nbsp;됩니다.&amp;nbsp;아직은&amp;nbsp;양&amp;nbsp;2마리,&amp;nbsp;늑대&amp;nbsp;1마리로&amp;nbsp;양이&amp;nbsp;잡아먹히지&amp;nbsp;않지만,&amp;nbsp;이후에&amp;nbsp;갈&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;아직&amp;nbsp;방문하지&amp;nbsp;않은&amp;nbsp;모든&amp;nbsp;노드(2,&amp;nbsp;3,&amp;nbsp;6,&amp;nbsp;8번)에는&amp;nbsp;늑대가&amp;nbsp;있습니다.&amp;nbsp;이어서&amp;nbsp;늑대가&amp;nbsp;있는&amp;nbsp;노드로&amp;nbsp;이동한다면(예를&amp;nbsp;들어&amp;nbsp;바로&amp;nbsp;6번&amp;nbsp;노드로&amp;nbsp;이동한다면)&amp;nbsp;양&amp;nbsp;2마리,&amp;nbsp;늑대&amp;nbsp;2마리가&amp;nbsp;되어&amp;nbsp;양이&amp;nbsp;모두&amp;nbsp;잡아먹힙니다.&amp;nbsp;여기서는&amp;nbsp;0번,&amp;nbsp;1번&amp;nbsp;노드를&amp;nbsp;방문하여&amp;nbsp;양을&amp;nbsp;2마리&amp;nbsp;모은&amp;nbsp;후,&amp;nbsp;8번&amp;nbsp;노드로&amp;nbsp;이동한&amp;nbsp;후(양&amp;nbsp;2마리&amp;nbsp;늑대&amp;nbsp;1마리)&amp;nbsp;이어서&amp;nbsp;7번,&amp;nbsp;9번&amp;nbsp;노드를&amp;nbsp;방문하면&amp;nbsp;양&amp;nbsp;4마리&amp;nbsp;늑대&amp;nbsp;1마리가&amp;nbsp;됩니다.&amp;nbsp;이제&amp;nbsp;4번,&amp;nbsp;6번&amp;nbsp;노드로&amp;nbsp;이동하면&amp;nbsp;양&amp;nbsp;4마리,&amp;nbsp;늑대&amp;nbsp;3마리가&amp;nbsp;되며,&amp;nbsp;이제&amp;nbsp;5번&amp;nbsp;노드로&amp;nbsp;이동할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;됩니다.&amp;nbsp;따라서&amp;nbsp;양을&amp;nbsp;최대&amp;nbsp;5마리&amp;nbsp;모을&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;각&amp;nbsp;노드에&amp;nbsp;있는&amp;nbsp;양&amp;nbsp;또는&amp;nbsp;늑대에&amp;nbsp;대한&amp;nbsp;정보가&amp;nbsp;담긴&amp;nbsp;배열&amp;nbsp;info,&amp;nbsp;2진&amp;nbsp;트리의&amp;nbsp;각&amp;nbsp;노드들의&amp;nbsp;연결&amp;nbsp;관계를&amp;nbsp;담은&amp;nbsp;2차원&amp;nbsp;배열&amp;nbsp;edges가&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;문제에&amp;nbsp;제시된&amp;nbsp;조건에&amp;nbsp;따라&amp;nbsp;각&amp;nbsp;노드를&amp;nbsp;방문하면서&amp;nbsp;모을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;양은&amp;nbsp;최대&amp;nbsp;몇&amp;nbsp;마리인지&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;2&amp;nbsp;&amp;le;&amp;nbsp;info의&amp;nbsp;길이&amp;nbsp;&amp;le;&amp;nbsp;17
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;info의 원소는 0 또는 1 입니다.&lt;/li&gt;
&lt;li&gt;info[i]는 i번 노드에 있는 양 또는 늑대를 나타냅니다.&lt;/li&gt;
&lt;li&gt;0은 양, 1은 늑대를 의미합니다.&lt;/li&gt;
&lt;li&gt;info[0]의 값은 항상 0입니다. 즉, 0번 노드(루트 노드)에는 항상 양이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;edges의 세로(행) 길이 = info의 길이 - 1&lt;/span&gt;&lt;br /&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;letter-spacing: 0px;&quot;&gt;edges의 가로(열) 길이 = 2&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;edges의 각 행은 [부모 노드 번호, 자식 노드 번호] 형태로, 서로 연결된 두 노드를 나타냅니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;동일한 간선에 대한 정보가 중복해서 주어지지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;항상 하나의 이진 트리 형태로 입력이 주어지며, 잘못된 데이터가 주어지는 경우는 없습니다.&lt;/li&gt;
&lt;li&gt;0번 노드는 항상 루트 노드입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;figure id=&quot;og_1709107421240&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[C++] Programmers 양과 늑대 (2022 KAKAO Blind Recruitment)&quot; data-og-description=&quot;https://programmers.co.kr/learn/courses/30/lessons/92343 코딩테스트 연습 - 양과 늑대 [0,0,1,1,1,0,1,0,1,0,1,1] [[0,1],[1,2],[1,4],[0,8],[8,7],[9,10],[9,11],[4,3],[6,5],[4,6],[8,9]] 5 [0,1,0,1,1,0,1,0,0,1,0] [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6],[&quot; data-og-host=&quot;korini.tistory.com&quot; data-og-source-url=&quot;https://korini.tistory.com/40&quot; data-og-url=&quot;https://korini.tistory.com/40&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dkShf2/hyVudOXOt6/fVyMAw1V0PZFeDm7vojKV1/img.png?width=800&amp;amp;height=461&amp;amp;face=0_0_800_461,https://scrap.kakaocdn.net/dn/CJsr4/hyVur7v0Q8/mxbOPyk5DYIPxMIst9RXjk/img.png?width=800&amp;amp;height=461&amp;amp;face=0_0_800_461,https://scrap.kakaocdn.net/dn/buBoWW/hyVqq3vPr1/ktEKkW9fP5ELGYyHJYMOg1/img.jpg?width=725&amp;amp;height=626&amp;amp;face=0_0_725_626&quot;&gt;&lt;a href=&quot;https://korini.tistory.com/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://korini.tistory.com/40&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dkShf2/hyVudOXOt6/fVyMAw1V0PZFeDm7vojKV1/img.png?width=800&amp;amp;height=461&amp;amp;face=0_0_800_461,https://scrap.kakaocdn.net/dn/CJsr4/hyVur7v0Q8/mxbOPyk5DYIPxMIst9RXjk/img.png?width=800&amp;amp;height=461&amp;amp;face=0_0_800_461,https://scrap.kakaocdn.net/dn/buBoWW/hyVqq3vPr1/ktEKkW9fP5ELGYyHJYMOg1/img.jpg?width=725&amp;amp;height=626&amp;amp;face=0_0_725_626');&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;[C++] Programmers 양과 늑대 (2022 KAKAO Blind Recruitment)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/92343 코딩테스트 연습 - 양과 늑대 [0,0,1,1,1,0,1,0,1,0,1,1] [[0,1],[1,2],[1,4],[0,8],[8,7],[9,10],[9,11],[4,3],[6,5],[4,6],[8,9]] 5 [0,1,0,1,1,0,1,0,0,1,0] [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6],[&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;korini.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;middot; 틀린 코드 (72.2점)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS를 이용하여 각 노드를 방문 시 연결된 모든 노드와, 방문했던 노드를 돌아가는 코드를 추가하여 모든 경우의 수를 검사하려했으나, 중복된 노드를 방문 시 wolf, sheep을 늘리는 문제와 복잡도가 증가하여 해결할 수 없었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1709107482470&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;climits&amp;gt;

using namespace std;

vector&amp;lt;bool&amp;gt; visit;
vector&amp;lt;bool&amp;gt; backed;
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; graph;
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; backing;
int answer = INT_MIN;

void dfs(int sheep, int wolf, int node, vector&amp;lt;int&amp;gt; info) {
    if(sheep == wolf)
    {
        printf(&quot;종료\n&quot;);
        return;
    }
        
    answer = max(answer, sheep);
    
    printf(&quot;[%d] %d, %d\n&quot;, node, sheep, wolf);
    
    if(node != 0)
    {
        printf(&quot;뒤로가기: [%d]-&amp;gt;&quot;, node);
        backed[node] = true;
        dfs(sheep, wolf, backing[node][0], info);
        backed[node] = false;
    }
    
    for(int i = 0; i &amp;lt; graph[node].size(); ++i) {
        int next = graph[node][i];
        
        if(backed[next])
        {
            dfs(sheep, wolf + 1, next, info);
            continue;
        }
        
        if(visit[next] || next == node)
            continue;
        
        visit[next] = true;
        
        printf(&quot;[%d]-&amp;gt;&quot;, node);
        
        if(info[next])
            dfs(sheep, wolf + 1, next, info);
        else
            dfs(sheep + 1, wolf, next, info);
        
        visit[next] = false;
    }
}

int solution(vector&amp;lt;int&amp;gt; info, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; edges) {
    visit = vector&amp;lt;bool&amp;gt;(info.size(), false);
    backed = vector&amp;lt;bool&amp;gt;(info.size(), false);
    backing = vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;(edges.size() + 1, vector&amp;lt;int&amp;gt;());
    graph = vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;(edges.size() + 1, vector&amp;lt;int&amp;gt;());
    
    for(vector&amp;lt;int&amp;gt; edge : edges)
    {
        graph[edge[0]].push_back(edge[1]);
        graph[edge[1]].push_back(edge[0]);
    }
    
    for(vector&amp;lt;int&amp;gt; edge : edges)
        backing[edge[1]].push_back(edge[0]);
    
    visit[0] = true;
    dfs(1, 0, 0, info);
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;middot; 정답 코드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS와 BFS를 결합하여 접근한 방식입니다.&lt;/li&gt;
&lt;li&gt;큐를 활용하여 현재 노드에서 갈 수 있는 모든 노드를 삽입하여 이를 순서대로 방문합니다.&lt;/li&gt;
&lt;li&gt;만약, wolf &amp;gt;= sheep인 경우, 더 나아갈 수 없기때문에 현재 위치를 큐에 삽입합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;⭐ 현재 위치를 큐에 삽입하면, 다른 경로에서 sheep을 더 가져올 수 있습니다. 이를 통해 직전에 통과하지 못한 구간을 통과할 수 있게 됩니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1709107455729&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// https://korini.tistory.com/40

#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;queue&amp;gt;

using namespace std;

vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; graph;
vector&amp;lt;int&amp;gt; _info;

int ans = 0;

void DFS(int cur, int sheep, int wolf, queue&amp;lt;int&amp;gt; q) 
{
    printf(&quot;%d\n&quot;, cur);
    
    // 현재 노드에 있는 양, 늑대를 계산
    if (_info[cur] == 0)
        sheep++;
    else
        wolf++;
    
    // 늑대가 더 많다면, 진행할 수 없음!
    if (wolf &amp;gt;= sheep)
        return;
    
    // 최대값 갱신
    ans = max(ans, sheep);
    
    // 현재 노드에서 갈 수 있는 모든 노드 삽입
    for (int i = 0; i &amp;lt; graph[cur].size(); i++) 
        q.push(graph[cur][i]);
    
    // 큐에 삽입된 순서대로 방문하기
    for (int i = 0; i &amp;lt; q.size(); i++) 
    {
        // 방문할 노드 가져오기
        int next = q.front();
        q.pop();
        
        // DFS 호출
        DFS(next, sheep, wolf, q);
        
        // DFS가 끝난 경우에 추후에 돌아오기 위해 대상 위치를 큐에 삽입
        // 삽입 전 queue의 다른 원소들을 방문하여 재시도 할 수 있음!
        q.push(next);
    }
}

int solution(vector&amp;lt;int&amp;gt; info, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; edges) 
{
    // 단방향 그래프
    graph = vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;(info.size());
    
    // 전역 변수로 설정
    _info.assign(info.begin(), info.end());
    
    // 간선 정보 삽입
    for (int i = 0; i &amp;lt; info.size() - 1; i++)
        graph[edges[i][0]].push_back(edges[i][1]);
    
    queue&amp;lt;int&amp;gt; q;
    DFS(0, 0, 0, q);
    return ans;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>algorithms (C++)</category>
      <category>BFS</category>
      <category>dfs</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/572</guid>
      <comments>https://bonnate.tistory.com/572#entry572comment</comments>
      <pubDate>Wed, 28 Feb 2024 17:08:09 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 최고의 집합</title>
      <link>https://bonnate.tistory.com/571</link>
      <description>&lt;figure id=&quot;og_1709015464028&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12938&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgyizr/hyVqhrAnVv/d1VqzluWcxaCM2XY576xCK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bjws0S/hyVqiD21za/iRMmMcPuHG5R6nbJBacPr0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12938&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12938&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgyizr/hyVqhrAnVv/d1VqzluWcxaCM2XY576xCK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bjws0S/hyVqiD21za/iRMmMcPuHG5R6nbJBacPr0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연수 n 개로 이루어진 중복 집합(multi set, 편의상 이후에는 &quot;집합&quot;으로 통칭) 중에 다음 두 조건을 만족하는 집합을 최고의 집합이라고 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 원소의 합이 S가 되는 수의 집합&lt;/li&gt;
&lt;li&gt;위 조건을 만족하면서 각 원소의 곱 이 최대가 되는 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;예를&amp;nbsp;들어서&amp;nbsp;자연수&amp;nbsp;2개로&amp;nbsp;이루어진&amp;nbsp;집합&amp;nbsp;중&amp;nbsp;합이&amp;nbsp;9가&amp;nbsp;되는&amp;nbsp;집합은&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;4개가&amp;nbsp;있습니다. &lt;br /&gt;{&amp;nbsp;1,&amp;nbsp;8&amp;nbsp;},&amp;nbsp;{&amp;nbsp;2,&amp;nbsp;7&amp;nbsp;},&amp;nbsp;{&amp;nbsp;3,&amp;nbsp;6&amp;nbsp;},&amp;nbsp;{&amp;nbsp;4,&amp;nbsp;5&amp;nbsp;} &lt;br /&gt;그중&amp;nbsp;각&amp;nbsp;원소의&amp;nbsp;곱이&amp;nbsp;최대인&amp;nbsp;{&amp;nbsp;4,&amp;nbsp;5&amp;nbsp;}가&amp;nbsp;최고의&amp;nbsp;집합입니다. &lt;br /&gt;&lt;br /&gt;집합의&amp;nbsp;원소의&amp;nbsp;개수&amp;nbsp;n과&amp;nbsp;모든&amp;nbsp;원소들의&amp;nbsp;합&amp;nbsp;s가&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;최고의&amp;nbsp;집합을&amp;nbsp;return&amp;nbsp;하는&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;최고의 집합은 오름차순으로 정렬된 1차원 배열(list, vector) 로 return 해주세요.&lt;/li&gt;
&lt;li&gt;만약 최고의 집합이 존재하지 않는 경우에 크기가 1인 1차원 배열(list, vector) 에 -1 을 채워서 return 해주세요.&lt;/li&gt;
&lt;li&gt;자연수의 개수 n은 1 이상 10,000 이하의 자연수입니다.&lt;/li&gt;
&lt;li&gt;모든&amp;nbsp;원소들의&amp;nbsp;합&amp;nbsp;s는&amp;nbsp;1&amp;nbsp;이상,&amp;nbsp;100,000,000&amp;nbsp;이하의&amp;nbsp;자연수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;li&gt;다음과 같이 접근하여 해결하였습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중복이 가능한 n개로 이루어진 집합을 구성할 때, 각 원소가 큰 숫자일수록 곱이 커집니다.&lt;/li&gt;
&lt;li&gt;예를들어 n이 3, s가 10일경우 3, 3, 4의 조합으로 구성한것이 가장 큽니다.&lt;/li&gt;
&lt;li&gt;이를 계산하기 위해 s / n을 max값으로 구성하고, s % n을 remain으로하여 remain의 개수만큼은 max + 1의 값으로 채웁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1709015521331&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

vector&amp;lt;int&amp;gt; solution(int n, int s) {
    
    // 만약 합이 자연수 개수보다 작다면 불가능한 조합!
    if(n &amp;gt; s)
        return {-1};
    
    vector&amp;lt;int&amp;gt; answer;
    
    int max = s / n; // 몫 위주로 채우기
    int remains = s % n; // 나누어 떨어지지 않는경우, 몫+1 값으로 채우기
    
    // 나머지 개수가 아닌 만큼 목 위주로 채우기(낮은 값 우선)
    for(int i = 0; i &amp;lt; n - remains; ++i)
        answer.push_back(max);

    // 나머지 개수만큼은 몫+1 값으로 채우기
    for(int i = 0; i &amp;lt; remains; ++i)
        answer.push_back(max + 1);
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/571</guid>
      <comments>https://bonnate.tistory.com/571#entry571comment</comments>
      <pubDate>Tue, 27 Feb 2024 15:35:36 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 네트워크(Union-Find)</title>
      <link>https://bonnate.tistory.com/570</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;연결된&amp;nbsp;형태를&amp;nbsp;의미합니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;컴퓨터&amp;nbsp;A와&amp;nbsp;컴퓨터&amp;nbsp;B가&amp;nbsp;직접적으로&amp;nbsp;연결되어있고,&amp;nbsp;컴퓨터&amp;nbsp;B와&amp;nbsp;컴퓨터&amp;nbsp;C가&amp;nbsp;직접적으로&amp;nbsp;연결되어&amp;nbsp;있을&amp;nbsp;때&amp;nbsp;컴퓨터&amp;nbsp;A와&amp;nbsp;컴퓨터&amp;nbsp;C도&amp;nbsp;간접적으로&amp;nbsp;연결되어&amp;nbsp;정보를&amp;nbsp;교환할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;따라서&amp;nbsp;컴퓨터&amp;nbsp;A,&amp;nbsp;B,&amp;nbsp;C는&amp;nbsp;모두&amp;nbsp;같은&amp;nbsp;네트워크&amp;nbsp;상에&amp;nbsp;있다고&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;컴퓨터의&amp;nbsp;개수&amp;nbsp;n,&amp;nbsp;연결에&amp;nbsp;대한&amp;nbsp;정보가&amp;nbsp;담긴&amp;nbsp;2차원&amp;nbsp;배열&amp;nbsp;computers가&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;네트워크의&amp;nbsp;개수를&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.&lt;/li&gt;
&lt;li&gt;각 컴퓨터는 0부터 n-1인 정수로 표현합니다.&lt;/li&gt;
&lt;li&gt;i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.&lt;/li&gt;
&lt;li&gt;computer[i][i]는&amp;nbsp;항상&amp;nbsp;1입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;union-find를 이용하여 문제를 해결합니다.&lt;/li&gt;
&lt;li&gt;n의 크기에 해당하는 arr를 생성한 후 각 i로 초기화합니다.&lt;/li&gt;
&lt;li&gt;그 후에 2중 for문을 통해 연결된 모든 네트워크를 union합니다.&lt;/li&gt;
&lt;li&gt;마지막으로 모든 arr의 원소를 find하여 그룹 번호를 정리한 후, set에 중복되지 않는 개수를 리턴하여 정답을 구해냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1708949575225&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;map&amp;gt;
#include &amp;lt;queue&amp;gt;
#include &amp;lt;set&amp;gt;

using namespace std;

vector&amp;lt;int&amp;gt; arr;

// Find
int Find(int n) {
    if (n == arr[n]) return n; // n번째 그룹에 바로 속해있는경우 리턴
    else return arr[n] = Find(arr[n]); // n번째 그룹에 바로 속하지 않은경우, DFS로 실제 속한 그룹을 찾기
}

// Union
void Union(int a, int b) {
    arr[Find(a)] = Find(b); // arr[a]는 이제부터 b그룹에 속함
    arr[Find(b)] = Find(a); // arr[a]는 이제부터 b그룹에 속함
}

int solution(int n, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; computers) {
    
    arr = vector&amp;lt;int&amp;gt;(n);
    
    // 집합 정보 초기화
    for (int i = 0; i &amp;lt; n; ++i)
        arr[i] = i;    
    
    for(int i = 0; i &amp;lt; n; ++i)
        for(int j = 0; j &amp;lt; n; ++j)
            if(computers[i][j])
                Union(i, j);
    
    set&amp;lt;int&amp;gt; s;
    for(int i = 0; i &amp;lt; n; ++i)
        s.insert(Find(i));
    
    return s.size();
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>algorithms (C++)</category>
      <category>union-find</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/570</guid>
      <comments>https://bonnate.tistory.com/570#entry570comment</comments>
      <pubDate>Mon, 26 Feb 2024 21:14:37 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 단어 변환</title>
      <link>https://bonnate.tistory.com/569</link>
      <description>&lt;figure id=&quot;og_1708931682703&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43163#&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Q55gi/hyVqiDHhLa/ReMvKRrq2xrGTgZUIT8Lg1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/z7qqm/hyVqoqmymc/fNgmd53PwqBHJNhcCEhZxK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43163#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43163#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Q55gi/hyVqiDHhLa/ReMvKRrq2xrGTgZUIT8Lg1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/z7qqm/hyVqoqmymc/fNgmd53PwqBHJNhcCEhZxK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;begin,&amp;nbsp;target과&amp;nbsp;단어의&amp;nbsp;집합&amp;nbsp;words가&amp;nbsp;있습니다.&amp;nbsp;아래와&amp;nbsp;같은&amp;nbsp;규칙을&amp;nbsp;이용하여&amp;nbsp;begin에서&amp;nbsp;target으로&amp;nbsp;변환하는&amp;nbsp;가장&amp;nbsp;짧은&amp;nbsp;변환&amp;nbsp;과정을&amp;nbsp;찾으려고&amp;nbsp;합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.&lt;/li&gt;
&lt;li&gt;2. words에 있는 단어로만 변환할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를&amp;nbsp;들어&amp;nbsp;begin이&amp;nbsp;&quot;hit&quot;,&amp;nbsp;target가&amp;nbsp;&quot;cog&quot;,&amp;nbsp;words가&amp;nbsp;[&quot;hot&quot;,&quot;dot&quot;,&quot;dog&quot;,&quot;lot&quot;,&quot;log&quot;,&quot;cog&quot;]라면&amp;nbsp;&quot;hit&quot;&amp;nbsp;-&amp;gt;&amp;nbsp;&quot;hot&quot;&amp;nbsp;-&amp;gt;&amp;nbsp;&quot;dot&quot;&amp;nbsp;-&amp;gt;&amp;nbsp;&quot;dog&quot;&amp;nbsp;-&amp;gt;&amp;nbsp;&quot;cog&quot;와&amp;nbsp;같이&amp;nbsp;4단계를&amp;nbsp;거쳐&amp;nbsp;변환할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;두&amp;nbsp;개의&amp;nbsp;단어&amp;nbsp;begin,&amp;nbsp;target과&amp;nbsp;단어의&amp;nbsp;집합&amp;nbsp;words가&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;최소&amp;nbsp;몇&amp;nbsp;단계의&amp;nbsp;과정을&amp;nbsp;거쳐&amp;nbsp;begin을&amp;nbsp;target으로&amp;nbsp;변환할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;작성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;li&gt;각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.&lt;/li&gt;
&lt;li&gt;words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.&lt;/li&gt;
&lt;li&gt;begin과 target은 같지 않습니다.&lt;/li&gt;
&lt;li&gt;변환할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;경우에는&amp;nbsp;0를&amp;nbsp;return&amp;nbsp;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 이해하는데 시간이 걸렸습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;words 배열에 target이 없으면 변환 자체가 불가능합니다.&lt;/li&gt;
&lt;li&gt;words 배열에서 하나씩 선택하여 target을 만들면 됩니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;begin을 변경하되, 한 글자만 변경이 가능하며 이는 words 배열의 원소이어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;words 배열에서 순서는 의미가 없습니다.&lt;/li&gt;
&lt;/ul&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dfs를 이용하여 begin부터 시작하여 words 배열을 모두 검사하여 한글자씩 변경이 가능한 단어인경우, 해당 단어로 변경하여 target까지 변환을 시도하여 answer의 최소값을 구합니다.&lt;/li&gt;
&lt;li&gt;bool sel[51]을 통해 중복선택을 피하여 최적의 값을 구할 수 있도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1708931704922&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;climits&amp;gt;
#include &amp;lt;set&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace std;

bool sel[51]; // words 속 해당 단어를 사용하였는가?
int answer = INT_MAX; // 정답 최소값을 갱신

bool check(string begin, string word)
{
    int cnt = 0;
    for(int i = 0; i &amp;lt; begin.size(); ++i)
        if(begin[i] != word[i])
            ++cnt;

    return cnt == 1;
}

void dfs(string word, string target, vector&amp;lt;string&amp;gt; words, int cnt)
{
    // 현재 생성된 단어가 target과 동일하다면 더 이상 진행하지 않고 최소값 갱신
    if(word == target)
    {
        answer = min(answer, cnt);
        return;        
    }
    
    // 모든 words를 검사하여 변환 가능하다면 뻗어나가기
    for(int i = 0; i &amp;lt; words.size(); ++i)
    {
        // 선택하지 않은 단어이면서, 글자가 한개만 차이가 난다면?
        if(!sel[i] &amp;amp;&amp;amp; check(word, words[i]))
        {
            // 선택 완료 후 해당 문자열로 뻗어나가기
            sel[i] = true;
            dfs(words[i], target, words, cnt + 1);
            // 함수가 종료되면 다시 복구
            sel[i] = false;
        }
    }
}

int solution(string begin, string target, vector&amp;lt;string&amp;gt; words) {

    // words에 target이 없다면 변환 자체가 불가능!
    if(find(words.begin(), words.end(), target) == words.end())
        return 0;
    
    // dfs 탐색
    dfs(begin, target, words, 0);
    
    // 탐색 후 answer가 한번도 갱신되지 않았다면 0 리턴
    return answer == INT_MAX ? 0 : answer;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>algorithms (C++)</category>
      <category>dfs</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/569</guid>
      <comments>https://bonnate.tistory.com/569#entry569comment</comments>
      <pubDate>Mon, 26 Feb 2024 16:18:26 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 정수 삼각형</title>
      <link>https://bonnate.tistory.com/568</link>
      <description>&lt;figure id=&quot;og_1708928828891&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43105&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RAGX9/hyVqkapLRn/H4lC4xJPJisiq3L6IrrFxK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bOmjcQ/hyVqujNDdY/Krsdg902FlyI0Y5NCKri01/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43105&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/43105&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RAGX9/hyVqkapLRn/H4lC4xJPJisiq3L6IrrFxK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bOmjcQ/hyVqujNDdY/Krsdg902FlyI0Y5NCKri01/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7Z5EX/btsFg43y91F/VpKYOVccyB7vOKEHqIQfKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7Z5EX/btsFg43y91F/VpKYOVccyB7vOKEHqIQfKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7Z5EX/btsFg43y91F/VpKYOVccyB7vOKEHqIQfKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7Z5EX%2FbtsFg43y91F%2FVpKYOVccyB7vOKEHqIQfKK%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;368&quot; height=&quot;300&quot; data-origin-width=&quot;368&quot; data-origin-height=&quot;300&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;같은&amp;nbsp;삼각형의&amp;nbsp;꼭대기에서&amp;nbsp;바닥까지&amp;nbsp;이어지는&amp;nbsp;경로&amp;nbsp;중,&amp;nbsp;거쳐간&amp;nbsp;숫자의&amp;nbsp;합이&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;경우를&amp;nbsp;찾아보려고&amp;nbsp;합니다.&amp;nbsp;아래&amp;nbsp;칸으로&amp;nbsp;이동할&amp;nbsp;때는&amp;nbsp;대각선&amp;nbsp;방향으로&amp;nbsp;한&amp;nbsp;칸&amp;nbsp;오른쪽&amp;nbsp;또는&amp;nbsp;왼쪽으로만&amp;nbsp;이동&amp;nbsp;가능합니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;3에서는&amp;nbsp;그&amp;nbsp;아래칸의&amp;nbsp;8&amp;nbsp;또는&amp;nbsp;1로만&amp;nbsp;이동이&amp;nbsp;가능합니다.&lt;br /&gt;삼각형의&amp;nbsp;정보가&amp;nbsp;담긴&amp;nbsp;배열&amp;nbsp;triangle이&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;거쳐간&amp;nbsp;숫자의&amp;nbsp;최댓값을&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;ℹ️ 조건&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼각형의&amp;nbsp;높이는&amp;nbsp;1&amp;nbsp;이상&amp;nbsp;500&amp;nbsp;이하입니다.&lt;br /&gt;삼각형을&amp;nbsp;이루고&amp;nbsp;있는&amp;nbsp;숫자는&amp;nbsp;0&amp;nbsp;이상&amp;nbsp;9,999&amp;nbsp;이하의&amp;nbsp;정수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;bottom-up 방식으로 접근하여 문제를 해결하였습니다.&lt;/li&gt;
&lt;li&gt;검사는 현재 노드에서 대각선 왼쪽과 오른쪽의 각 합을 검사하여 큰 값을 현재 노드에 저장하여 올라가는 방식으로 접근합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;맨 아래 배열의 한칸 위 &quot;triangle.size() - 2&quot; 부터 시작하여 0까지 올라갑니다.&lt;/li&gt;
&lt;li&gt;i의 값 + 1까지 검사하여 현재 행의 모든 노드를 검사합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 노드에서 triangle[i + 1][j]와&lt;span style=&quot;text-align: left;&quot;&gt;&amp;nbsp;triangle[i + 1][j + 1]의 합 중 더 큰 값을 현재 노드에 저장하여 검사합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;마지막 리턴은 triangle[0][0]입니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1708928585769&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;vector&amp;gt;

using namespace std;

int solution(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; triangle) {

    // bottom-up 방식
    // 맨 아래의 한칸 위 {2, 7, 4, 4} 부터 시작하여 맨 위까지 검사
    for(int i = triangle.size() - 2; i &amp;gt;= 0; --i)
        // 현재 칸에서 한칸 아래의 개수(+1)만큼 검사
        for(int j = 0; j &amp;lt; i + 1; ++j)
            // 현재 칸의 값은 현재칸 + 대각선 왼쪽, 대각선 아래쪽의 합 중 큰 값을 저장
            triangle[i][j] += max(triangle[i + 1][j], triangle[i + 1][j + 1]);
    
    return triangle[0][0];
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/568</guid>
      <comments>https://bonnate.tistory.com/568#entry568comment</comments>
      <pubDate>Mon, 26 Feb 2024 15:26:53 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Connect It</title>
      <link>https://bonnate.tistory.com/567</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;Connect It은 학창시절 공책 또는 태블릿에 그림을 그리며 시간을 떼웠던 기억을 떠올려 '필기' 컨셉으로 제작한 게임입니다. 이 게임은 타일에서 다양한 색상의 원을 인접한 같은 색상으로 연결지어 정해진 시도 횟수 안에 높은 점수를 기록하는것이 목표입니다. 글로벌 랭킹 시스템을 도입하여 자신의 실력을 확인하고, 동기를 부여하도록 디자인 하였습니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  게임 소개&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 기간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Connect It (가제)&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Windows, MacOS, &lt;br /&gt;iOS, Android&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;2024.02.20 ~ 개발 중&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리&amp;nbsp;보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Animaion.gif&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SNpSg/btsE6CzhG7J/UPMbbyhlEy9PFVi4VvHQi0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SNpSg/btsE6CzhG7J/UPMbbyhlEy9PFVi4VvHQi0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SNpSg/btsE6CzhG7J/UPMbbyhlEy9PFVi4VvHQi0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/SNpSg/btsE6CzhG7J/UPMbbyhlEy9PFVi4VvHQi0/img.gif&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;404&quot; height=&quot;404&quot; data-filename=&quot;Animaion.gif&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 개발 중&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 Connect It은 개발 중 게임입니다.&lt;/li&gt;
&lt;li&gt;미리보기 영상은 24.02.20 기준이며, 디자인과 컨셉이 변경될 예정입니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/567</guid>
      <comments>https://bonnate.tistory.com/567#entry567comment</comments>
      <pubDate>Tue, 20 Feb 2024 19:35:54 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Rolling Orb</title>
      <link>https://bonnate.tistory.com/566</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBv5Cn/btsEXvtQ01X/QClDlkJZY7xknyiVMTJbn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBv5Cn/btsEXvtQ01X/QClDlkJZY7xknyiVMTJbn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBv5Cn/btsEXvtQ01X/QClDlkJZY7xknyiVMTJbn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBv5Cn%2FbtsEXvtQ01X%2FQClDlkJZY7xknyiVMTJbn0%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;492&quot; height=&quot;240&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;286&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;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;Rolling Orb는 작은 오브를 좌우로 이동시켜 아래에서 빠르게 올라오는 장애물을 피해 오랫동안 버티는 게임입니다. 휴대폰 화면의 좌우를 터치 또는 키보드의 방향키로 조작하는 매우 쉬운 게임이지만, 오브는 점점 빨라지며, 더욱 복잡한 형태의 모양이 나오게 됩니다. 개인 최고 기록을 갱신하여, 다른 친구들과 경쟁하세요.&amp;nbsp;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  게임 소개&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 기간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Rolling&amp;nbsp;Orb&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Windows, MacOS,&lt;br /&gt;iOS, Android&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;2024.02 (약 2주)&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리보기&lt;/h2&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=UZnyuNTPOvs&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/b66YG8/hyVm1O9TZI/3hcK5KKwo2OHajFeyXh9A0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Rolling Orb&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/UZnyuNTPOvs&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; itch.io&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;itch.io에서 데스크톱 버전(MacOS, Windows)의 게임을 즐길 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1708251340593&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;Rolling Orb by Bonnate(PARK SEUNG GEUN)&quot; data-og-description=&quot;Rolling the orb to avoid obstacles and survive as long as you can!&quot; data-og-host=&quot;bonnate.itch.io&quot; data-og-source-url=&quot;https://bonnate.itch.io/rollingorb&quot; data-og-url=&quot;https://bonnate.itch.io/rollingorb&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bsHExd/hyVmPup3nR/oVrFMYo80PLHPxDNCi9LSK/img.png?width=630&amp;amp;height=500&amp;amp;face=0_0_630_500,https://scrap.kakaocdn.net/dn/QeJib/hyVjbsm2Lf/kgmnHucsBxdcaLOEUWL2V0/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254,https://scrap.kakaocdn.net/dn/c2Cqjw/hyVmXeUZQs/9iLOrVHPgr2u2rjkfGKwpK/img.png?width=586&amp;amp;height=286&amp;amp;face=0_0_586_286&quot;&gt;&lt;a href=&quot;https://bonnate.itch.io/rollingorb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bonnate.itch.io/rollingorb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bsHExd/hyVmPup3nR/oVrFMYo80PLHPxDNCi9LSK/img.png?width=630&amp;amp;height=500&amp;amp;face=0_0_630_500,https://scrap.kakaocdn.net/dn/QeJib/hyVjbsm2Lf/kgmnHucsBxdcaLOEUWL2V0/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254,https://scrap.kakaocdn.net/dn/c2Cqjw/hyVmXeUZQs/9iLOrVHPgr2u2rjkfGKwpK/img.png?width=586&amp;amp;height=286&amp;amp;face=0_0_586_286');&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;Rolling Orb by Bonnate(PARK SEUNG GEUN)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Rolling the orb to avoid obstacles and survive as long as you can!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bonnate.itch.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/566</guid>
      <comments>https://bonnate.tistory.com/566#entry566comment</comments>
      <pubDate>Wed, 7 Feb 2024 16:32:16 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Persist it</title>
      <link>https://bonnate.tistory.com/565</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;Persist it은 휴대폰을 기울여 공을 꾸준히 이동시키는 게임입니다. 공을 떨어뜨리기위해 폭탄, 바람, 레이저 등 다양한 방해 요소가 시간이 지남에따라 강력해지며 플레이어의 공을 위협합니다. 플레이어는 이러한 방해를 공을 움직여 버티며 오랫동안 살아남아 세계 기록을 세우는것이 목표입니다. 공을 굴려 오래 버티세요!&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  게임 소개&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 기간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Persist it&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Android, iOS&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;7일&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리&amp;nbsp;보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_202402071604370-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Amn1w/btsEx9ExpgM/aQAiqXxOSo3kWHlEIPVEf1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Amn1w/btsEx9ExpgM/aQAiqXxOSo3kWHlEIPVEf1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Amn1w/btsEx9ExpgM/aQAiqXxOSo3kWHlEIPVEf1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAmn1w%2FbtsEx9ExpgM%2FaQAiqXxOSo3kWHlEIPVEf1%2Fimg.webp&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;800&quot; height=&quot;800&quot; data-filename=&quot;IMG_202402071604370-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;800&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;가로 컨셉아트.jpg&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czOQFN/btsEA4aNGrx/MRkkBkGN2qBn4lKXEjC07k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czOQFN/btsEA4aNGrx/MRkkBkGN2qBn4lKXEjC07k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czOQFN/btsEA4aNGrx/MRkkBkGN2qBn4lKXEjC07k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczOQFN%2FbtsEA4aNGrx%2FMRkkBkGN2qBn4lKXEjC07k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3840&quot; height=&quot;2160&quot; data-filename=&quot;가로 컨셉아트.jpg&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcso0x/btsEwGW7JRA/0KOeD85Q9iniYkJTjyxen1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcso0x/btsEwGW7JRA/0KOeD85Q9iniYkJTjyxen1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;세로 컨셉아트 1.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcso0x/btsEwGW7JRA/0KOeD85Q9iniYkJTjyxen1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcso0x%2FbtsEwGW7JRA%2F0KOeD85Q9iniYkJTjyxen1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1215&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/miso4/btsEyb3mQka/w0IKpJ9DUlRcUXRQ3o2so0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/miso4/btsEyb3mQka/w0IKpJ9DUlRcUXRQ3o2so0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;세로 컨셉아트 4.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/miso4/btsEyb3mQka/w0IKpJ9DUlRcUXRQ3o2so0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmiso4%2FbtsEyb3mQka%2Fw0IKpJ9DUlRcUXRQ3o2so0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1215&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLKSeY/btsEBnVxmBQ/iytDHCQclmKk9qkbfRa0fK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLKSeY/btsEBnVxmBQ/iytDHCQclmKk9qkbfRa0fK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;세로 컨셉아트 2.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLKSeY/btsEBnVxmBQ/iytDHCQclmKk9qkbfRa0fK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLKSeY%2FbtsEBnVxmBQ%2FiytDHCQclmKk9qkbfRa0fK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1215&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chR7sm/btsEyRKllUR/z2snbxvDGSnlWAXgtV9hg0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chR7sm/btsEyRKllUR/z2snbxvDGSnlWAXgtV9hg0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;2160&quot; data-filename=&quot;세로 컨셉아트 3.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chR7sm/btsEyRKllUR/z2snbxvDGSnlWAXgtV9hg0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchR7sm%2FbtsEyRKllUR%2Fz2snbxvDGSnlWAXgtV9hg0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1215&quot; height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작고&amp;nbsp;귀여운&amp;nbsp;축구공이&amp;nbsp;잔디밭에서&amp;nbsp;떨어지지&amp;nbsp;않을&amp;nbsp;것이라고&amp;nbsp;확신하시나요?&amp;nbsp;그렇다면,&amp;nbsp;Persist&amp;nbsp;It이&amp;nbsp;당신에게&amp;nbsp;딱&amp;nbsp;맞는&amp;nbsp;도전일지도&amp;nbsp;모릅니다!&amp;nbsp;Persist&amp;nbsp;It은&amp;nbsp;축구공을&amp;nbsp;잔디밭&amp;nbsp;위에서&amp;nbsp;떨어뜨리기&amp;nbsp;위해&amp;nbsp;다양한&amp;nbsp;방해를&amp;nbsp;해올&amp;nbsp;것입니다. &lt;br /&gt;&lt;br /&gt;Persist&amp;nbsp;It은&amp;nbsp;휴대폰을&amp;nbsp;기울여&amp;nbsp;공을&amp;nbsp;꾸준히&amp;nbsp;이동시키는&amp;nbsp;것을&amp;nbsp;요구하여,&amp;nbsp;그&amp;nbsp;과정에서&amp;nbsp;여러&amp;nbsp;가지&amp;nbsp;방해&amp;nbsp;요소를&amp;nbsp;마주하게&amp;nbsp;됩니다.&amp;nbsp;게임이&amp;nbsp;진행될수록&amp;nbsp;도전의&amp;nbsp;난이도는&amp;nbsp;상승하며,&amp;nbsp;여러&amp;nbsp;가지&amp;nbsp;예기치&amp;nbsp;못한&amp;nbsp;상황들이&amp;nbsp;발생할&amp;nbsp;것입니다.&amp;nbsp;공이&amp;nbsp;떨어지지&amp;nbsp;않도록&amp;nbsp;끊임없이&amp;nbsp;노력하며,&amp;nbsp;도전의&amp;nbsp;흥미로운&amp;nbsp;순간들을&amp;nbsp;만끽하세요! &lt;br /&gt;&lt;br /&gt;[단순하지만&amp;nbsp;어려운&amp;nbsp;게임] &lt;br /&gt;Persist&amp;nbsp;It은&amp;nbsp;매우&amp;nbsp;단순한&amp;nbsp;게임이지만,&amp;nbsp;그&amp;nbsp;단순함이&amp;nbsp;게임의&amp;nbsp;어려움을&amp;nbsp;감출&amp;nbsp;만큼&amp;nbsp;충분합니다.&amp;nbsp;휴대폰을&amp;nbsp;기울여&amp;nbsp;공을&amp;nbsp;굴리는&amp;nbsp;것만으로&amp;nbsp;게임을&amp;nbsp;즐길&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;어떠한&amp;nbsp;복잡한&amp;nbsp;조작도&amp;nbsp;필요&amp;nbsp;없습니다.&amp;nbsp;그러나&amp;nbsp;이&amp;nbsp;작은&amp;nbsp;축구공을&amp;nbsp;계속해서&amp;nbsp;떨어뜨리지&amp;nbsp;않고&amp;nbsp;굴리는&amp;nbsp;것은&amp;nbsp;예상보다&amp;nbsp;어려울&amp;nbsp;수&amp;nbsp;있습니다! &lt;br /&gt;&lt;br /&gt;[게임&amp;nbsp;러닝타임] &lt;br /&gt;게임의&amp;nbsp;러닝타임은&amp;nbsp;평균적으로&amp;nbsp;3분을&amp;nbsp;넘지&amp;nbsp;않아&amp;nbsp;빠르게&amp;nbsp;진행됩니다.&amp;nbsp;하지만,&amp;nbsp;이&amp;nbsp;작은&amp;nbsp;게임에&amp;nbsp;숨겨진&amp;nbsp;어려움을&amp;nbsp;깨닫게&amp;nbsp;될&amp;nbsp;것입니다.&amp;nbsp;그렇게&amp;nbsp;간단해&amp;nbsp;보이지만,&amp;nbsp;얼마나&amp;nbsp;오랫동안&amp;nbsp;축구공을&amp;nbsp;떨어뜨리지&amp;nbsp;않고&amp;nbsp;굴릴&amp;nbsp;수&amp;nbsp;있을지&amp;nbsp;도전해보세요! &lt;br /&gt;&lt;br /&gt;[글로벌&amp;nbsp;랭킹&amp;nbsp;시스템] &lt;br /&gt;Persist&amp;nbsp;It은&amp;nbsp;국가와&amp;nbsp;닉네임을&amp;nbsp;활용하여&amp;nbsp;버틴&amp;nbsp;시간을&amp;nbsp;자동으로&amp;nbsp;랭킹에&amp;nbsp;등록합니다.&amp;nbsp;여러분의&amp;nbsp;우수한&amp;nbsp;실력을&amp;nbsp;세계에&amp;nbsp;자랑하고,&amp;nbsp;다른&amp;nbsp;플레이어들과&amp;nbsp;경쟁하세요!&amp;nbsp;자신을&amp;nbsp;당당히&amp;nbsp;랭킹에&amp;nbsp;올려,&amp;nbsp;엄청난&amp;nbsp;플레이를&amp;nbsp;인정받으세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 출시 예정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Persist it은 모바일 게임으로 PlayStore, AppStore에서 서비스 할 예정입니다. 현재는 심사를 받고 있습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/565</guid>
      <comments>https://bonnate.tistory.com/565#entry565comment</comments>
      <pubDate>Wed, 7 Feb 2024 16:16:43 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Morph!</title>
      <link>https://bonnate.tistory.com/564</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2wyjh/btsEAY9r3SI/64KbsYbEuRbxhw03Cojfr0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2wyjh/btsEAY9r3SI/64KbsYbEuRbxhw03Cojfr0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2wyjh/btsEAY9r3SI/64KbsYbEuRbxhw03Cojfr0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/c2wyjh/btsEAY9r3SI/64KbsYbEuRbxhw03Cojfr0/img.gif&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;620&quot; height=&quot;207&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;Morph!는 게임 속 월드에서 수많은 오브젝트들로 변신하여 서로 추격하거나, 조용히 숨는 등 자신만의 플레이 스타일을 통해 즐길 수 있는 캐주얼 게임입니다. 대학교 4학년에 C# 소켓 서버를 개발 후 온라인 게임을 위해 제작한 프로젝트로, 크로스플랫폼을 지원하여 Steam, AppStore, PlayStore에서 온라인으로 플레이가 가능합니다. 현재 스토어에서 심사를 받아 출시 대기중입니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  게임 소개&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 기간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Morph!&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Windows, MacOS, &lt;br /&gt;Android, iOS&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;2023.07 ~ 2024.02&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리&amp;nbsp;보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Morph&quot;는&amp;nbsp;여러&amp;nbsp;가지&amp;nbsp;플레이&amp;nbsp;스타일을&amp;nbsp;구축하여&amp;nbsp;즐기는&amp;nbsp;캐주얼&amp;nbsp;인디&amp;nbsp;게임으로,&amp;nbsp;주어진&amp;nbsp;세계에서&amp;nbsp;100개가&amp;nbsp;넘는&amp;nbsp;다양한&amp;nbsp;객체를&amp;nbsp;'소유'하여&amp;nbsp;다른&amp;nbsp;플레이어를&amp;nbsp;찾아&amp;nbsp;쫓거나&amp;nbsp;조용히&amp;nbsp;숨을&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;다른&amp;nbsp;객체로&amp;nbsp;자신을&amp;nbsp;소유하세요! &lt;br /&gt;다양한&amp;nbsp;객체로&amp;nbsp;소유하여&amp;nbsp;주변과&amp;nbsp;완벽하게&amp;nbsp;조화되어&amp;nbsp;존재를&amp;nbsp;숨기고&amp;nbsp;전략적으로&amp;nbsp;전술적&amp;nbsp;우위를&amp;nbsp;차지하세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjxPbB/btsEA1kNlLx/OJeTxHAEzCOL14ihAS8ODK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjxPbB/btsEA1kNlLx/OJeTxHAEzCOL14ihAS8ODK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjxPbB/btsEA1kNlLx/OJeTxHAEzCOL14ihAS8ODK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bjxPbB/btsEA1kNlLx/OJeTxHAEzCOL14ihAS8ODK/img.gif&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;720&quot; height=&quot;203&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;203&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;플레이어를&amp;nbsp;찾으세요! &lt;br /&gt;다른&amp;nbsp;플레이어를&amp;nbsp;찾아&amp;nbsp;쫓고&amp;nbsp;처치하세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca5AzI/btsEx9K8VwO/SR4vg3vkXCDLXTos9JMXWK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca5AzI/btsEx9K8VwO/SR4vg3vkXCDLXTos9JMXWK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca5AzI/btsEx9K8VwO/SR4vg3vkXCDLXTos9JMXWK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ca5AzI/btsEx9K8VwO/SR4vg3vkXCDLXTos9JMXWK/img.gif&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;720&quot; height=&quot;203&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;203&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;br /&gt;소유한&amp;nbsp;객체를&amp;nbsp;주변과&amp;nbsp;완벽하게&amp;nbsp;조화되도록&amp;nbsp;숨겨보세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWnJ5u/btsEvYKb9gW/LNMeBVO4sDV0WKBx0EmGb0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWnJ5u/btsEvYKb9gW/LNMeBVO4sDV0WKBx0EmGb0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWnJ5u/btsEvYKb9gW/LNMeBVO4sDV0WKBx0EmGb0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bWnJ5u/btsEvYKb9gW/LNMeBVO4sDV0WKBx0EmGb0/img.gif&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;720&quot; height=&quot;203&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;203&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;br /&gt;다양한&amp;nbsp;스킬을&amp;nbsp;조합하여&amp;nbsp;고유한&amp;nbsp;플레이&amp;nbsp;스타일을&amp;nbsp;만들어&amp;nbsp;게임을&amp;nbsp;즐기세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCa11b/btsEyP6KRr3/9KVUwjbjMwrCe35hcrQftk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCa11b/btsEyP6KRr3/9KVUwjbjMwrCe35hcrQftk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCa11b/btsEyP6KRr3/9KVUwjbjMwrCe35hcrQftk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cCa11b/btsEyP6KRr3/9KVUwjbjMwrCe35hcrQftk/img.gif&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;720&quot; height=&quot;203&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;203&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;맵에서&amp;nbsp;플레이하세요! &lt;br /&gt;다양한&amp;nbsp;컨셉의&amp;nbsp;맵에서&amp;nbsp;다양한&amp;nbsp;객체를&amp;nbsp;활용해&amp;nbsp;게임을&amp;nbsp;즐겨보세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hgt2z/btsExQ6ameX/PkuTdVqgJVff7RFggD2J61/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hgt2z/btsExQ6ameX/PkuTdVqgJVff7RFggD2J61/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hgt2z/btsExQ6ameX/PkuTdVqgJVff7RFggD2J61/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/Hgt2z/btsExQ6ameX/PkuTdVqgJVff7RFggD2J61/img.gif&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;720&quot; height=&quot;203&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; Steam&lt;/h3&gt;
&lt;figure id=&quot;og_1707287271303&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;Morph! on Steam&quot; data-og-description=&quot;Morph is a casual game in which you can transform into a bunch of objects in the world of the game, chasing each other, or hiding quietly, and so on.&quot; data-og-host=&quot;store.steampowered.com&quot; data-og-source-url=&quot;https://store.steampowered.com/app/2791300/Morph/&quot; data-og-url=&quot;https://store.steampowered.com/app/2791300/Morph/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dNWjFc/hyVf56ePmQ/QGkb2MaBQcXJQqJ2Qszmnk/img.jpg?width=616&amp;amp;height=353&amp;amp;face=0_0_616_353,https://scrap.kakaocdn.net/dn/bQxFHZ/hyVfXG8DTY/SJsMvLsBU0AzHsUQmJ0xEk/img.jpg?width=616&amp;amp;height=353&amp;amp;face=0_0_616_353&quot;&gt;&lt;a href=&quot;https://store.steampowered.com/app/2791300/Morph/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://store.steampowered.com/app/2791300/Morph/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dNWjFc/hyVf56ePmQ/QGkb2MaBQcXJQqJ2Qszmnk/img.jpg?width=616&amp;amp;height=353&amp;amp;face=0_0_616_353,https://scrap.kakaocdn.net/dn/bQxFHZ/hyVfXG8DTY/SJsMvLsBU0AzHsUQmJ0xEk/img.jpg?width=616&amp;amp;height=353&amp;amp;face=0_0_616_353');&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;Morph! on Steam&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Morph is a casual game in which you can transform into a bunch of objects in the world of the game, chasing each other, or hiding quietly, and so on.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;store.steampowered.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Steam에서 해당 게임을 다운로드 받아 플레이 할 수 있습니다. 현재는 모든 심사가 완료되어 출시 대기중입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 트레일러 영상&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=7ssntlraWt8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/dOhX5d/hyVf5Zr8ry/O56ZLd7VwNlx4J8ExwQFeK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/7ssntlraWt8&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 스토어 이미지&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWz5jF/btsExPzqsNv/OlT57Tl1LQKQPcEIZeVDSK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWz5jF/btsExPzqsNv/OlT57Tl1LQKQPcEIZeVDSK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;337&quot; data-filename=&quot;ss_c0f1e6fdb7fa725e1d473a926865dde7ee5579fb.600x338.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWz5jF/btsExPzqsNv/OlT57Tl1LQKQPcEIZeVDSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWz5jF%2FbtsExPzqsNv%2FOlT57Tl1LQKQPcEIZeVDSK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW8TDf/btsEyOGOCZd/EKsSVHO6QRFCGXiTMxAhx0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW8TDf/btsEyOGOCZd/EKsSVHO6QRFCGXiTMxAhx0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;337&quot; data-filename=&quot;ss_ca61fecc0af42b49a6c40c7ff4ab8a7e0df2d017.600x338.jpg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW8TDf/btsEyOGOCZd/EKsSVHO6QRFCGXiTMxAhx0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW8TDf%2FbtsEyOGOCZd%2FEKsSVHO6QRFCGXiTMxAhx0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HMgg0/btsEyvHb8E3/bXrtsF4k42zxbhtB3KOjS0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HMgg0/btsEyvHb8E3/bXrtsF4k42zxbhtB3KOjS0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;337&quot; data-filename=&quot;ss_0561105f505fca3e1dd278c4bab10d0805e3b665.600x338.jpg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HMgg0/btsEyvHb8E3/bXrtsF4k42zxbhtB3KOjS0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHMgg0%2FbtsEyvHb8E3%2FbXrtsF4k42zxbhtB3KOjS0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G3Lmn/btsExQE5QA5/g6pfxyGOjYlx31SGBmyko1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G3Lmn/btsExQE5QA5/g6pfxyGOjYlx31SGBmyko1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;337&quot; data-filename=&quot;ss_e0b7e5ec74f90b6cf7855f1e2767197382b9211e.600x338.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G3Lmn/btsExQE5QA5/g6pfxyGOjYlx31SGBmyko1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG3Lmn%2FbtsExQE5QA5%2Fg6pfxyGOjYlx31SGBmyko1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzujde/btsEx5Pve9G/K7Jz3fQ7XkCu77KpfsHjPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzujde/btsEx5Pve9G/K7Jz3fQ7XkCu77KpfsHjPk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;337&quot; data-filename=&quot;ss_e2e7b678eae9c05ac5da5bd563c7464e214730ae.600x338.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzujde/btsEx5Pve9G/K7Jz3fQ7XkCu77KpfsHjPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzujde%2FbtsEx5Pve9G%2FK7Jz3fQ7XkCu77KpfsHjPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgHY9B/btsEARCKfJ3/EI6aMQkOzCh0tAJpr7A2B1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgHY9B/btsEARCKfJ3/EI6aMQkOzCh0tAJpr7A2B1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;337&quot; data-filename=&quot;ss_e365dfdedbca39b46d9651a3dbdd110c3478be8a.600x338.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgHY9B/btsEARCKfJ3/EI6aMQkOzCh0tAJpr7A2B1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgHY9B%2FbtsEARCKfJ3%2FEI6aMQkOzCh0tAJpr7A2B1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 요약 분석서&lt;/h3&gt;
&lt;div id=&quot;code_1707287535043&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;
    &amp;lt;title&amp;gt;Google Drive Iframe&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;iframe src=&amp;quot;https://drive.google.com/file/d/1szTEfysLeCU2pRJyba2WWi_uSM6ZyAAd/preview&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;600px&amp;quot; frameborder=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&quot;&gt;&lt;iframe src=&quot;https://drive.google.com/file/d/1szTEfysLeCU2pRJyba2WWi_uSM6ZyAAd/preview&quot; width=&quot;100%&quot; height=&quot;600px&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 기타 문서&lt;/h3&gt;
&lt;figure id=&quot;og_1707287622926&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Morph 게임 플레이 팁 | Notion&quot; data-og-description=&quot;Morph는 게임 속 월드에서 수많은 오브젝트들로 변신하여 서로 추격하거나, 조용히 숨는 등 자신만의 플레이 스타일을 통해 즐길 수 있는 캐주얼 게임입니다. 일반적으로 모든 플레이어를 처치하&quot; data-og-host=&quot;thunder-puma-0c3.notion.site&quot; data-og-source-url=&quot;https://thunder-puma-0c3.notion.site/Morph-c629997168a74bf586d0f5a88fe16b46&quot; data-og-url=&quot;https://thunder-puma-0c3.notion.site/c629997168a74bf586d0f5a88fe16b46&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bg62CV/hyVgbejwkT/4O3EVghF2nphcXxAuczJTK/img.png?width=2000&amp;amp;height=330&amp;amp;face=0_0_2000_330,https://scrap.kakaocdn.net/dn/bXa04a/hyVf4lYyP9/XPPt5ObbiMhMcKDD40urxk/img.png?width=2000&amp;amp;height=330&amp;amp;face=0_0_2000_330&quot;&gt;&lt;a href=&quot;https://thunder-puma-0c3.notion.site/Morph-c629997168a74bf586d0f5a88fe16b46&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://thunder-puma-0c3.notion.site/Morph-c629997168a74bf586d0f5a88fe16b46&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bg62CV/hyVgbejwkT/4O3EVghF2nphcXxAuczJTK/img.png?width=2000&amp;amp;height=330&amp;amp;face=0_0_2000_330,https://scrap.kakaocdn.net/dn/bXa04a/hyVf4lYyP9/XPPt5ObbiMhMcKDD40urxk/img.png?width=2000&amp;amp;height=330&amp;amp;face=0_0_2000_330');&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;Morph 게임 플레이 팁 | Notion&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Morph는 게임 속 월드에서 수많은 오브젝트들로 변신하여 서로 추격하거나, 조용히 숨는 등 자신만의 플레이 스타일을 통해 즐길 수 있는 캐주얼 게임입니다. 일반적으로 모든 플레이어를 처치하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;thunder-puma-0c3.notion.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1707287641788&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;개인정보 처리방침&quot; data-og-description=&quot;개인정보 처리방침&quot; data-og-host=&quot;morph-privacy.super.site&quot; data-og-source-url=&quot;https://morph-privacy.super.site/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4-%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%B9%A8&quot; data-og-url=&quot;https://morph-privacy.super.site/개인정보-처리방침&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://morph-privacy.super.site/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4-%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%B9%A8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://morph-privacy.super.site/%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4-%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%B9%A8&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;개인정보 처리방침&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개인정보 처리방침&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;morph-privacy.super.site&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 도움을 준 사람&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.instagram.com/_h0_jung/&quot;&gt;에제이엘/&lt;/a&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Morph!의 메인 디자이너로서, Morph 대부분의 UI 디자인을 맡아주었습니다. 바쁜 시간에도 불구하고 적극적으로 다양한 디자인과 의견을 제공해주어 Morph가 자연스러운 UI를 가지도록 큰 도움을 주었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pencils57&quot;&gt;pencils57&lt;/a&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;/li&gt;
&lt;/ul&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/564</guid>
      <comments>https://bonnate.tistory.com/564#entry564comment</comments>
      <pubDate>Wed, 7 Feb 2024 15:32:15 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Mate</title>
      <link>https://bonnate.tistory.com/563</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;Mate는 대학교 3학년에 스토리가 완결되는 게임을 제작하고자 시작한 프로젝트입니다. 이 게임은 주인공인 학교폭력의 가해자가 피해자의 실종으로 자신이 저지른 잘못에 대해 극도의 불안감을 느껴 정신적으로 고통을 받으며 지내는것을 그린 게임입니다. 플레이어는 각종 환각과 악몽을 꾸며 더욱 지쳐가며 여러분은 학교폭력의 가해자인 주인공을 조종하며 게임을 이어 나갑니다. 생애 첫 스토리 완결 게임으로, Steam에 무료로 업로드를 하여 서비스하고 있습니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  게임 소개&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 기간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Mate&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Windows, MacOS&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;2022.03 ~ 2022.07&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리&amp;nbsp;보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;MATE-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vzdx1/btsEwJ7iVWr/M75xow89F3hfxEWPs7ugSK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vzdx1/btsEwJ7iVWr/M75xow89F3hfxEWPs7ugSK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vzdx1/btsEwJ7iVWr/M75xow89F3hfxEWPs7ugSK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVzdx1%2FbtsEwJ7iVWr%2FM75xow89F3hfxEWPs7ugSK%2Fimg.webp&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;800&quot; height=&quot;448&quot; data-filename=&quot;MATE-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; Steam&lt;/h3&gt;
&lt;figure id=&quot;og_1707286010010&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;Mate on Steam&quot; data-og-description=&quot;Mate is a third-person story-based game with a multi-ending game with puzzles and physical controls.The protagonist, the perpetrator of school violence, is anxious that his actions will be revealed to others, which leads to psychological hallucinations and&quot; data-og-host=&quot;store.steampowered.com&quot; data-og-source-url=&quot;https://store.steampowered.com/app/2004700/Mate/&quot; data-og-url=&quot;https://store.steampowered.com/app/2004700/Mate/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jhRVW/hyVfZLJMVW/RZrbxwYyujwPKbyiq4Uy1K/img.jpg?width=616&amp;amp;height=353&amp;amp;face=0_0_616_353,https://scrap.kakaocdn.net/dn/oFWLg/hyVf13RgWS/Ss8rhHKaWtkJ3DslfPzjbK/img.jpg?width=616&amp;amp;height=353&amp;amp;face=0_0_616_353&quot;&gt;&lt;a href=&quot;https://store.steampowered.com/app/2004700/Mate/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://store.steampowered.com/app/2004700/Mate/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jhRVW/hyVfZLJMVW/RZrbxwYyujwPKbyiq4Uy1K/img.jpg?width=616&amp;amp;height=353&amp;amp;face=0_0_616_353,https://scrap.kakaocdn.net/dn/oFWLg/hyVf13RgWS/Ss8rhHKaWtkJ3DslfPzjbK/img.jpg?width=616&amp;amp;height=353&amp;amp;face=0_0_616_353');&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;Mate on Steam&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Mate is a third-person story-based game with a multi-ending game with puzzles and physical controls.The protagonist, the perpetrator of school violence, is anxious that his actions will be revealed to others, which leads to psychological hallucinations and&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;store.steampowered.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 게임은 Steam에서 서비스중인 무료게임입니다. Steam을 통해 다운로드 받아 플레이할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;프로젝트에 대하여&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Mate는 4개월간 사운드의 일부를 제외한 에셋 제작, 기획을 포함하여 모든것을 직접 제작한 의미 있는 게임입니다.&lt;/li&gt;
&lt;li&gt;생애 첫 Steam에 업로드하여 개발자로서 게임을 글로벌로 첫 출시한 게임입니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/563</guid>
      <comments>https://bonnate.tistory.com/563#entry563comment</comments>
      <pubDate>Wed, 7 Feb 2024 15:08:03 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Sky &amp;amp; Shoe</title>
      <link>https://bonnate.tistory.com/562</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;Sky &amp;amp; Shoe는 &amp;lsquo;소라피리&amp;rsquo; 기업에서 출판한 동화책 &amp;lsquo;배가 된 꽃신&amp;rsquo;의 원화을 활용하여 게임 제작 외주를 통해 개발한 게임입니다. 원화 이미지를 유니티의 쉐이더를 활용하여 2D 이미지 기반으로 구성된 3D 월드 컨셉으로 제작을 하였습니다. 이미지의 그림자와 심도가 표현되도록 개발하였으며, 동화책의 스토리를 재구성한 게임입니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  게임 소개&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 기간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Sky&amp;nbsp;&amp;amp;&amp;nbsp;Shoe&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Windows, MacOS,&lt;br /&gt;Android, iOS&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;2022.09&amp;nbsp;~&amp;nbsp;2023.01&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리&amp;nbsp;보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SkyShoe-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhn99Z/btsEwJGadfh/6WtGUZYR88mQAzO33EWK20/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhn99Z/btsEwJGadfh/6WtGUZYR88mQAzO33EWK20/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhn99Z/btsEwJGadfh/6WtGUZYR88mQAzO33EWK20/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdhn99Z%2FbtsEwJGadfh%2F6WtGUZYR88mQAzO33EWK20%2Fimg.webp&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;800&quot; height=&quot;447&quot; data-filename=&quot;SkyShoe-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 프로젝트에 대하여&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 게임은 '&lt;a href=&quot;https://www.yes24.com/Product/Goods/116206746&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;배가 된 꽃신&lt;/a&gt;' 동화책의 원화를 이용하여 제작한 게임입니다.&lt;/li&gt;
&lt;li&gt;프로젝트 매니저 2명, 게임 원화가 2명, 개발 1명으로 구성되었으며 게임 기획 및 클라이언트 개발을 담당하였습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/562</guid>
      <comments>https://bonnate.tistory.com/562#entry562comment</comments>
      <pubDate>Wed, 7 Feb 2024 14:57:33 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Dragon Quest</title>
      <link>https://bonnate.tistory.com/555</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;Dragon Quest는 RPG 장르의 게임으로, 유니티 엔진을 사용하여 개발하였습니다. 플레이어가 다양한 환경에서 다양한 적과 싸우며 성장해나가는 모험을 담고 있습니다. 이 포트폴리오 게임에는 일반적인 RPG 게임에서 볼 수 있는 여러 요소들을 직접 구현하고 적용하였습니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  게임 소개&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 기간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Dragon Quest&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Windows, MacOS&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;2022.08 ~ 2023.04&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리&amp;nbsp;보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DragonQuest-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmjtrG/btsEyQ5DHv8/L2lcDg6DgDGAsjYi8pl3T1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmjtrG/btsEyQ5DHv8/L2lcDg6DgDGAsjYi8pl3T1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmjtrG/btsEyQ5DHv8/L2lcDg6DgDGAsjYi8pl3T1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmjtrG%2FbtsEyQ5DHv8%2FL2lcDg6DgDGAsjYi8pl3T1%2Fimg.webp&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;800&quot; height=&quot;448&quot; data-filename=&quot;DragonQuest-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 다운로드&lt;/h3&gt;
&lt;figure id=&quot;og_1707284605141&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;[Portfolio] Dragon Quest by Bonnate(PARK SEUNG GEUN)&quot; data-og-description=&quot;RPG game portfolio made using Unity.&quot; data-og-host=&quot;bonnate.itch.io&quot; data-og-source-url=&quot;https://bonnate.itch.io/portfolio-dragon-quest&quot; data-og-url=&quot;https://bonnate.itch.io/portfolio-dragon-quest&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cgTFKr/hyVf8onmR0/qRrqILPncc2NEx5wQ0o5R0/img.png?width=1361&amp;amp;height=1080&amp;amp;face=0_0_1361_1080,https://scrap.kakaocdn.net/dn/JJbDO/hyVf1pevCu/qZuuEWUPeksr5Uc8LA43J1/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254&quot;&gt;&lt;a href=&quot;https://bonnate.itch.io/portfolio-dragon-quest&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bonnate.itch.io/portfolio-dragon-quest&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cgTFKr/hyVf8onmR0/qRrqILPncc2NEx5wQ0o5R0/img.png?width=1361&amp;amp;height=1080&amp;amp;face=0_0_1361_1080,https://scrap.kakaocdn.net/dn/JJbDO/hyVf1pevCu/qZuuEWUPeksr5Uc8LA43J1/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254');&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;[Portfolio] Dragon Quest by Bonnate(PARK SEUNG GEUN)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;RPG game portfolio made using Unity.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bonnate.itch.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 게임은 itch.io의 별도로 지원을 받아 다운로드 받아 플레이할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 상세 설명 영상&lt;/h3&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=xzMl6bovaa8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/drUvoa/hyVgbyBzZ4/B9CqorPhlXstmw9eJsckj0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/xzMl6bovaa8&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 기획 및 개발분석안&lt;/h3&gt;
&lt;div id=&quot;code_1706420819974&quot; data-ke-type=&quot;html&quot; data-source=&quot;&amp;lt;object data=&amp;quot;https://blog.kakaocdn.net/dn/beyXHD/btsD6xj6Spg/I4dnAg1zhErnlScuTbzbZk/tfile.pdf&amp;quot; type=&amp;quot;application/pdf&amp;quot; width=&amp;quot;100%&amp;quot; height=&amp;quot;1200&amp;quot;&amp;gt;
&amp;lt;param name=&amp;quot;src&amp;quot; value=&amp;quot;https://blog.kakaocdn.net/dn/beyXHD/btsD6xj6Spg/I4dnAg1zhErnlScuTbzbZk/tfile.pdf&amp;quot; /&amp;gt; &amp;lt;/object&amp;gt;&quot;&gt;&lt;object data=&quot;https://blog.kakaocdn.net/dn/beyXHD/btsD6xj6Spg/I4dnAg1zhErnlScuTbzbZk/tfile.pdf&quot; type=&quot;application/pdf&quot; width=&quot;100%&quot; height=&quot;1200&quot;&gt;
&lt;param name=&quot;src&quot; value=&quot;https://blog.kakaocdn.net/dn/beyXHD/btsD6xj6Spg/I4dnAg1zhErnlScuTbzbZk/tfile.pdf&quot; /&gt; &lt;/object&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/555</guid>
      <comments>https://bonnate.tistory.com/555#entry555comment</comments>
      <pubDate>Wed, 7 Feb 2024 14:46:27 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] ZombieRun</title>
      <link>https://bonnate.tistory.com/561</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;ZombieRun은 대학교 3학년 2학기에 '게임엔진응용실습' 수업에서 진행한 게임 프로젝트입니다. 어두운 산 속에서 길을 잃은 당신은 도움을 청하기 위해 산 정상에 올라가야 합니다. 길을 따라가며 죽지 않고 이동하세요. 총을 사용하여 좀비를 죽이고 자신을 보호하세요. 주변을 탐색하여 총알을 획득하여 전투하거나, 좀비를 살펴 피해다닐 수 있습니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  게임 소개&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 시간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;ZombieRun&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Windows, MacOS&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;12시간&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리&amp;nbsp;보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;zombierun-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GfJAV/btsEA2qkv8o/JShl8ksWP6LJQWukSKHSpk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GfJAV/btsEA2qkv8o/JShl8ksWP6LJQWukSKHSpk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GfJAV/btsEA2qkv8o/JShl8ksWP6LJQWukSKHSpk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGfJAV%2FbtsEA2qkv8o%2FJShl8ksWP6LJQWukSKHSpk%2Fimg.webp&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;800&quot; height=&quot;450&quot; data-filename=&quot;zombierun-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KAbIA9.png&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7jnsa/btsExJThZzh/gwyuC9dq3K4qd7V6MoJPIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7jnsa/btsExJThZzh/gwyuC9dq3K4qd7V6MoJPIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7jnsa/btsExJThZzh/gwyuC9dq3K4qd7V6MoJPIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7jnsa%2FbtsExJThZzh%2FgwyuC9dq3K4qd7V6MoJPIK%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;2560&quot; height=&quot;1080&quot; data-filename=&quot;KAbIA9.png&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;GiGkax.png&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eGZqUb/btsEvfkPOVX/nlHhFtHoYfvsFYsW9aGTW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eGZqUb/btsEvfkPOVX/nlHhFtHoYfvsFYsW9aGTW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eGZqUb/btsEvfkPOVX/nlHhFtHoYfvsFYsW9aGTW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeGZqUb%2FbtsEvfkPOVX%2FnlHhFtHoYfvsFYsW9aGTW0%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;2560&quot; height=&quot;1080&quot; data-filename=&quot;GiGkax.png&quot; data-origin-width=&quot;2560&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 다운로드&lt;/h3&gt;
&lt;figure id=&quot;og_1707282923638&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;ZombieRun by Bonnate(PARK SEUNG GEUN)&quot; data-og-description=&quot;It is a simple FPS game where you use a gun and avoid zombies to reach your destination.&quot; data-og-host=&quot;bonnate.itch.io&quot; data-og-source-url=&quot;https://bonnate.itch.io/zombierun&quot; data-og-url=&quot;https://bonnate.itch.io/zombierun&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/STAup/hyVgdcaiQP/73g8d4vylEdVWLcL7rW3c1/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254&quot;&gt;&lt;a href=&quot;https://bonnate.itch.io/zombierun&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bonnate.itch.io/zombierun&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/STAup/hyVgdcaiQP/73g8d4vylEdVWLcL7rW3c1/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254');&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;ZombieRun by Bonnate(PARK SEUNG GEUN)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;It is a simple FPS game where you use a gun and avoid zombies to reach your destination.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bonnate.itch.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;itch.io에서 게임을 다운로드하여 플레이할 수 있습니다. Windows와 MacOS를 지원합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/561</guid>
      <comments>https://bonnate.tistory.com/561#entry561comment</comments>
      <pubDate>Wed, 7 Feb 2024 14:28:16 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Tower Defense</title>
      <link>https://bonnate.tistory.com/560</link>
      <description>&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;Tower Defense는 대학교 3학년 2학기에 '게임엔진응용실습' 수업에서 진행한 게임 프로젝트입니다. 다가오는 적들이 미리 정해진 경로를 따라 목적지에 도달하기 전에 처치해야 하는 게임입니다. 적을 처치하여 돈을 벌고, 세 가지 유형의 타워를 구매하여 설치해 적을 공격할 수 있습니다. 점점 더 어려워지는 난이도속에서 오래 살아남으세요. 생명력이 0이 되면 게임이 종료됩니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  게임 소개&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 시간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Tower&amp;nbsp;Defense&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Windows, MacOS, Android&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;4시간&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리&amp;nbsp;보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;towerdefense-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ekkvwC/btsEAQKjC9g/0WYXN3phGfxQdQXVtyzLRK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ekkvwC/btsEAQKjC9g/0WYXN3phGfxQdQXVtyzLRK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ekkvwC/btsEAQKjC9g/0WYXN3phGfxQdQXVtyzLRK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FekkvwC%2FbtsEAQKjC9g%2F0WYXN3phGfxQdQXVtyzLRK%2Fimg.webp&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;800&quot; height=&quot;447&quot; data-filename=&quot;towerdefense-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 다운로드&lt;/h3&gt;
&lt;figure id=&quot;og_1707281931656&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;Tower Defense by Bonnate(PARK SEUNG GEUN)&quot; data-og-description=&quot;Simple Tower Defense Game! Windows and Android Support.&quot; data-og-host=&quot;bonnate.itch.io&quot; data-og-source-url=&quot;https://bonnate.itch.io/tower-defense&quot; data-og-url=&quot;https://bonnate.itch.io/tower-defense&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vFyfT/hyVfY0kTHd/2KnBAy91VNJpkCKYCNKYqK/img.gif?width=860&amp;amp;height=501&amp;amp;face=0_0_860_501,https://scrap.kakaocdn.net/dn/bmvlry/hyVfZkDiqE/WmExfD5NpY45V5HaRQMxq0/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254&quot;&gt;&lt;a href=&quot;https://bonnate.itch.io/tower-defense&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bonnate.itch.io/tower-defense&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vFyfT/hyVfY0kTHd/2KnBAy91VNJpkCKYCNKYqK/img.gif?width=860&amp;amp;height=501&amp;amp;face=0_0_860_501,https://scrap.kakaocdn.net/dn/bmvlry/hyVfZkDiqE/WmExfD5NpY45V5HaRQMxq0/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254');&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;Tower Defense by Bonnate(PARK SEUNG GEUN)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Simple Tower Defense Game! Windows and Android Support.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bonnate.itch.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;itch.io에서 게임을 다운로드하여 플레이할 수 있습니다. Windows와 Android를 지원합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;middot; 타워 종류&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전략적으로 타워를 배치하고 업그레이드하여 적의 공격을 막고 영토를 보호하세요.&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;화살 타워: 범위 내의 적 1명에게 유도 화살을 발사합니다.&lt;/li&gt;
&lt;li&gt;석궁 타워 : 경로 끝을 향해 직선으로 화살을 발사합니다.&lt;/li&gt;
&lt;li&gt;버프&amp;nbsp;타워:&amp;nbsp;주변&amp;nbsp;타워의&amp;nbsp;공격&amp;nbsp;속도를&amp;nbsp;향상시킵니다. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/560</guid>
      <comments>https://bonnate.tistory.com/560#entry560comment</comments>
      <pubDate>Wed, 7 Feb 2024 14:13:19 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Space Invader</title>
      <link>https://bonnate.tistory.com/559</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Space Invader는 대학교 3학년 2학기에 '게임엔진응용실습' 수업에서 진행한 게임 프로젝트입니다. 지정된 경로를 따라 전진하는 우주선을 조종하는 게임입니다. 마우스를 사용하여 총알을 발사하여 로켓과 적 항공기를 파괴하고, 장애물과 충돌하지 않고 목표 지점에 도달하는 것입니다. 적의 우주선이 공격할 기회를 갖기 전에 전략적으로 제거해야 합니다.&lt;/blockquote&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;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 시간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Space&amp;nbsp;Invader&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Windows&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;8시간&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Unity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;position: absolute;&quot; 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;h2 data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리&amp;nbsp;보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SpaceInvader-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbT41Y/btsEuPGAv0o/HBhSwvWwn4MG0ZjO5DgCvk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbT41Y/btsEuPGAv0o/HBhSwvWwn4MG0ZjO5DgCvk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbT41Y/btsEuPGAv0o/HBhSwvWwn4MG0ZjO5DgCvk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbT41Y%2FbtsEuPGAv0o%2FHBhSwvWwn4MG0ZjO5DgCvk%2Fimg.webp&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;800&quot; height=&quot;447&quot; data-filename=&quot;SpaceInvader-ezgif.com-video-to-webp-converter.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;middot; 다운로드&lt;/h3&gt;
&lt;figure id=&quot;og_1707281628913&quot; style=&quot;color: #333333; text-align: start;&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buIZyf/hyVf0cMpZJ/9HueMne1VnpPPlbEq6KM2K/img.gif?width=960&amp;amp;height=536&amp;amp;face=0_0_960_536,https://scrap.kakaocdn.net/dn/oCoEN/hyVf9ngo5T/SPVdtwLU7VoqpoSGlN57BK/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254&quot; data-og-url=&quot;https://bonnate.itch.io/space-invader&quot; data-og-source-url=&quot;https://bonnate.itch.io/space-invader&quot; data-og-host=&quot;bonnate.itch.io&quot; data-og-description=&quot;Destroy rockets and enemy aircraft by firing bullets using your mouse!&quot; data-og-title=&quot;Space Invader by Bonnate(PARK SEUNG GEUN)&quot; data-og-type=&quot;website&quot; data-ke-align=&quot;alignCenter&quot; data-ke-type=&quot;opengraph&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://bonnate.itch.io/space-invader&quot; data-source-url=&quot;https://bonnate.itch.io/space-invader&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buIZyf/hyVf0cMpZJ/9HueMne1VnpPPlbEq6KM2K/img.gif?width=960&amp;amp;height=536&amp;amp;face=0_0_960_536,https://scrap.kakaocdn.net/dn/oCoEN/hyVf9ngo5T/SPVdtwLU7VoqpoSGlN57BK/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;Space Invader by Bonnate(PARK SEUNG GEUN)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;Destroy rockets and enemy aircraft by firing bullets using your mouse!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;bonnate.itch.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;itch.io에서 게임을 다운로드하여 플레이할 수 있습니다. MacOS를 지원합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/559</guid>
      <comments>https://bonnate.tistory.com/559#entry559comment</comments>
      <pubDate>Wed, 7 Feb 2024 13:51:28 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Space Flight</title>
      <link>https://bonnate.tistory.com/558</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;'Space Flight'는 대학교 3학년 2학기에 '게임엔진응용실습' 수업에서 진행한 게임 프로젝트입니다. 이 게임은 우주선을 파괴하는 소행성의 충돌을 피하고, 위협적인 직선 로켓도 피해야 합니다. 더 오래 생존하고 더 멀리 여행할수록 점수가 높아집니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  게임 정보&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;게임 이름&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;플랫폼&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 시간&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;개발 도구&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;Space Flight&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;MacOS&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&quot;&gt;4시간&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center; height: 10px;&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;h2 data-ke-size=&quot;size26&quot;&gt;  미리 보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;spaceflight-ezgif.com-video-to-webp-converter (1).webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bftqYC/btsEu6uI5rK/4ERu2JJUbQ4veSO4CB1k5K/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bftqYC/btsEu6uI5rK/4ERu2JJUbQ4veSO4CB1k5K/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bftqYC/btsEu6uI5rK/4ERu2JJUbQ4veSO4CB1k5K/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbftqYC%2FbtsEu6uI5rK%2F4ERu2JJUbQ4veSO4CB1k5K%2Fimg.webp&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;800&quot; height=&quot;447&quot; data-filename=&quot;spaceflight-ezgif.com-video-to-webp-converter (1).webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;447&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;h2 data-ke-size=&quot;size26&quot;&gt;  기타 정보&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;middot;&amp;nbsp;다운로드&lt;/h3&gt;
&lt;figure id=&quot;og_1707281702919&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;Space Flight by Bonnate(PARK SEUNG GEUN)&quot; data-og-description=&quot;Avoid collisions with asteroids!&quot; data-og-host=&quot;bonnate.itch.io&quot; data-og-source-url=&quot;https://bonnate.itch.io/space-flight&quot; data-og-url=&quot;https://bonnate.itch.io/space-flight&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/SF7z2/hyVf8V9WIv/v9kuPwukATOkvKDgU4UQik/img.gif?width=927&amp;amp;height=517&amp;amp;face=0_0_927_517,https://scrap.kakaocdn.net/dn/YWkdc/hyVf56dgz0/md3FGKN9NT1zIVCht7uz0k/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254&quot;&gt;&lt;a href=&quot;https://bonnate.itch.io/space-flight&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bonnate.itch.io/space-flight&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/SF7z2/hyVf8V9WIv/v9kuPwukATOkvKDgU4UQik/img.gif?width=927&amp;amp;height=517&amp;amp;face=0_0_927_517,https://scrap.kakaocdn.net/dn/YWkdc/hyVf56dgz0/md3FGKN9NT1zIVCht7uz0k/img.png?width=508&amp;amp;height=254&amp;amp;face=0_0_508_254');&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;Space Flight by Bonnate(PARK SEUNG GEUN)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Avoid collisions with asteroids!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bonnate.itch.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;itch.io에서 게임을 다운로드하여 플레이할 수 있습니다. Windows를 지원합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>my portfolio</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/558</guid>
      <comments>https://bonnate.tistory.com/558#entry558comment</comments>
      <pubDate>Wed, 7 Feb 2024 13:25:37 +0900</pubDate>
    </item>
    <item>
      <title>[C# 서버] 소켓 서버 문서</title>
      <link>https://bonnate.tistory.com/556</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;C# 기반으로 제작한 소켓 서버의 문서입니다.&lt;br /&gt;이 서버는 Unity 엔진을 위해 제작되었으며, 온라인 게임을 포함하여 시뮬레이션, 하드웨어 제어 등 다양한 분야에서 사용될 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;object data=&quot;https://blog.kakaocdn.net/dn/baL0r9/btsD1mEC7Yf/m1vWAlHBMPPuWUOyU8flW1/tfile.pdf&quot; type=&quot;application/pdf&quot; width=&quot;100%&quot; height=&quot;1200&quot;&gt;
&lt;param name=&quot;src&quot; value=&quot;https://blog.kakaocdn.net/dn/baL0r9/btsD1mEC7Yf/m1vWAlHBMPPuWUOyU8flW1/tfile.pdf&quot; /&gt; &lt;/object&gt;
&lt;/blockquote&gt;</description>
      <category>server/socket server</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/556</guid>
      <comments>https://bonnate.tistory.com/556#entry556comment</comments>
      <pubDate>Sun, 28 Jan 2024 15:04:42 +0900</pubDate>
    </item>
    <item>
      <title>[C#] MySqlConnector를 통해 DB와 통신하기</title>
      <link>https://bonnate.tistory.com/553</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;MySqlConnector 패키지를 이용하여 DB와 통신할 수 있습니다. static 메서드를 통해 별도의 인스턴스 없이 편리하게 접근하여 DB 쿼리를 작성할 수 있도록 구현합니다.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;nbsp;미리 보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Animation.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMJgBF/btsD3ke4sGT/GAQ7RWVtA7BjPuFdr8Z9JK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMJgBF/btsD3ke4sGT/GAQ7RWVtA7BjPuFdr8Z9JK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMJgBF/btsD3ke4sGT/GAQ7RWVtA7BjPuFdr8Z9JK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMJgBF%2FbtsD3ke4sGT%2FGAQ7RWVtA7BjPuFdr8Z9JK%2Fimg.webp&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;800&quot; height=&quot;800&quot; data-filename=&quot;Animation.webp&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;'미리보기'에 나오는 영상은 Morph! 게임에서 사용자의 로그인을 하는 과정입니다.&lt;/li&gt;
&lt;li&gt;작성한 'MySqlManager' 클래스는 서버에 구현되어있으며, 클라이언트는 서버를 통해 DB에 접근하는 방식입니다.&lt;/li&gt;
&lt;li&gt;이렇게 구현한 이유는 MySQL에 접근하기위한 접속쿼리가 클라이언트 코드에 노출되지 않게 하기 위함입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클라이언트의 디컴파일을 통해 리터럴이 노출되면 DB 자체가 공격을 받을 수 있기 때문입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; 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;MySqlManager에서는 Insert, Update 등을 수행할 수 있는 'Command' 메서드와 데이터를 읽기 위한 'Select' 메서드를 구현하였습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;⚒️&amp;nbsp;구현&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 구현 내용&lt;/h3&gt;
&lt;pre id=&quot;code_1706414513529&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using MySqlConnector;
using Server.Game;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

/// &amp;lt;summary&amp;gt;
/// MySQL 쿼리 매니저
/// &amp;lt;/summary&amp;gt;
public class MySqlManager
{
    private static ThreadLocal&amp;lt;MySqlConnection&amp;gt; _Connection = new ThreadLocal&amp;lt;MySqlConnection&amp;gt;(); // SQL Connection

    private static string _SqlConnection = null; //SQL 접속 명령인자

    static MySqlManager()
    {
        // 접속 명령인자 생성
        StringBuilder builder = new StringBuilder();

        builder.AppendFormat(&quot;Server={0};&quot;, &quot;192.168.0.1&quot;); // DB가 설치된 ID
        builder.AppendFormat(&quot;Port={0};&quot;, &quot;1234&quot;); // DB의 포트 번호
        builder.AppendFormat(&quot;Database={0};&quot;, &quot;sampleDB&quot;); // 데이터베이스 이름
        builder.AppendFormat(&quot;Uid={0};&quot;, &quot;sampleUser&quot;); // 사용자 이름
        builder.AppendFormat(&quot;Pwd={0}&quot;, &quot;samplePassword&quot;); // 사용자의 비밀번호

        _SqlConnection = builder.ToString();
    }

    private static void MySqlConnect()
    {
        try
        {
            _Connection.Value = new MySqlConnection(_SqlConnection);
            _Connection.Value.Open();

            if (_Connection.Value.State != ConnectionState.Open)
            {
                throw new InvalidOperationException(&quot;Connection failed to open.&quot;);
            }
        }
        catch (Exception ex)
        {
            Logger.Log(ex.Message);
        }
    }

    private static void MySqlDisconnect()
    {
        if (_Connection.Value != null &amp;amp;&amp;amp; _Connection.Value.State != ConnectionState.Closed)
        {
            _Connection.Value.Close();
            _Connection.Value = null;
        }
    }

    public static MySqlErrorCode Command(string command)
    {
        Logger.Log($&quot;[SELECT]: {command}&quot;);

        MySqlConnect(); // 접속

        try
        {
            MySqlCommand dbcmd = new MySqlCommand(command, _Connection.Value); // 명령어를 커맨드에 입력
            dbcmd.ExecuteNonQuery(); // 명령어를 SQL에 보냄

            return MySqlErrorCode.None;
        }
        catch (MySqlException e) // SQL 오류
        {
            Logger.Log(e.ToString());

            return e.ErrorCode;
        }
        finally
        {
            MySqlDisconnect(); // 접속 해제
        }
    }

    public static DataTableReader Select(string command)
    {
        Logger.Log($&quot;[SELECT]: {command}&quot;);

        MySqlConnect(); // 접속

        try
        {
            MySqlDataAdapter adapter = new MySqlDataAdapter(command, _Connection.Value);
            DataTable table = new DataTable(); // 테이블 생성
            adapter.Fill(table); // 데이터 테이블 채우기

            return table.CreateDataReader(); // 성공적으로 select를 했다면, 데이터 리더를 생성
        }
        catch (MySqlException e) // SQL 오류 발생
        {
            Logger.Log(e.ToString());

            return null;
        }
        finally
        {
            MySqlDisconnect(); // 접속 해제
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706414545094&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;builder.AppendFormat(&quot;Server={0};&quot;, &quot;192.168.0.1&quot;); // DB가 설치된 ID
builder.AppendFormat(&quot;Port={0};&quot;, &quot;1234&quot;); // DB의 포트 번호
builder.AppendFormat(&quot;Database={0};&quot;, &quot;sampleDB&quot;); // 데이터베이스 이름
builder.AppendFormat(&quot;Uid={0};&quot;, &quot;sampleUser&quot;); // 사용자 이름
builder.AppendFormat(&quot;Pwd={0}&quot;, &quot;samplePassword&quot;); // 사용자의 비밀번호&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이곳에서 접속할 데이터베이스의 접속인자를 정의합니다. 이 코드에서는 임시로 채워넣었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706414604743&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static MySqlErrorCode Command(string command)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Command 메서드는 테이블을 읽지 않는 쿼리를 요청할때 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;MySqlErrorCode를 리턴하여 성공적으로 Command를 수행했는지 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1706414650294&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static DataTableReader Select(string command)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Select 메서드는 테이블을 읽고, 이를 리턴하기위해 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;사용자의 로그인, 회원가입 읽기 등 다양한 부분에서 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;✅ 적용&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; Command&lt;/h3&gt;
&lt;pre id=&quot;code_1706414738451&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void AddCoin(int playerUniqueId, int amount)
{
    DataTableReader balanceInfo = MySqlManager.Select($&quot;select coins from balance where user_id = {playerUniqueId}&quot;);
    if (balanceInfo.Read())
    {
        MySqlManager.Command($&quot;update balance set coins = {balanceInfo.GetInt32(0) + amount} where user_id = {playerUniqueId};&quot;);
    }
    else
    {
        Logger.Log($&quot;[ERROR EXCEPTION] No {playerUniqueId} Level Column from DB!&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음과 같이 Command를 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Command는 UPDATE문 등 테이블을 읽지 않는 쿼리를 사용하기 위한 메서드입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; Select&lt;/h3&gt;
&lt;pre id=&quot;code_1706414815469&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// 플레이어의 현재 인벤토리 정보를 전송
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;param name=&quot;clientSession&quot;&amp;gt;&amp;lt;/param&amp;gt;
public static void SendPlayerInventory(ClientSession clientSession)
{
    int PlayerUniqueId = clientSession.MyPlayer.PlayerInfo.PlayerUniqueId;
    S_RespondPlayerGameData s_RespondPlayerGameData = new S_RespondPlayerGameData();

    // 인벤토리 정보 가져오기
    DataTableReader inventoryInfo = MySqlManager.Select($&quot;select item_id, amount from inventory where user_id = {PlayerUniqueId}&quot;);
    while (inventoryInfo.Read())
    {
        int item_id = Convert.ToInt32(inventoryInfo[&quot;item_id&quot;]); // item_id 열 값 가져오기
        int amount = Convert.ToInt32(inventoryInfo[&quot;amount&quot;]);   // amount 열 값 가져오기

        // DbItemData 객체 생성 및 값 할당
        DbItemData itemData = new DbItemData()
        {
            EntityCode = item_id,
            Count = amount,
        };

        // DbItemDatas 추가
        s_RespondPlayerGameData.InventoryInfo.Add(itemData);
    }

    DataTableReader expInfo = MySqlManager.Select($&quot;select exp, lv from level where user_id = {PlayerUniqueId}&quot;);
    if (expInfo.Read())
    {
        s_RespondPlayerGameData.Exp = expInfo.GetInt32(0);
        s_RespondPlayerGameData.Level = expInfo.GetInt32(1);
    }
    else
        Logger.Log($&quot;uniqueId {PlayerUniqueId} is null from DB!&quot;);

    DataTableReader coinInfo = MySqlManager.Select($&quot;select coins, skill_point from balance where user_id = {PlayerUniqueId}&quot;);
    if (coinInfo.Read())
    {
        s_RespondPlayerGameData.Coins = coinInfo.GetInt32(0);
        s_RespondPlayerGameData.SkillPoint = coinInfo.GetInt32(1);
    }
    else
        Logger.Log($&quot;uniqueId {PlayerUniqueId} is null from DB!&quot;);

    // 데이터 전송
    clientSession.Send(s_RespondPlayerGameData);

    // 할당 인벤토리 데이터 전송
    SendAllocatedInventorySelf(clientSession);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 코드는 플레이어의 인벤토리 정보를 전달하기 위한 메서드입니다.&lt;/li&gt;
&lt;li&gt;Select 쿼리를 사용하여 DB에서 정보를 읽고, 이를 추출하여 패킷에 담아 보냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ Unity Affiliate&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unity Affiliate Program 파트너로서 아래의 배너를 통해 접속하신 경우 수수료를 받을 수 있습니다.&lt;/li&gt;
&lt;li&gt;아래 배너의 에셋들은 &lt;b&gt;'실시간 무료 에셋 랭킹'&lt;/b&gt;을 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe src=&quot;https://assetstore.unity.com/linkmaker/embed/list/top-free/widget-wide-light?aid=1101lvUFr&quot; style=&quot;width:860px; height:100px; border:0px;&quot;&gt;&lt;/iframe&gt;</description>
      <category>unity game modules</category>
      <category>DB</category>
      <category>Server</category>
      <category>Unity</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/553</guid>
      <comments>https://bonnate.tistory.com/553#entry553comment</comments>
      <pubDate>Sun, 28 Jan 2024 13:10:34 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] Graphics device is null. 오류 해결</title>
      <link>https://bonnate.tistory.com/552</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span&gt;에디터에서는 괜찮지만, 빌드 후 실행 시 &quot;Graphics&amp;nbsp;device&amp;nbsp;is&amp;nbsp;null.&quot; 오류가 나타날 수 있습니다. 이 오류의 원인은 다양하지만, TMP를 서브스레드에서 제어할 경우 나타날 수 있습니다. 이를 해결하기위해 메인스레드에서 제어할 수 있도록 하는 기능을 구현하였습니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;유니티 빌드 프로그램이 크래시가 난 후 player.log를 살펴보면 다음과같이 stacktrace와 함께 오류가 난 부분이 나타납니다. 이 함수가 호출되는 위치를 메인스레드에서 호출할 수 있도록 구현한 기능을 이용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1705541047040&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Graphics device is null.
TMPro.TextMeshProUGUI:Awake()
UiTab:ToggleLerp(Boolean, Single)
PacketHandler:S_EnterGameHandler(PacketSession, IMessage)
PacketManager:MakePacket(PacketSession, ArraySegment`1, UInt16)
ServerSession:OnRecvPacket(ArraySegment`1)
ServerCore.PacketSession:OnRecv(ArraySegment`1)
ServerCore.Session:OnRecvCompleted(Object, SocketAsyncEventArgs)
System.Net.Sockets.&amp;lt;&amp;gt;c:&amp;lt;.cctor&amp;gt;b__367_10(IAsyncResult)
System.Threading.ThreadPoolWorkQueue:Dispatch()&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;⚒️&amp;nbsp;구현&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;싱글턴으로 Monobehavior을 상속받아 메인스레드에서 Upate를 호출하여 queue의 내용을 꺼내와 함수를 호출합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1705541092165&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;
using System;
using System.Collections.Generic;

public class UnityMainThreadDispatcher : MonoBehaviour
{
    private static readonly Queue&amp;lt;Action&amp;gt; _executionQueue = new Queue&amp;lt;Action&amp;gt;();
    private static UnityMainThreadDispatcher _instance = null;

    public static UnityMainThreadDispatcher Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType&amp;lt;UnityMainThreadDispatcher&amp;gt;();

                if (_instance == null)
                {
                    GameObject go = new GameObject(&quot;UnityMainThreadDispatcher&quot;);
                    _instance = go.AddComponent&amp;lt;UnityMainThreadDispatcher&amp;gt;();
                }
            }

            return _instance;
        }
    }

    private void Awake() 
    {
        UnityMainThreadDispatcher.Instance.Enqueue(() =&amp;gt; Debug.Log(&quot;UnityMainThreadDispatcher Active!&quot;));
    }

    private void Update()
    {
        lock (_executionQueue)
        {
            while (_executionQueue.Count &amp;gt; 0)
            {
                _executionQueue.Dequeue().Invoke();
            }
        }
    }

    public void Enqueue(Action action)
    {
        lock (_executionQueue)
        {
            _executionQueue.Enqueue(action);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;span style=&quot;letter-spacing: 0px;&quot;&gt;매니저로서 역할을 수행할 수 있도록 Scene에 컴포넌트를 추가해줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSdwZN/btsDAh4PeaX/Lia87IcKldDR9reJTaK250/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSdwZN/btsDAh4PeaX/Lia87IcKldDR9reJTaK250/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSdwZN/btsDAh4PeaX/Lia87IcKldDR9reJTaK250/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSdwZN%2FbtsDAh4PeaX%2FLia87IcKldDR9reJTaK250%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;1087&quot; height=&quot;107&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;107&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;오류가 난 부분이 메인스레드에서 호출될 수 있도록 Action타입으로 함수를 호출해줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1705541218504&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// 서버에 접속하면 네트워크 매니저가 호출
/// &amp;lt;/summary&amp;gt;
public void ConnectedFromServer()
{
    UnityMainThreadDispatcher.Instance.Enqueue(() =&amp;gt; 
    {
        // Auth 매니저 활성화
        AuthManager.Instance.Init();

        // 로딩 탭 비활성화
        UiTabCtrl.Clear(1.0f);
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ Unity Affiliate&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unity Affiliate Program 파트너로서 아래의 배너를 통해 접속하신 경우 수수료를 받을 수 있습니다.&lt;/li&gt;
&lt;li&gt;아래 배너의 에셋들은 &lt;b&gt;'실시간 무료 에셋 랭킹'&lt;/b&gt;을 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe src=&quot;https://assetstore.unity.com/linkmaker/embed/list/top-free/widget-wide-light?aid=1101lvUFr&quot; style=&quot;width:860px; height:100px; border:0px;&quot;&gt;&lt;/iframe&gt;</description>
      <category>unity game modules</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/552</guid>
      <comments>https://bonnate.tistory.com/552#entry552comment</comments>
      <pubDate>Thu, 18 Jan 2024 10:28:26 +0900</pubDate>
    </item>
    <item>
      <title>[C++][백준 2579번] 계단오르기</title>
      <link>https://bonnate.tistory.com/551</link>
      <description>&lt;figure id=&quot;og_1702241934833&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;2579번: 계단 오르기&quot; data-og-description=&quot;계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. &amp;lt;그림 1&amp;gt;과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/2579&quot; data-og-url=&quot;https://www.acmicpc.net/problem/2579&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b3UPR2/hyULRsxPgy/bPQK1XBNpBDBvfRI0bxQD0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/djDw3P/hyULUW6lY5/h1wRTba5obRDOJ80sq7xqK/img.png?width=962&amp;amp;height=610&amp;amp;face=0_0_962_610,https://scrap.kakaocdn.net/dn/bsR1UK/hyUL0bWLiu/r6kRLLA1fAh0A9QqFNT6J1/img.png?width=962&amp;amp;height=514&amp;amp;face=0_0_962_514&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2579&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/2579&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b3UPR2/hyULRsxPgy/bPQK1XBNpBDBvfRI0bxQD0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/djDw3P/hyULUW6lY5/h1wRTba5obRDOJ80sq7xqK/img.png?width=962&amp;amp;height=610&amp;amp;face=0_0_962_610,https://scrap.kakaocdn.net/dn/bsR1UK/hyUL0bWLiu/r6kRLLA1fAh0A9QqFNT6J1/img.png?width=962&amp;amp;height=514&amp;amp;face=0_0_962_514');&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;2579번: 계단 오르기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. &amp;lt;그림 1&amp;gt;과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;위치한&amp;nbsp;도착점까지&amp;nbsp;가는&amp;nbsp;게임이다.&amp;nbsp;&amp;lt;그림&amp;nbsp;1&amp;gt;과&amp;nbsp;같이&amp;nbsp;각각의&amp;nbsp;계단에는&amp;nbsp;일정한&amp;nbsp;점수가&amp;nbsp;쓰여&amp;nbsp;있는데&amp;nbsp;계단을&amp;nbsp;밟으면&amp;nbsp;그&amp;nbsp;계단에&amp;nbsp;쓰여&amp;nbsp;있는&amp;nbsp;점수를&amp;nbsp;얻게&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TPndc/btsBDM0c5x8/Ch5JoOKV0Ka2ftQjggFsBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TPndc/btsBDM0c5x8/Ch5JoOKV0Ka2ftQjggFsBK/img.png&quot; data-alt=&quot;&amp;amp;lt;그림 1&amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TPndc/btsBDM0c5x8/Ch5JoOKV0Ka2ftQjggFsBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTPndc%2FbtsBDM0c5x8%2FCh5JoOKV0Ka2ftQjggFsBK%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;237&quot; height=&quot;514&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;그림 1&amp;gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;&amp;lt;그림&amp;nbsp;2&amp;gt;와&amp;nbsp;같이&amp;nbsp;시작점에서부터&amp;nbsp;첫&amp;nbsp;번째,&amp;nbsp;두&amp;nbsp;번째,&amp;nbsp;네&amp;nbsp;번째,&amp;nbsp;여섯&amp;nbsp;번째&amp;nbsp;계단을&amp;nbsp;밟아&amp;nbsp;도착점에&amp;nbsp;도달하면&amp;nbsp;총&amp;nbsp;점수는&amp;nbsp;10&amp;nbsp;+&amp;nbsp;20&amp;nbsp;+&amp;nbsp;25&amp;nbsp;+&amp;nbsp;20&amp;nbsp;=&amp;nbsp;75점이&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSndvh/btsBKf0toKr/CK9kQuC3qn4YtxbxJF08u0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSndvh/btsBKf0toKr/CK9kQuC3qn4YtxbxJF08u0/img.png&quot; data-alt=&quot;&amp;amp;lt;그림 2&amp;amp;gt;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSndvh/btsBKf0toKr/CK9kQuC3qn4YtxbxJF08u0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSndvh%2FbtsBKf0toKr%2FCK9kQuC3qn4YtxbxJF08u0%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;233&quot; height=&quot;148&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;그림 2&amp;gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;계단 오르는 데는 다음과 같은 규칙이 있다. &lt;br /&gt;&lt;br /&gt;계단은&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;한&amp;nbsp;계단씩&amp;nbsp;또는&amp;nbsp;두&amp;nbsp;계단씩&amp;nbsp;오를&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;즉,&amp;nbsp;한&amp;nbsp;계단을&amp;nbsp;밟으면서&amp;nbsp;이어서&amp;nbsp;다음&amp;nbsp;계단이나,&amp;nbsp;다음&amp;nbsp;다음&amp;nbsp;계단으로&amp;nbsp;오를&amp;nbsp;수&amp;nbsp;있다. &lt;br /&gt;연속된&amp;nbsp;세&amp;nbsp;개의&amp;nbsp;계단을&amp;nbsp;모두&amp;nbsp;밟아서는&amp;nbsp;안&amp;nbsp;된다.&amp;nbsp;단,&amp;nbsp;시작점은&amp;nbsp;계단에&amp;nbsp;포함되지&amp;nbsp;않는다. &lt;br /&gt;마지막&amp;nbsp;도착&amp;nbsp;계단은&amp;nbsp;반드시&amp;nbsp;밟아야&amp;nbsp;한다. &lt;br /&gt;따라서&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;계단을&amp;nbsp;밟고&amp;nbsp;이어&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;계단이나,&amp;nbsp;세&amp;nbsp;번째&amp;nbsp;계단으로&amp;nbsp;오를&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;하지만,&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;계단을&amp;nbsp;밟고&amp;nbsp;이어&amp;nbsp;네&amp;nbsp;번째&amp;nbsp;계단으로&amp;nbsp;올라가거나,&amp;nbsp;첫&amp;nbsp;번째,&amp;nbsp;두&amp;nbsp;번째,&amp;nbsp;세&amp;nbsp;번째&amp;nbsp;계단을&amp;nbsp;연속해서&amp;nbsp;모두&amp;nbsp;밟을&amp;nbsp;수는&amp;nbsp;없다. &lt;br /&gt;&lt;br /&gt;각&amp;nbsp;계단에&amp;nbsp;쓰여&amp;nbsp;있는&amp;nbsp;점수가&amp;nbsp;주어질&amp;nbsp;때&amp;nbsp;이&amp;nbsp;게임에서&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;총&amp;nbsp;점수의&amp;nbsp;최댓값을&amp;nbsp;구하는&amp;nbsp;프로그램을&amp;nbsp;작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;li&gt;조건으로, 계단을 세개 연속으로 밟을 수 없기때문에 아래와 같이 고려해야합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 위치(n)일 때, n-3의 누적 + n-1을 밟으면서 n을 밟은 경우&lt;/li&gt;
&lt;li&gt;n에서 n-2의 누적과 함께 n을 밟은 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702242010083&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;
using namespace std;

vector&amp;lt;int&amp;gt; dp(301, -1);
int input[301];

//int func(int n)
//{
//	// 0보다 작다면 0리턴
//	if (n &amp;lt; 0)
//		return 0;
//
//	int&amp;amp; ret = dp[n];
//
//	// 해당 값이 이미 있다면, 즉시 리턴
//	if (ret != -1)
//		return ret;
//
//	ret = max(ret, func(n - 2) + input[n]); // case1: n-2 계단과 n번 계단을 함께 밟는 경우
//	ret = max(ret, func(n - 3) + input[n - 1] + input[n]); // case2: n-3 계단과 n-1, n번 계단을 함께 밟는 경우
//
//	return ret;
//}

int main()
{
	ios_base::sync_with_stdio(false);

	int N;
	cin &amp;gt;&amp;gt; N;

	for (int i = 1; i &amp;lt;= N; ++i)
		cin &amp;gt;&amp;gt; input[i];

	dp[0] = 0;
	dp[1] = input[1]; // 1번 계단까지의 최대값은 1번 계단
	dp[2] = input[1] + input[2]; // 2번 계단까지의 최대값은 1번 계단 + 2번 계단
	for (int i = 3; i &amp;lt;= N; ++i)
		dp[i] = max(dp[i - 3] + input[i - 1] + input[i], dp[i - 2] + input[i]);

	cout &amp;lt;&amp;lt; dp[N];
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dp를 통해 문제를 해결하며, top-down 과 bottom-up 방식을 모두 구현하였습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>DP</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/551</guid>
      <comments>https://bonnate.tistory.com/551#entry551comment</comments>
      <pubDate>Mon, 11 Dec 2023 06:01:53 +0900</pubDate>
    </item>
    <item>
      <title>[C++][백준 9095번] 1, 2, 3 더하기</title>
      <link>https://bonnate.tistory.com/550</link>
      <description>&lt;figure id=&quot;og_1702237677906&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;9095번: 1, 2, 3 더하기&quot; data-og-description=&quot;각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/9095&quot; data-og-url=&quot;https://www.acmicpc.net/problem/9095&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kKTQm/hyUL0iIPnH/F6PHDwY65XMS8KRkfH7kx1/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/9095&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/9095&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kKTQm/hyUL0iIPnH/F6PHDwY65XMS8KRkfH7kx1/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;9095번: 1, 2, 3 더하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수&amp;nbsp;4를&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3의&amp;nbsp;합으로&amp;nbsp;나타내는&amp;nbsp;방법은&amp;nbsp;총&amp;nbsp;7가지가&amp;nbsp;있다.&amp;nbsp;합을&amp;nbsp;나타낼&amp;nbsp;때는&amp;nbsp;수를&amp;nbsp;1개&amp;nbsp;이상&amp;nbsp;사용해야&amp;nbsp;한다. &lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1+1+1+1&lt;/li&gt;
&lt;li&gt;1+1+2&lt;/li&gt;
&lt;li&gt;1+2+1&lt;/li&gt;
&lt;li&gt;2+1+1&lt;/li&gt;
&lt;li&gt;2+2&lt;/li&gt;
&lt;li&gt;1+3&lt;/li&gt;
&lt;li&gt;3+1&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수&amp;nbsp;n이&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;n을&amp;nbsp;1,&amp;nbsp;2,&amp;nbsp;3의&amp;nbsp;합으로&amp;nbsp;나타내는&amp;nbsp;방법의&amp;nbsp;수를&amp;nbsp;구하는&amp;nbsp;프로그램을&amp;nbsp;작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1702237669489&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;algorithm&amp;gt;
using namespace std;

int main()
{
	int dp[12];

	dp[1] = 1; // 1
	dp[2] = 2; // 1+1, 2
	dp[3] = 4; // 1+1+1, 1+2, 2+1, 3
	//dp[4] = 7; // 1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2, 1+3, 3+1

	int T, n;
	cin &amp;gt;&amp;gt; T;

	for (int i = 4; i &amp;lt; 12; ++i)
		dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];

	for (int i = 0; i &amp;lt; T; ++i)
	{
		cin &amp;gt;&amp;gt; n;
		cout &amp;lt;&amp;lt; dp[n] &amp;lt;&amp;lt; endl;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dp를 이용하여 해결할 수 있습니다.bottom-up 방식으로 해결하였습니다.&lt;/li&gt;
&lt;li&gt;dp[i]를 구할때엔 다음과 같이 점화식을 세울 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dp[i - 3]에서 3을 추가&lt;/li&gt;
&lt;li&gt;dp[i - 2]에서 2를 추가&lt;/li&gt;
&lt;li&gt;dp[i - 1]에서 1을 추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위 세개를 모두 더하면 dp[i]가 나옵니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>DP</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/550</guid>
      <comments>https://bonnate.tistory.com/550#entry550comment</comments>
      <pubDate>Mon, 11 Dec 2023 04:49:30 +0900</pubDate>
    </item>
    <item>
      <title>[C++][백준 1463번] 1로 만들기 ⭐</title>
      <link>https://bonnate.tistory.com/549</link>
      <description>&lt;figure id=&quot;og_1702236284822&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;1463번: 1로 만들기&quot; data-og-description=&quot;첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/1463&quot; data-og-url=&quot;https://www.acmicpc.net/problem/1463&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cu1HyZ/hyUIqclapM/uccK66wZLfSYMHF0fKuQt0/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/1463&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/1463&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cu1HyZ/hyUIqclapM/uccK66wZLfSYMHF0fKuQt0/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;1463번: 1로 만들기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정수&amp;nbsp;X에&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;연산은&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;세&amp;nbsp;가지&amp;nbsp;이다. &lt;br /&gt;&lt;br /&gt;X가&amp;nbsp;3으로&amp;nbsp;나누어&amp;nbsp;떨어지면,&amp;nbsp;3으로&amp;nbsp;나눈다. &lt;br /&gt;X가&amp;nbsp;2로&amp;nbsp;나누어&amp;nbsp;떨어지면,&amp;nbsp;2로&amp;nbsp;나눈다. &lt;br /&gt;1을&amp;nbsp;뺀다. &lt;br /&gt;정수&amp;nbsp;N이&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;위와&amp;nbsp;같은&amp;nbsp;연산&amp;nbsp;세&amp;nbsp;개를&amp;nbsp;적절히&amp;nbsp;사용해서&amp;nbsp;1을&amp;nbsp;만들려고&amp;nbsp;한다.&amp;nbsp;연산을&amp;nbsp;사용하는&amp;nbsp;횟수의&amp;nbsp;최솟값을&amp;nbsp;출력하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1702236300449&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;

vector&amp;lt;int&amp;gt; dp(1000001);

int main()
{
	int N;
	cin &amp;gt;&amp;gt; N;

	dp[1] = 0;

	// bottom-up
	for (int i = 2; i &amp;lt;= N; ++i)
	{
		// 1을 더해보기
		dp[i] = dp[i - 1] + 1;

		// 3으로 나누어 떨어진다면, 현재 값과, 3으로 나누고 + 1한 값 중 낮은 값을 사용
		if (i % 3 == 0)
			dp[i] = min(dp[i], dp[i / 3] + 1);

		// 2로 나누어 떨어진다면, 현재 값과, 2로 나누고 + 1한 값 중 낮은 값을 사용
		if (i % 2 == 0)
			dp[i] = min(dp[i], dp[i / 2] + 1);
	}

	cout &amp;lt;&amp;lt; dp[N];
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;bottom-up 방식으로 문제를 해결합니다.&lt;/li&gt;
&lt;li&gt;dp[1]은 0이므로, 2부터 시작하여 차례대로 최소값을 갱신하여 나아갑니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단순히 이전 값에서 1을 더하여 계산합니다.&lt;/li&gt;
&lt;li&gt;만약 3으로 나누어 떨어진다면, 현재 값과 3으로 나누고 1을 더한 값 중 낮은 값을 사용합니다.&lt;/li&gt;
&lt;li&gt;만약 2로 나누어 떨어진다면, 현재 값과 2로 나누고 1을 더한 값 중 낮은 값을 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>DP</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/549</guid>
      <comments>https://bonnate.tistory.com/549#entry549comment</comments>
      <pubDate>Mon, 11 Dec 2023 04:26:28 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 코딩 테스트 연습  </title>
      <link>https://bonnate.tistory.com/548</link>
      <description>&lt;figure id=&quot;og_1702220456341&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/118668&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QgyXr/hyULUJyiCB/6BmOrD2iB4klmGmn25dE4K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bl9WEk/hyUL6QKOpw/IizR1RZPkbwD40gJfY39zk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/118668&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/118668&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QgyXr/hyULUJyiCB/6BmOrD2iB4klmGmn25dE4K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bl9WEk/hyUL6QKOpw/IizR1RZPkbwD40gJfY39zk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;테스트&amp;nbsp;문제를&amp;nbsp;풀기&amp;nbsp;위해서는&amp;nbsp;알고리즘에&amp;nbsp;대한&amp;nbsp;지식과&amp;nbsp;코드를&amp;nbsp;구현하는&amp;nbsp;능력이&amp;nbsp;필요합니다. &lt;br /&gt;&lt;br /&gt;알고리즘에&amp;nbsp;대한&amp;nbsp;지식은&amp;nbsp;알고력,&amp;nbsp;코드를&amp;nbsp;구현하는&amp;nbsp;능력은&amp;nbsp;코딩력이라고&amp;nbsp;표현합니다.&amp;nbsp;알고력과&amp;nbsp;코딩력은&amp;nbsp;0&amp;nbsp;이상의&amp;nbsp;정수로&amp;nbsp;표현됩니다. &lt;br /&gt;&lt;br /&gt;문제를&amp;nbsp;풀기&amp;nbsp;위해서는&amp;nbsp;문제가&amp;nbsp;요구하는&amp;nbsp;일정&amp;nbsp;이상의&amp;nbsp;알고력과&amp;nbsp;코딩력이&amp;nbsp;필요합니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어,&amp;nbsp;당신의&amp;nbsp;현재&amp;nbsp;알고력이&amp;nbsp;15,&amp;nbsp;코딩력이&amp;nbsp;10이라고&amp;nbsp;가정해보겠습니다. &lt;br /&gt;&lt;br /&gt;A라는&amp;nbsp;문제가&amp;nbsp;알고력&amp;nbsp;10,&amp;nbsp;코딩력&amp;nbsp;10을&amp;nbsp;요구한다면&amp;nbsp;A&amp;nbsp;문제를&amp;nbsp;풀&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;B라는&amp;nbsp;문제가&amp;nbsp;알고력&amp;nbsp;10,&amp;nbsp;코딩력&amp;nbsp;20을&amp;nbsp;요구한다면&amp;nbsp;코딩력이&amp;nbsp;부족하기&amp;nbsp;때문에&amp;nbsp;B&amp;nbsp;문제를&amp;nbsp;풀&amp;nbsp;수&amp;nbsp;없습니다. &lt;br /&gt;풀&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;문제를&amp;nbsp;해결하기&amp;nbsp;위해서는&amp;nbsp;알고력과&amp;nbsp;코딩력을&amp;nbsp;높여야&amp;nbsp;합니다.&amp;nbsp;알고력과&amp;nbsp;코딩력을&amp;nbsp;높이기&amp;nbsp;위한&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;방법들이&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;알고력을&amp;nbsp;높이기&amp;nbsp;위해&amp;nbsp;알고리즘&amp;nbsp;공부를&amp;nbsp;합니다.&amp;nbsp;알고력&amp;nbsp;1을&amp;nbsp;높이기&amp;nbsp;위해서&amp;nbsp;1의&amp;nbsp;시간이&amp;nbsp;필요합니다. &lt;br /&gt;코딩력을&amp;nbsp;높이기&amp;nbsp;위해&amp;nbsp;코딩&amp;nbsp;공부를&amp;nbsp;합니다.&amp;nbsp;코딩력&amp;nbsp;1을&amp;nbsp;높이기&amp;nbsp;위해서&amp;nbsp;1의&amp;nbsp;시간이&amp;nbsp;필요합니다. &lt;br /&gt;현재&amp;nbsp;풀&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;문제&amp;nbsp;중&amp;nbsp;하나를&amp;nbsp;풀어&amp;nbsp;알고력과&amp;nbsp;코딩력을&amp;nbsp;높입니다.&amp;nbsp;각&amp;nbsp;문제마다&amp;nbsp;문제를&amp;nbsp;풀면&amp;nbsp;올라가는&amp;nbsp;알고력과&amp;nbsp;코딩력이&amp;nbsp;정해져&amp;nbsp;있습니다. &lt;br /&gt;문제를&amp;nbsp;하나&amp;nbsp;푸는&amp;nbsp;데는&amp;nbsp;문제가&amp;nbsp;요구하는&amp;nbsp;시간이&amp;nbsp;필요하며&amp;nbsp;같은&amp;nbsp;문제를&amp;nbsp;여러&amp;nbsp;번&amp;nbsp;푸는&amp;nbsp;것이&amp;nbsp;가능합니다. &lt;br /&gt;당신은&amp;nbsp;주어진&amp;nbsp;모든&amp;nbsp;문제들을&amp;nbsp;풀&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;알고력과&amp;nbsp;코딩력을&amp;nbsp;얻는&amp;nbsp;최단시간을&amp;nbsp;구하려&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;초기의&amp;nbsp;알고력과&amp;nbsp;코딩력을&amp;nbsp;담은&amp;nbsp;정수&amp;nbsp;alp와&amp;nbsp;cop,&amp;nbsp;문제의&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;2차원&amp;nbsp;정수&amp;nbsp;배열&amp;nbsp;problems가&amp;nbsp;매개변수로&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;모든&amp;nbsp;문제들을&amp;nbsp;풀&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;알고력과&amp;nbsp;코딩력을&amp;nbsp;얻는&amp;nbsp;최단시간을&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;작성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1702220218777&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#define MAX_VALUE 1000000

using namespace std;

int solution(int alp, int cop, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; problems) {
    
    // dp의 인덱스 번호는 현재 알고력과 코딩력의 누적 cost
    vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; dp(152, vector&amp;lt;int&amp;gt;(152, MAX_VALUE));
    
    // 요구하는 코딩력과 알고력을 구하기
    int maxAlp = alp, maxCop = cop;
    for(vector&amp;lt;int&amp;gt;&amp;amp; problem : problems)
    {
        maxAlp = max(maxAlp, problem[0]);
        maxCop = max(maxCop, problem[1]);
    }
    
    // 만약 alp와 cop가 요구하는 값 이상이라면 0 리턴
    if(alp &amp;gt;= maxAlp &amp;amp;&amp;amp; cop &amp;gt;= maxCop)
        return 0;
    
    dp[alp][cop] = 0; // 시작 부분은 0
    for(int i = alp; i &amp;lt;= maxAlp; ++i)
    {
        for(int j = cop; j &amp;lt;= maxCop; ++j)
        {
            dp[i + 1][j] = min(dp[i + 1][j], dp[i][j] + 1); // 알고리즘 공부
            dp[i][j + 1] = min(dp[i][j + 1], dp[i][j] + 1); // 코딩 공부
            
            // 모든 문제를 검사
            for(vector&amp;lt;int&amp;gt;&amp;amp; problem : problems)
            {
                // 문제를 풀기위한 최소 알고력, 코딩력이 있다면?
                if(i &amp;gt;= problem[0] &amp;amp;&amp;amp; j &amp;gt;= problem[1])
                {
                    // 기존 점수와 문제에서 얻은 점수의 합이 maxAlp, maxCop을 넘지 못하게 방지
                    // maxAlp + 1, 2..도 어차피 같은 경우로, [maxAlp][maxCop]에 값을 쓰고, 인덱스 번호를 추가로 사용하지 않도록 최적화
                    int alpIdx = min(maxAlp, problem[2] + i);
                    int copIdx = min(maxCop, problem[3] + j);
                    
                    // 문제를 풀었을 때, cost를 비교하여 낮은 값으로 갱신
                    dp[alpIdx][copIdx] = min(dp[alpIdx][copIdx], dp[i][j] + problem[4]);
                }
            }
        }
    }
    
    // 정답 리턴
    return dp[maxAlp][maxCop];
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dp bottom-up 방식으로 문제를 해결합니다.&lt;/li&gt;
&lt;li&gt;dp의 인덱스 번호를 현재 alp, cop의 누적 cost로 사용합니다. dp의 크기는 152, 152를 초과하지 않습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그 이유는, 0 &amp;le; alp,cop &amp;le; 150 조건으로, alp, cop가 150을 초과하지 않게 clamp를 해줄 수 있기 때문입니다.&lt;/li&gt;
&lt;li&gt;alp + n을 alp로 간주하여 문제를 해결할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3중 for문을 이용하여 접근합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;i와 j는 각각 alp, cop에서 시작하여 maxAlp, maxCop까지 반복합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;아래의 세가지 검사를 통해 dp를 갱신합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알고리즘 공부를 통해 cost를 1추가하여 alp를 1 증가시킵니다.&lt;/li&gt;
&lt;li&gt;코딩 공부를 통해 cost를 1추가하여 cop를 1 증가시킵니다.&lt;/li&gt;
&lt;li&gt;모든 problems를 검사하여 cost를 추가하여 alp와 cop를 증가시킵니다. 단, 현재 alp와 cop인 i, j가 이상이어야합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모든 반복을 마치면, 정답을 리턴합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>DP</category>
      <category>level3</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/548</guid>
      <comments>https://bonnate.tistory.com/548#entry548comment</comments>
      <pubDate>Mon, 11 Dec 2023 00:02:42 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 등산코스 정하기</title>
      <link>https://bonnate.tistory.com/547</link>
      <description>&lt;figure id=&quot;og_1702205476632&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/118669&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bTZLgS/hyUL0pqdv4/OtPL4ENneUFUkKclcWSJS1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cGYTGy/hyUL1u57OU/oV41ACOG0CDlSm4k0TZ900/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/118669&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/118669&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bTZLgS/hyUL0pqdv4/OtPL4ENneUFUkKclcWSJS1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cGYTGy/hyUL1u57OU/oV41ACOG0CDlSm4k0TZ900/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XX산은&amp;nbsp;n개의&amp;nbsp;지점으로&amp;nbsp;이루어져&amp;nbsp;있습니다.&amp;nbsp;각&amp;nbsp;지점은&amp;nbsp;1부터&amp;nbsp;n까지&amp;nbsp;번호가&amp;nbsp;붙어있으며,&amp;nbsp;출입구,&amp;nbsp;쉼터,&amp;nbsp;혹은&amp;nbsp;산봉우리입니다.&amp;nbsp;각&amp;nbsp;지점은&amp;nbsp;양방향&amp;nbsp;통행이&amp;nbsp;가능한&amp;nbsp;등산로로&amp;nbsp;연결되어&amp;nbsp;있으며,&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;지점을&amp;nbsp;이동할&amp;nbsp;때&amp;nbsp;이&amp;nbsp;등산로를&amp;nbsp;이용해야&amp;nbsp;합니다.&amp;nbsp;이때,&amp;nbsp;등산로별로&amp;nbsp;이동하는데&amp;nbsp;일정&amp;nbsp;시간이&amp;nbsp;소요됩니다.&lt;br /&gt;&lt;br /&gt;등산코스는&amp;nbsp;방문할&amp;nbsp;지점&amp;nbsp;번호들을&amp;nbsp;순서대로&amp;nbsp;나열하여&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;1-2-3-2-1&amp;nbsp;으로&amp;nbsp;표현하는&amp;nbsp;등산코스는&amp;nbsp;1번지점에서&amp;nbsp;출발하여&amp;nbsp;2번,&amp;nbsp;3번,&amp;nbsp;2번,&amp;nbsp;1번&amp;nbsp;지점을&amp;nbsp;순서대로&amp;nbsp;방문한다는&amp;nbsp;뜻입니다.&lt;br /&gt;등산코스를&amp;nbsp;따라&amp;nbsp;이동하는&amp;nbsp;중&amp;nbsp;쉼터&amp;nbsp;혹은&amp;nbsp;산봉우리를&amp;nbsp;방문할&amp;nbsp;때마다&amp;nbsp;휴식을&amp;nbsp;취할&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;휴식&amp;nbsp;없이&amp;nbsp;이동해야&amp;nbsp;하는&amp;nbsp;시간&amp;nbsp;중&amp;nbsp;가장&amp;nbsp;긴&amp;nbsp;시간을&amp;nbsp;해당&amp;nbsp;등산코스의&amp;nbsp;intensity라고&amp;nbsp;부르기로&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;당신은&amp;nbsp;XX산의&amp;nbsp;출입구&amp;nbsp;중&amp;nbsp;한&amp;nbsp;곳에서&amp;nbsp;출발하여&amp;nbsp;산봉우리&amp;nbsp;중&amp;nbsp;한&amp;nbsp;곳만&amp;nbsp;방문한&amp;nbsp;뒤&amp;nbsp;다시&amp;nbsp;원래의&amp;nbsp;출입구로&amp;nbsp;돌아오는&amp;nbsp;등산코스를&amp;nbsp;정하려고&amp;nbsp;합니다.&amp;nbsp;다시&amp;nbsp;말해,&amp;nbsp;등산코스에서&amp;nbsp;출입구는&amp;nbsp;처음과&amp;nbsp;끝에&amp;nbsp;한&amp;nbsp;번씩,&amp;nbsp;산봉우리는&amp;nbsp;한&amp;nbsp;번만&amp;nbsp;포함되어야&amp;nbsp;합니다.&lt;br /&gt;당신은&amp;nbsp;이러한&amp;nbsp;규칙을&amp;nbsp;지키면서&amp;nbsp;intensity가&amp;nbsp;최소가&amp;nbsp;되도록&amp;nbsp;등산코스를&amp;nbsp;정하려고&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;다음은&amp;nbsp;XX산의&amp;nbsp;지점과&amp;nbsp;등산로를&amp;nbsp;그림으로&amp;nbsp;표현한&amp;nbsp;예시입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KwNVs/btsBFGSAWEL/81Pk5jLI7fn4FPSr114QGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KwNVs/btsBFGSAWEL/81Pk5jLI7fn4FPSr114QGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KwNVs/btsBFGSAWEL/81Pk5jLI7fn4FPSr114QGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKwNVs%2FbtsBFGSAWEL%2F81Pk5jLI7fn4FPSr114QGK%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;451&quot; height=&quot;547&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위&amp;nbsp;그림에서&amp;nbsp;원에&amp;nbsp;적힌&amp;nbsp;숫자는&amp;nbsp;지점의&amp;nbsp;번호를&amp;nbsp;나타내며,&amp;nbsp;1,&amp;nbsp;3번&amp;nbsp;지점에&amp;nbsp;출입구,&amp;nbsp;5번&amp;nbsp;지점에&amp;nbsp;산봉우리가&amp;nbsp;있습니다.&amp;nbsp;각&amp;nbsp;선분은&amp;nbsp;등산로를&amp;nbsp;나타내며,&amp;nbsp;각&amp;nbsp;선분에&amp;nbsp;적힌&amp;nbsp;수는&amp;nbsp;이동&amp;nbsp;시간을&amp;nbsp;나타냅니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;1번&amp;nbsp;지점에서&amp;nbsp;2번&amp;nbsp;지점으로&amp;nbsp;이동할&amp;nbsp;때는&amp;nbsp;3시간이&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;위의&amp;nbsp;예시에서&amp;nbsp;1-2-5-4-3&amp;nbsp;과&amp;nbsp;같은&amp;nbsp;등산코스는&amp;nbsp;처음&amp;nbsp;출발한&amp;nbsp;원래의&amp;nbsp;출입구로&amp;nbsp;돌아오지&amp;nbsp;않기&amp;nbsp;때문에&amp;nbsp;잘못된&amp;nbsp;등산코스입니다.&amp;nbsp;또한&amp;nbsp;1-2-5-6-4-3-2-1&amp;nbsp;과&amp;nbsp;같은&amp;nbsp;등산코스는&amp;nbsp;코스의&amp;nbsp;처음과&amp;nbsp;끝&amp;nbsp;외에&amp;nbsp;3번&amp;nbsp;출입구를&amp;nbsp;방문하기&amp;nbsp;때문에&amp;nbsp;잘못된&amp;nbsp;등산코스입니다.&lt;br /&gt;&lt;br /&gt;등산코스를&amp;nbsp;3-2-5-4-3&amp;nbsp;과&amp;nbsp;같이&amp;nbsp;정했을&amp;nbsp;때의&amp;nbsp;이동경로를&amp;nbsp;그림으로&amp;nbsp;나타내면&amp;nbsp;아래와&amp;nbsp;같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR3g3m/btsBGo47JnG/O8bicg9K6JW1RF8qD77LLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR3g3m/btsBGo47JnG/O8bicg9K6JW1RF8qD77LLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR3g3m/btsBGo47JnG/O8bicg9K6JW1RF8qD77LLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR3g3m%2FbtsBGo47JnG%2FO8bicg9K6JW1RF8qD77LLk%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;1082&quot; height=&quot;109&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이때,&amp;nbsp;휴식&amp;nbsp;없이&amp;nbsp;이동해야&amp;nbsp;하는&amp;nbsp;시간&amp;nbsp;중&amp;nbsp;가장&amp;nbsp;긴&amp;nbsp;시간은&amp;nbsp;5시간입니다.&amp;nbsp;따라서&amp;nbsp;이&amp;nbsp;등산코스의&amp;nbsp;intensity는&amp;nbsp;5입니다.&lt;br /&gt;&lt;br /&gt;등산코스를&amp;nbsp;1-2-4-5-6-4-2-1&amp;nbsp;과&amp;nbsp;같이&amp;nbsp;정했을&amp;nbsp;때의&amp;nbsp;이동경로를&amp;nbsp;그림으로&amp;nbsp;나타내면&amp;nbsp;아래와&amp;nbsp;같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yioJB/btsBGXzg3NB/GrIJ0C5Sw0YxSkb25mm7O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yioJB/btsBGXzg3NB/GrIJ0C5Sw0YxSkb25mm7O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yioJB/btsBGXzg3NB/GrIJ0C5Sw0YxSkb25mm7O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyioJB%2FbtsBGXzg3NB%2FGrIJ0C5Sw0YxSkb25mm7O1%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;1235&quot; height=&quot;113&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이때,&amp;nbsp;휴식&amp;nbsp;없이&amp;nbsp;이동해야&amp;nbsp;하는&amp;nbsp;시간&amp;nbsp;중&amp;nbsp;가장&amp;nbsp;긴&amp;nbsp;시간은&amp;nbsp;3시간입니다.&amp;nbsp;따라서&amp;nbsp;이&amp;nbsp;등산코스의&amp;nbsp;intensity는&amp;nbsp;3이며,&amp;nbsp;이&amp;nbsp;보다&amp;nbsp;intensity가&amp;nbsp;낮은&amp;nbsp;등산코스는&amp;nbsp;없습니다.&lt;br /&gt;&lt;br /&gt;XX산의&amp;nbsp;지점&amp;nbsp;수&amp;nbsp;n,&amp;nbsp;각&amp;nbsp;등산로의&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;2차원&amp;nbsp;정수&amp;nbsp;배열&amp;nbsp;paths,&amp;nbsp;출입구들의&amp;nbsp;번호가&amp;nbsp;담긴&amp;nbsp;정수&amp;nbsp;배열&amp;nbsp;gates,&amp;nbsp;산봉우리들의&amp;nbsp;번호가&amp;nbsp;담긴&amp;nbsp;정수&amp;nbsp;배열&amp;nbsp;summits가&amp;nbsp;매개변수로&amp;nbsp;주어집니다.&amp;nbsp;이때,&amp;nbsp;intensity가&amp;nbsp;최소가&amp;nbsp;되는&amp;nbsp;등산코스에&amp;nbsp;포함된&amp;nbsp;산봉우리&amp;nbsp;번호와&amp;nbsp;intensity의&amp;nbsp;최솟값을&amp;nbsp;차례대로&amp;nbsp;정수&amp;nbsp;배열에&amp;nbsp;담아&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해주세요.&amp;nbsp;intensity가&amp;nbsp;최소가&amp;nbsp;되는&amp;nbsp;등산코스가&amp;nbsp;여러&amp;nbsp;개라면&amp;nbsp;그중&amp;nbsp;산봉우리의&amp;nbsp;번호가&amp;nbsp;가장&amp;nbsp;낮은&amp;nbsp;등산코스를&amp;nbsp;선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1702204704919&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;
#include &amp;lt;climits&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

// 간선 정보
struct Edge {
    int to, weight;
};

vector&amp;lt;int&amp;gt; solution(int n, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; paths, vector&amp;lt;int&amp;gt; gates, vector&amp;lt;int&amp;gt; summits) {
    
    vector&amp;lt;vector&amp;lt;Edge&amp;gt;&amp;gt; graph(n + 1);
    
    // 정답을 구하기 위해 정렬
    sort(summits.begin(), summits.end());

    // 그래프 정보 초기화 (양방향)
    for (vector&amp;lt;int&amp;gt; r : paths) {
        int from = r[0];
        int to = r[1];
        int weight = r[2];
        graph[from].push_back({to, weight});
        graph[to].push_back({from, weight});
    }

    // summits의 ID를 빠르게 검색하기위한 set
    unordered_set&amp;lt;int&amp;gt; summitIds;
    for(int i = 0; i &amp;lt; summits.size(); ++i)
        summitIds.insert(summits[i]);
    
    // gates ID를 빠르게 검색하기위한 set
    unordered_set&amp;lt;int&amp;gt; gateIds;
    for(int i = 0; i &amp;lt; gates.size(); ++i)
        gateIds.insert(gates[i]);    
    
    vector&amp;lt;int&amp;gt; dp(summits.size(), INT_MAX);
    for(int i = 0; i &amp;lt; gates.size(); ++i)
    {    
        vector&amp;lt;int&amp;gt; dist(n + 1, INT_MAX);
        vector&amp;lt;int&amp;gt; maxValue(n + 1, INT_MAX);  

        // 우선순위 큐를 이용한 다익스트라 알고리즘
        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; pq;            

        dist[gates[i]] = 0; // 시작 노드의 거리는 0
        maxValue[gates[i]] = 0;
        pq.push({0, gates[i]}); // {거리, 노드} 쌍을 우선순위 큐에 삽입

        while (!pq.empty()) {
            int current_distance = pq.top().first;
            int current_node = pq.top().second;
            pq.pop();
            
            // 현재 노드에서 갈 수 있는 모든 노드들에 대해 최단 거리 갱신
            for (Edge&amp;amp; e : graph[current_node]) {
                int next_node = e.to;
                int weight = e.weight;

                // gate로의 이동은 금지
                if(gateIds.find(next_node) != gateIds.end())
                    continue;
                    
                // 가중치가 낮다면, 갱신
                if (dist[next_node] &amp;gt; weight) {
                    dist[next_node] = weight; // 해당 노드의 weight를 기록
                    maxValue[next_node] = max(maxValue[current_node], dist[next_node]); // 해당 노드까지의 최대 피로도를 계산
                    pq.push({dist[next_node], next_node});
                }
            }
            
            // 만약, 산봉우리에 도착하였다면 더 이상 계산할 필요가 없기에 while문 리턴
            if(summitIds.find(current_node) != summitIds.end())
                break;
        }  
        
        // 정답을 구할 dp에 모든 값을 최소값으로 갱신
        for(int j = 0; j &amp;lt; summits.size(); ++j)
            dp[j] = min(dp[j], maxValue[summits[j]]);
    }
    
    // 역방향으로 검사하여 최소값을 정답에 저장(정렬 필요)
    vector&amp;lt;int&amp;gt; answer{INT_MAX, INT_MAX};
    for(int i = summits.size() - 1; i &amp;gt;= 0; --i)
        if(answer[1] &amp;gt;= dp[i])
            answer = {summits[i], dp[i]};
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다익스트라 알고리즘을 활용하여 문제를 해결합니다.&lt;/li&gt;
&lt;li&gt;우선순위 큐를 통해 노드 탐색 시 가중치가 작은 순서대로 탐색합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 방법을 통해 현재 gates에서 시작하여 가장 가중치가 작은(intensity가 최소) 산봉우리 중 하나로 이동합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 gates로부터 가장 가까운 산봉우리로 검색을 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m1TvU/btsBJbw1BX2/EzrxGD7qHKl8bVzqyIsihK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m1TvU/btsBJbw1BX2/EzrxGD7qHKl8bVzqyIsihK/img.png&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;1246&quot; data-is-animation=&quot;false&quot; style=&quot;width: 49.3308%; margin-right: 10px;&quot; data-widthpercent=&quot;49.91&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m1TvU/btsBJbw1BX2/EzrxGD7qHKl8bVzqyIsihK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm1TvU%2FbtsBJbw1BX2%2FEzrxGD7qHKl8bVzqyIsihK%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;1026&quot; height=&quot;1246&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXp7i/btsBKfMQ522/80X44ghJuu4XPdInuYLti1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXp7i/btsBKfMQ522/80X44ghJuu4XPdInuYLti1/img.png&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;1244&quot; style=&quot;width: 49.5064%;&quot; data-widthpercent=&quot;50.09&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXp7i/btsBKfMQ522/80X44ghJuu4XPdInuYLti1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXp7i%2FbtsBKfMQ522%2F80X44ghJuu4XPdInuYLti1%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;1028&quot; height=&quot;1244&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;gates가 1, 3일때 intensity가 낮은 이동 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gates가 1, 3일때 산봉우리로 이동할 때 각각 intensity는 3, 4로 이동할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이러한 방법을 통해 gates는 1, intensity는 3으로 {1, 3}을 리턴하여야합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제를 안정적으로 해결하기 위해 아래의 조건을 만족시켜야합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gate로부터 산봉우리까지의 경로는 편도로만 검색한 후, 왕복은 편도의 경로를 그대로 이용한다고 가정합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 방법은 우선순위큐를 통해 가중치를 계산하여 해당 경로까지 검색하기때문에 돌아오는 경로를 굳이 계산할 필요가 없습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시작 gate를 제외하고 다른 gate로의 이동을 해서는 안됩니다. 이 이유는 특정 gate로 이동하여 굳이 계산을 할 필요가 없기 때문입니다.&lt;/li&gt;
&lt;li&gt;특정 산봉우리에 도착하였다면, 해당 경로를 마지막으로 더 이상 계산할 필요가 없습니다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래의 그림과 같이 7 -&amp;gt; 6 - &amp;gt;5로 이동하였다면, 추가 계산을 할 필요가 없이 즉시 break합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3XZj7/btsBFneBhWH/EUTAERyoftpyBbXzh2HZo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3XZj7/btsBFneBhWH/EUTAERyoftpyBbXzh2HZo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3XZj7/btsBFneBhWH/EUTAERyoftpyBbXzh2HZo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3XZj7%2FbtsBFneBhWH%2FEUTAERyoftpyBbXzh2HZo1%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;1220&quot; height=&quot;932&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;932&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 gate를 시작점으로 하여 intensity를 갱신하여 정답을 구해야합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithms (C++)</category>
      <category>level3</category>
      <category>다익스트라</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/547</guid>
      <comments>https://bonnate.tistory.com/547#entry547comment</comments>
      <pubDate>Sun, 10 Dec 2023 19:48:57 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 카운트 다운  </title>
      <link>https://bonnate.tistory.com/546</link>
      <description>&lt;figure id=&quot;og_1702205532638&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131129&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dmUVxU/hyUIB5SpLH/qa41WFhXS3gYelCvLD66Uk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dULZz7/hyULVhmeMi/kx60y6DfCJu4I50NvkUMz1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131129&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131129&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dmUVxU/hyUIB5SpLH/qa41WFhXS3gYelCvLD66Uk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dULZz7/hyULVhmeMi/kx60y6DfCJu4I50NvkUMz1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;대회를&amp;nbsp;개최합니다.&amp;nbsp;이번&amp;nbsp;대회의&amp;nbsp;룰은&amp;nbsp;&quot;카운트&amp;nbsp;다운&quot;으로&amp;nbsp;&quot;제로원&quot;&amp;nbsp;룰의&amp;nbsp;변형&amp;nbsp;룰입니다.&lt;br /&gt;&quot;카운트&amp;nbsp;다운&quot;은&amp;nbsp;게임이&amp;nbsp;시작되면&amp;nbsp;무작위로&amp;nbsp;점수가&amp;nbsp;정해지고,&amp;nbsp;다트를&amp;nbsp;던지면서&amp;nbsp;점수를&amp;nbsp;깎아서&amp;nbsp;정확히&amp;nbsp;0점으로&amp;nbsp;만드는&amp;nbsp;게임입니다.&amp;nbsp;단,&amp;nbsp;남은&amp;nbsp;점수보다&amp;nbsp;큰&amp;nbsp;점수로&amp;nbsp;득점하면&amp;nbsp;버스트가&amp;nbsp;되며&amp;nbsp;실격&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;다음&amp;nbsp;그림은&amp;nbsp;다트&amp;nbsp;과녁입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGHWcv/btsBGw2Ze1T/I8XWKxjmKxEIvNhUcj0x00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGHWcv/btsBGw2Ze1T/I8XWKxjmKxEIvNhUcj0x00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGHWcv/btsBGw2Ze1T/I8XWKxjmKxEIvNhUcj0x00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGHWcv%2FbtsBGw2Ze1T%2FI8XWKxjmKxEIvNhUcj0x00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;1040&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다트&amp;nbsp;과녁에는&amp;nbsp;1&amp;nbsp;부터&amp;nbsp;20&amp;nbsp;까지의&amp;nbsp;수가&amp;nbsp;하나씩&amp;nbsp;있고&amp;nbsp;각&amp;nbsp;수마다&amp;nbsp;&quot;싱글&quot;,&amp;nbsp;&quot;더블&quot;,&amp;nbsp;&quot;트리플&quot;&amp;nbsp;칸이&amp;nbsp;있습니다.&amp;nbsp;&quot;싱글&quot;을&amp;nbsp;맞히면&amp;nbsp;해당&amp;nbsp;수만큼&amp;nbsp;점수를&amp;nbsp;얻고&amp;nbsp;&quot;더블&quot;을&amp;nbsp;맞히면&amp;nbsp;해당&amp;nbsp;수의&amp;nbsp;두&amp;nbsp;배만큼&amp;nbsp;점수를&amp;nbsp;얻고&amp;nbsp;&quot;트리플&quot;을&amp;nbsp;맞히면&amp;nbsp;해당&amp;nbsp;수의&amp;nbsp;세&amp;nbsp;배만큼&amp;nbsp;점수를&amp;nbsp;얻습니다.&amp;nbsp;가운데에는&amp;nbsp;&quot;불&quot;과&amp;nbsp;&quot;아우터&amp;nbsp;불&quot;이&amp;nbsp;있는데&amp;nbsp;&quot;카운트&amp;nbsp;다운&quot;&amp;nbsp;게임에서는&amp;nbsp;구분&amp;nbsp;없이&amp;nbsp;50점을&amp;nbsp;얻습니다.&lt;br /&gt;&lt;br /&gt;대회는&amp;nbsp;토너먼트로&amp;nbsp;진행되며&amp;nbsp;한&amp;nbsp;게임에는&amp;nbsp;두&amp;nbsp;선수가&amp;nbsp;참가하게&amp;nbsp;됩니다.&amp;nbsp;게임은&amp;nbsp;두&amp;nbsp;선수가&amp;nbsp;교대로&amp;nbsp;한&amp;nbsp;번씩&amp;nbsp;던지는&amp;nbsp;라운드&amp;nbsp;방식으로&amp;nbsp;진행됩니다.&amp;nbsp;가장&amp;nbsp;먼저&amp;nbsp;0점을&amp;nbsp;만든&amp;nbsp;선수가&amp;nbsp;승리하는데&amp;nbsp;만약&amp;nbsp;두&amp;nbsp;선수가&amp;nbsp;같은&amp;nbsp;라운드에&amp;nbsp;0점을&amp;nbsp;만들면&amp;nbsp;두&amp;nbsp;선수&amp;nbsp;중&amp;nbsp;&quot;싱글&quot;&amp;nbsp;또는&amp;nbsp;&quot;불&quot;을&amp;nbsp;더&amp;nbsp;많이&amp;nbsp;던진&amp;nbsp;선수가&amp;nbsp;승리하며&amp;nbsp;그마저도&amp;nbsp;같다면&amp;nbsp;선공인&amp;nbsp;선수가&amp;nbsp;승리합니다.&lt;br /&gt;&lt;br /&gt;다트&amp;nbsp;실력에&amp;nbsp;자신&amp;nbsp;있던&amp;nbsp;종호는&amp;nbsp;이&amp;nbsp;대회에&amp;nbsp;출전하기로&amp;nbsp;하였습니다.&amp;nbsp;최소한의&amp;nbsp;다트로&amp;nbsp;0점을&amp;nbsp;만드는&amp;nbsp;게&amp;nbsp;가장&amp;nbsp;중요하고,&amp;nbsp;그러한&amp;nbsp;방법이&amp;nbsp;여러가지가&amp;nbsp;있다면&amp;nbsp;&quot;싱글&quot;&amp;nbsp;또는&amp;nbsp;&quot;불&quot;을&amp;nbsp;최대한&amp;nbsp;많이&amp;nbsp;던지는&amp;nbsp;방법을&amp;nbsp;선택해야&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;목표&amp;nbsp;점수&amp;nbsp;target이&amp;nbsp;매개변수로&amp;nbsp;주어졌을&amp;nbsp;때&amp;nbsp;최선의&amp;nbsp;경우&amp;nbsp;던질&amp;nbsp;다트&amp;nbsp;수와&amp;nbsp;그&amp;nbsp;때의&amp;nbsp;&quot;싱글&quot;&amp;nbsp;또는&amp;nbsp;&quot;불&quot;을&amp;nbsp;맞춘&amp;nbsp;횟수(합)를&amp;nbsp;순서대로&amp;nbsp;배열에&amp;nbsp;담아&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해&amp;nbsp;주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1702196611920&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

int dp[100001][2];

void check(int target) {
    // target - 60의 누적 개수와 target - 50의 누적 개수가 같다면?
    if (dp[target - 60][0] == dp[target - 50][0]) 
    {
        dp[target][0] = dp[target - 50][0] + 1; // 누적 개수 1 증가
        dp[target][1] = max(dp[target - 60][1], dp[target - 50][1] + 1); // max(target - 60의 값, target - 50의 값 + 1(불 사용))
    }
    // target - 60이 더 효율적이라면?
    else if (dp[target - 60][0] &amp;lt; dp[target - 50][0]) 
    {
        dp[target][0] = dp[target - 60][0] + 1;
        dp[target][1] = dp[target - 60][1];
    }
    else 
    {
        dp[target][0] = dp[target - 50][0] + 1;
        dp[target][1] = dp[target - 50][1] + 1;
    }
}

vector&amp;lt;int&amp;gt; solution(int target) {
    vector&amp;lt;int&amp;gt; answer(2, 0);

    for (int i = 1; i &amp;lt;= target; i++) {
        /* 한 번에 끝내기 */
        // 싱글(20이하) 또는 불(50)로 끝내는 경우
        if (i == 50 || i &amp;lt;= 20) 
        {
            dp[i][0] = 1;
            dp[i][1] = 1; // 값 증가
        }
        // 60 이하의 3의 배수인 경우는 트리플로 가능
        else if (i &amp;lt;= 60 &amp;amp;&amp;amp; i % 3 == 0) 
        {
            dp[i][0] = 1;
            dp[i][1] = 0; // 싱글,불이 아님
        }
        // 40 이하의 2의 배수인 경우에는 더블로 가능
        else if (i &amp;lt;= 40 &amp;amp;&amp;amp; i % 2 == 0) 
        {
            dp[i][0] = 1;
            dp[i][1] = 0; // 싱글, 불이 아님
        }
        /* 블+싱글 조합으로 두 번에 끝내기 */
        // 50보다 크고 70 이하라면 2번(불 + 싱글)로 가능
        else if (i &amp;gt; 50 &amp;amp;&amp;amp; i &amp;lt;= 70) 
        {
            dp[i][0] = 2;
            dp[i][1] = 2; // 불 + 싱글의 조합으로 2 증가
        }
        /* 나머지 두 번에 끝내기 */
        // 70보다 작은 수인경우, 아래의 두 조건으로 나눌 수 있음
        else if (i &amp;lt; 70) 
        {
            // 40 보다 작은 수라면, 싱글 2개로 조합 가능
            if (i &amp;lt; 40) 
            {
                dp[i][0] = 2;
                dp[i][1] = 2; // 싱글 2개
            }
            // 아니라면, 싱글 + 더블 조합으로 가능
            else 
            {
                dp[i][0] = 2;
                dp[i][1] = 1; // 싱글 1개
            }
        }
        // 71부터는 저장된 값을 고려하여 최선의 선택을 구하기
        else 
        {
            check(i);
        }
    }

    answer[0] = dp[target][0];
    answer[1] = dp[target][1];

    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;싱글 또는 불을 최대한 많이 맞추면서, 맞추는 개수는 최소로 하여 정답을 구해야합니다.&lt;/li&gt;
&lt;li&gt;이 문제는 dp를 활용하여 해결하였으며, 다음과 같은 규칙으로 접근할 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dp를 [100001][2]로 선언하여 누적된&amp;nbsp; 싱글 또는 불 / 다트의 개수를 저장합니다.&lt;/li&gt;
&lt;li&gt;target이 50이거나, 20이하인경우에는 싱글 또는 불로 한번에 해결할 수 있습니다. 이 경우 dp에 누적 다트와 싱글/불 개수를 1로 설정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;target이 60 이하일 때, 3의 배수라면 1~20 값의 트리플로 해결할 수 있습니다. 이 경우 dp에 누적 다트는 1로, 싱글/불 개수는 0으로 합니다.&lt;/li&gt;
&lt;li&gt;target이 40 이하일 때, 2의 배수라면 1~20 값의 더블로 해결할 수 있습니다.&lt;/li&gt;
&lt;li&gt;50보다 크고, 70 이하라면, 불 + 싱글의 조합 (50 + x)으로 해결할 수 있습니다. 이 경우에는&amp;nbsp; 2, 2로 저장합니다.&lt;/li&gt;
&lt;li&gt;위 조건이 모두 아닐경우 70보다 작다면, 두가지의 경우를 고려할 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;40보다 작다면, 두개의 싱글로 조합이 가능합니다.&lt;/li&gt;
&lt;li&gt;그렇지 않다면, 싱글 + 더블의 조합으로 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위 모든 조건이 아니라면, 최선의 선택을 위해 함수를 통해 조건을 통해 값을 구합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;60, 50을 사용하여 큰 값을 줄일 수 있습니다. 이 때, target-60의 횟수와 target-50의 누적 횟수가 같다면, 둘 중 불의 사용이 큰 개수를 [1]에 저장합니다.&lt;/li&gt;
&lt;li&gt;target-60이 더 효율적이라면, 불을 사용하지 않고 누적 다트 수인 [0]에 저장합니다.&lt;/li&gt;
&lt;li&gt;target-50이 더 효율적이라면, 불을 사용하여 누적 다트 수와 불 사용 수에 저장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>DP</category>
      <category>level3</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/546</guid>
      <comments>https://bonnate.tistory.com/546#entry546comment</comments>
      <pubDate>Sun, 10 Dec 2023 17:35:38 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 고고학 최고의 발견  </title>
      <link>https://bonnate.tistory.com/544</link>
      <description>&lt;figure id=&quot;og_1700994813224&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131702&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ckdA1a/hyUE97KWEm/TXZRhdvfvOZ2CkCKXLv8R0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b05ToP/hyUB8CGS4j/wDDUPTfS8JzTeU4ZQmouok/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131702&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131702&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ckdA1a/hyUE97KWEm/TXZRhdvfvOZ2CkCKXLv8R0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b05ToP/hyUB8CGS4j/wDDUPTfS8JzTeU4ZQmouok/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;연구는&amp;nbsp;주류&amp;nbsp;학자들로부터&amp;nbsp;인정받지&amp;nbsp;못했었지만,&amp;nbsp;혜선이는&amp;nbsp;포기하지&amp;nbsp;않고&amp;nbsp;조사를&amp;nbsp;계속했고&amp;nbsp;마침내&amp;nbsp;성궤의&amp;nbsp;행방을&amp;nbsp;알아내었습니다.&lt;br /&gt;&lt;br /&gt;그러나&amp;nbsp;오래전&amp;nbsp;누군가로부터&amp;nbsp;봉인된&amp;nbsp;성궤는&amp;nbsp;특별한&amp;nbsp;잠금장치에&amp;nbsp;의해&amp;nbsp;보호되고&amp;nbsp;있었습니다.&amp;nbsp;잠금장치는&amp;nbsp;일종의&amp;nbsp;퍼즐과&amp;nbsp;연결되어&amp;nbsp;퍼즐을&amp;nbsp;해결하면&amp;nbsp;열리는&amp;nbsp;것으로&amp;nbsp;보입니다.&lt;br /&gt;&lt;br /&gt;퍼즐은&amp;nbsp;시계들이&amp;nbsp;행렬을&amp;nbsp;이루는&amp;nbsp;구조물인데&amp;nbsp;하나의&amp;nbsp;시계에&amp;nbsp;시곗바늘은&amp;nbsp;하나씩만&amp;nbsp;있습니다.&amp;nbsp;각&amp;nbsp;시곗바늘은&amp;nbsp;시계방향으로만&amp;nbsp;돌릴&amp;nbsp;수&amp;nbsp;있고&amp;nbsp;한&amp;nbsp;번의&amp;nbsp;조작으로&amp;nbsp;90도씩&amp;nbsp;돌릴&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;시계들은&amp;nbsp;기계장치에&amp;nbsp;의해&amp;nbsp;연결되어&amp;nbsp;있어&amp;nbsp;어떤&amp;nbsp;시계의&amp;nbsp;시곗바늘을&amp;nbsp;돌리면&amp;nbsp;그&amp;nbsp;시계의&amp;nbsp;상하좌우로&amp;nbsp;인접한&amp;nbsp;시계들의&amp;nbsp;시곗바늘도&amp;nbsp;함께&amp;nbsp;돌아갑니다.&amp;nbsp;행렬의&amp;nbsp;모서리에&amp;nbsp;위치한&amp;nbsp;시계의&amp;nbsp;시곗바늘을&amp;nbsp;돌리는&amp;nbsp;경우에는&amp;nbsp;인접한&amp;nbsp;세&amp;nbsp;시계의&amp;nbsp;시곗바늘들이&amp;nbsp;함께&amp;nbsp;돌아가며,&amp;nbsp;꼭짓점에&amp;nbsp;위치한&amp;nbsp;시계의&amp;nbsp;시곗바늘을&amp;nbsp;돌리는&amp;nbsp;경우에는&amp;nbsp;인접한&amp;nbsp;두&amp;nbsp;시계의&amp;nbsp;시곗바늘들이&amp;nbsp;함께&amp;nbsp;돌아갑니다.&lt;br /&gt;&lt;br /&gt;각&amp;nbsp;시계는&amp;nbsp;12시,&amp;nbsp;3시,&amp;nbsp;6시,&amp;nbsp;9시&amp;nbsp;방향&amp;nbsp;중의&amp;nbsp;한&amp;nbsp;방향을&amp;nbsp;가리키고&amp;nbsp;있습니다.&amp;nbsp;각&amp;nbsp;시계의&amp;nbsp;시곗바늘을&amp;nbsp;적절히&amp;nbsp;조작하여&amp;nbsp;모든&amp;nbsp;시곗바늘이&amp;nbsp;12시&amp;nbsp;방향을&amp;nbsp;가리키면&amp;nbsp;퍼즐이&amp;nbsp;해결되어&amp;nbsp;성궤를&amp;nbsp;봉인하고&amp;nbsp;있는&amp;nbsp;잠금장치가&amp;nbsp;열릴&amp;nbsp;것입니다.&lt;br /&gt;&lt;br /&gt;노후화된&amp;nbsp;퍼즐&amp;nbsp;기계장치가&amp;nbsp;걱정되었던&amp;nbsp;혜선은&amp;nbsp;가능한&amp;nbsp;최소한의&amp;nbsp;조작으로&amp;nbsp;퍼즐을&amp;nbsp;해결하려고&amp;nbsp;합니다.&amp;nbsp;시곗바늘들의&amp;nbsp;행렬&amp;nbsp;clockHands가&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;퍼즐을&amp;nbsp;해결하기&amp;nbsp;위한&amp;nbsp;최소한의&amp;nbsp;조작&amp;nbsp;횟수를&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;DFS를 (0, 0)위치에서 부터 시작하여 clockHands의 모든 영역에 대하여 0, 1, 2, 3번씩 회전했을 때를 고려하여 clockHands의 현 상태가 모두 정렬이 되었다면, 해당 형상까지 총 몆번을 회전하였는지 검사할 수 있습니다.
&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;/li&gt;
&lt;li&gt;아래의 규칙을 따라 더 효율적인 방식으로 문제를 해결할 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(0, 0)부터 회전을 시도하여 경우의 수를 늘려나갑니다.&lt;/li&gt;
&lt;li&gt;현재 행에서 모든 열까지 회전을 한 후 , 행을 늘려나갑니다. (0, 0) -&amp;gt; (0, 1) -&amp;gt; ... -&amp;gt; (0, 3) -&amp;gt; (1, 0)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;행이 1 이상인경우, 현재 위치(row, col)에서 0~3번의 회전을 하였을 때&amp;nbsp; row - 1의 값이 1이어서는 안됩니다. 그 이유는 위 규칙에 의해 검사는 (0, 0)위치로부터 차례대로 진행되며, 위 값이 0이 아니라면, 더 이상 해당 값을 되돌릴 수 없기 때문입니다.&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행이 1 이상인 상태에서, row - 1의 값이 0이라면, 해당 경우의 수는 모든 시계를 정렬할 수 있는 가능성이 있으므로 DFS를 누적하여 호출할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;만약, check 함수가 true로 나온다면, 누적된 cnt의 값을 리턴합니다. row의 값이 size와 같아진다면, 영역을 초과할 때 까지 check에 성공하지 못한것으로, INT_MAX를 리턴하여 해당 값은 사용하지 않게합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1700994109859&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;climits&amp;gt;

using namespace std;

int dy[5] { 0, 0, 0, 1, -1 };
int dx[5] { 0, -1, 1, 0, 0 };
int result = INT_MAX;

// 선택한 (y, x)의 위치를 isClockwise 방향으로 회전
void rotate(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; clockHands, int y, int x, int count, bool isClockwise = true)
{
    // 선택된 위치를 기준으로 5번의 반복(현재 위치, 좌, 우, 상, 하)
    for(int i = 0; i &amp;lt; 5; ++i)
    {
        int yy = y + dy[i];
        int xx = x + dx[i];
        
        // 영역 자체를 벗어났다면, 수행하지 않음
        if(yy == -1 || xx == -1 || yy == clockHands.size() || xx == clockHands.size())
            continue;
        
        // isClockwise(시계 방향)이라면, +count(시계방향) 아니라면 -count(시계반대방향)
        clockHands[yy][xx] = clockHands[yy][xx] + (isClockwise ? +count : -count);
        
        // -값이 되면 적절하게 수정
        if(clockHands[yy][xx] &amp;lt; 0)
            clockHands[yy][xx] += 4;

        // 3보다 커질 수 없기에 적절히 수정
        clockHands[yy][xx] %= 4;
    }
}

// 현재 형상이 모두 12시로 맞춰져 있는가?
bool check(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; clockHands)
{
    for(int i = 0; i &amp;lt; clockHands.size(); ++i)
        for(int j = 0; j &amp;lt; clockHands.size(); ++j)
            if(clockHands[i][j])
                return false;
    
    return true;
}

int DFS(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; clockHands, int row, int col, int cnt)
{
    // 모든 시계를 확인하고 최소 이동 횟수 업데이트
    if (check(clockHands))
        return cnt;
    
    // 마지막에 도달하였을 때, check가 안되었다면, 이 방법으로는 시계를 정렬할 수 없음
    if (row == clockHands.size())
        return INT_MAX;  
    
    // 만약 누적된 cnt가 result 이상이라면, 더 이상 검사할 필요가 없기에 리턴
    if (cnt &amp;gt;= result)
        return INT_MAX;
    
    // 해당 위치를 0~3번 돌려 경우의수를 확장
    for (int i = 0; i &amp;lt; 4; ++i) 
    {
        // i만큼 시계 방향으로 회전
        rotate(clockHands, row, col, i, true);
        
        // 현재 row가 1 이상이면서, 현재 위치 바로 위 값이 0이 아니라면? -&amp;gt; 누적된 이 방법으로는 시계를 맞출 수 없음
        if (row &amp;amp;&amp;amp; clockHands[row - 1][col]) 
        {
            // 회전 전으로 복구(반시계 방향 회전)
            rotate(clockHands, row, col, i, false);
            continue;
        }
        
        // 다음 위치 계산
        int nextRow = (col + 1 == clockHands.size()) ? row + 1 : row; // col이 끝에 도달하였다면, row를 증가, 아니라면 유지
        int nextCol = (col + 1) % clockHands.size(); // 다음 col은 1씩 증가
        
        // cnt는 i만큼 더하기 (i만큼 회전한 것이기 때문)
        result = min(result, DFS(clockHands, nextRow, nextCol, cnt + i));
        
        // 재귀가 끝나면 원래 상태로 되돌리기
        rotate(clockHands, row, col, i, false);
    }
    
    return result;
}

int solution(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; clockHands) {
    return DFS(clockHands, 0, 0, 0);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithms (C++)</category>
      <category>dfs</category>
      <category>level3</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/544</guid>
      <comments>https://bonnate.tistory.com/544#entry544comment</comments>
      <pubDate>Sun, 26 Nov 2023 19:33:17 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 2차원 동전 뒤집기</title>
      <link>https://bonnate.tistory.com/543</link>
      <description>&lt;figure id=&quot;og_1700933582360&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131703&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Psuzb/hyUB6Y1lOv/PNmYvIP5khQXrOEvTmz41K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/g3ppH/hyUB3OKzoy/6iak56VrqgJIFOPZgWPvX0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131703&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/131703&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Psuzb/hyUB6Y1lOv/PNmYvIP5khQXrOEvTmz41K/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/g3ppH/hyUB3OKzoy/6iak56VrqgJIFOPZgWPvX0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;하고&amp;nbsp;있습니다.&amp;nbsp;모든&amp;nbsp;동전들은&amp;nbsp;앞과&amp;nbsp;뒤가&amp;nbsp;구분되어&amp;nbsp;있으며,&amp;nbsp;동전을&amp;nbsp;뒤집기&amp;nbsp;위해서는&amp;nbsp;같은&amp;nbsp;줄에&amp;nbsp;있는&amp;nbsp;모든&amp;nbsp;동전을&amp;nbsp;뒤집어야&amp;nbsp;합니다.&amp;nbsp;동전들의&amp;nbsp;초기&amp;nbsp;상태와&amp;nbsp;목표&amp;nbsp;상태가&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;초기&amp;nbsp;상태에서&amp;nbsp;최소&amp;nbsp;몇&amp;nbsp;번의&amp;nbsp;동전을&amp;nbsp;뒤집어야&amp;nbsp;목표&amp;nbsp;상태가&amp;nbsp;되는지&amp;nbsp;알아봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BPiLE/btsASHLnHW9/BKDOJLT3be36Hhu9KQE7Mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BPiLE/btsASHLnHW9/BKDOJLT3be36Hhu9KQE7Mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BPiLE/btsASHLnHW9/BKDOJLT3be36Hhu9KQE7Mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBPiLE%2FbtsASHLnHW9%2FBKDOJLT3be36Hhu9KQE7Mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;165&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;165&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;들어,&amp;nbsp;위&amp;nbsp;그림에서&amp;nbsp;맨&amp;nbsp;왼쪽이&amp;nbsp;초기&amp;nbsp;상태,&amp;nbsp;맨&amp;nbsp;오른쪽이&amp;nbsp;목표&amp;nbsp;상태인&amp;nbsp;경우에&amp;nbsp;대해&amp;nbsp;알아봅시다.&amp;nbsp;그림에서&amp;nbsp;검은색&amp;nbsp;원은&amp;nbsp;앞면인&amp;nbsp;동전,&amp;nbsp;흰색&amp;nbsp;원은&amp;nbsp;뒷면인&amp;nbsp;동전을&amp;nbsp;의미합니다.&amp;nbsp;초기&amp;nbsp;상태에서&amp;nbsp;2행과&amp;nbsp;4행의&amp;nbsp;돌들을&amp;nbsp;뒤집으면,&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;그림이&amp;nbsp;됩니다.&amp;nbsp;그&amp;nbsp;후,&amp;nbsp;2열,&amp;nbsp;4열,&amp;nbsp;5열의&amp;nbsp;돌들을&amp;nbsp;순서대로&amp;nbsp;뒤집는&amp;nbsp;다면,&amp;nbsp;총&amp;nbsp;5번의&amp;nbsp;동전&amp;nbsp;뒤집기를&amp;nbsp;통해&amp;nbsp;목표&amp;nbsp;상태가&amp;nbsp;되며,&amp;nbsp;이&amp;nbsp;경우가&amp;nbsp;최소인&amp;nbsp;경우입니다. &lt;br /&gt;&lt;br /&gt;직사각형&amp;nbsp;모양의&amp;nbsp;공간에&amp;nbsp;놓인&amp;nbsp;동전들의&amp;nbsp;초기&amp;nbsp;상태를&amp;nbsp;나타내는&amp;nbsp;2차원&amp;nbsp;정수&amp;nbsp;배열&amp;nbsp;beginning,&amp;nbsp;목표&amp;nbsp;상태를&amp;nbsp;나타내는&amp;nbsp;target이&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;초기&amp;nbsp;상태에서&amp;nbsp;목표&amp;nbsp;상태로&amp;nbsp;만들기&amp;nbsp;위해&amp;nbsp;필요한&amp;nbsp;동전&amp;nbsp;뒤집기&amp;nbsp;횟수의&amp;nbsp;최솟값을&amp;nbsp;return&amp;nbsp;하는&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성하세요.&amp;nbsp;단,&amp;nbsp;목표&amp;nbsp;상태를&amp;nbsp;만들지&amp;nbsp;못하는&amp;nbsp;경우에는&amp;nbsp;-1을&amp;nbsp;return&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;h3 data-ke-size=&quot;size23&quot;&gt;오답 코드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두개의 반례를 찾아내지 못하여 결국 처음부터 다시 작성하기로 하였습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWrj9H/btsATmGQwQ1/zGO5oSBBTqeZc5pYaMzar1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWrj9H/btsATmGQwQ1/zGO5oSBBTqeZc5pYaMzar1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWrj9H/btsATmGQwQ1/zGO5oSBBTqeZc5pYaMzar1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWrj9H%2FbtsATmGQwQ1%2FzGO5oSBBTqeZc5pYaMzar1%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;707&quot; height=&quot;640&quot; data-origin-width=&quot;707&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700931563572&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;iostream&amp;gt;

using namespace std;

void flip(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; map, int pos, bool isHorizontal)
{
    if(isHorizontal)
        for(int i = 0; i &amp;lt; map[0].size(); ++i)
            map[pos][i] = map[pos][i] ? 0 : 1;
    else
        for(int i = 0; i &amp;lt; map.size(); ++i)
            map[i][pos] = map[i][pos] ? 0 : 1;
}

bool print(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; map)
{
    for(int i = 0; i &amp;lt; map.size(); ++i)
    {
        for(int j = 0; j &amp;lt; map[0].size(); ++j)
            printf(&quot;%d &quot;, map[i][j]);
        cout&amp;lt;&amp;lt;endl;
    }
    
    cout&amp;lt;&amp;lt;endl;
       
    return true;
}

bool compare(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; map, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; target)
{
    for(int i = 0; i &amp;lt; map.size(); ++i)
        for(int j = 0; j &amp;lt; map[0].size(); ++j)
            if(map[i][j] != target[i][j])
                return false;
       
    return true;
}

bool checkMap(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; beginning, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; target)
{
    int row = beginning.size();
    int col = beginning[0].size();
    
    if(row &amp;lt; 2 || col &amp;lt; 2)
        return false;
    
    bool checkCol = true;
    for(int i = 0; i &amp;lt; row; ++i)
        for(int j = 0; j &amp;lt; col - 1; ++j)
        {
            if(beginning[i][j] != beginning[i][j + 1] || target[i][j] != target[i][j + 1])
                checkCol = false;
        }
    
    bool checkRow = true;  
    for(int i = 0; i &amp;lt; col; ++i)
        for(int j = 0; j &amp;lt; row - 1; ++j)
        {
            if(beginning[j][i] != beginning[j + 1][i] || target[j][i] != target[j + 1][i])
                checkRow = false;
        }    
    
    if(checkCol || checkRow)
        printf(&quot;TRUE&quot;);
    
    return checkCol || checkRow;
}

int solution(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; beginning, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; target) {
    if(compare(beginning, target))
        return 0;

    vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; original = beginning;
    
    int row = beginning.size();
    int col = beginning[0].size();
    bool isSame = checkMap(beginning, target);
    
    if(min(row, col) == 1 || isSame)
    {
        if(isSame)
            row = row &amp;lt; col ? 1 : row;
        
        if(row == 1)
        {
            int diff = 0;
            for(int i = 0; i &amp;lt; col; ++i)
                if(beginning[0][i] != target[0][i])
                    ++diff;
            
            printf(&quot;ROW %d&quot;, diff);
            
            int answer = diff &amp;lt; col / 2 ? diff : col - diff + 1;
            if(isSame)
                answer += beginning.size() - 1;
            
            return answer;                 
        }
        else
        {
            int diff = 0;
            for(int i = 0; i &amp;lt; row; ++i)
                if(beginning[i][0] != target[i][0])
                    ++diff;
            
            printf(&quot;COL %d&quot;, diff);
            
            int answer = diff &amp;lt; row / 2 ? diff : row - diff + 1;
            if(isSame)
                answer += beginning[0].size() - 1;
            
            return answer;            
        }
    }
    
    int answer1 = 0;
    bool escape1 = false;
    bool success1 = false;
    for(int i = 0; i &amp;lt; row; ++i)
        if(beginning[i][0] != target[i][0])
        {
            ++answer1;
            flip(beginning, i, true);
            if(compare(beginning, target))
            {
                escape1 = true;
                success1 = true;
                break;   
            }
        }
    if(!escape1)
    for(int i = 0; i &amp;lt; col; ++i)
        if(beginning[0][i] != target[0][i])
        {
            ++answer1;
            flip(beginning, i, false);
            if(compare(beginning, target))
            {
                success1 = true;
                break;
            }
        }
    if(!success1)
        answer1 = -1;
    
    int answer2 = 0;
    bool escape2 = false;
    bool success2 = false;
    beginning = original;
    for(int i = 0; i &amp;lt; col; ++i)
        if(beginning[0][i] != target[0][i])
        {
            ++answer2;
            flip(beginning, i, false);
            if(compare(beginning, target))
            {
                escape2 = true;
                success2 = true;
                break;   
            }
        }      
    if(!escape2)
    for(int i = 0; i &amp;lt; row; ++i)
        if(beginning[i][0] != target[i][0])
        {
            ++answer2;
            flip(beginning, i, true);
            if(compare(beginning, target))
            {
                success2 = true;
                break;             
            }
        }
    if(!success2)
        answer2 = -1;
  
    return min(answer1, answer2);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;정답 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1700932988329&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace std;

void flip(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; map, int pos, bool isHorizontal)
{
    if(isHorizontal)
        for(int i = 0; i &amp;lt; map[0].size(); ++i)
            map[pos][i] = map[pos][i] ? 0 : 1;
    else
        for(int i = 0; i &amp;lt; map.size(); ++i)
            map[i][pos] = map[i][pos] ? 0 : 1;
}

bool compare(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; map, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; target)
{
    for(int i = 0; i &amp;lt; map.size(); ++i)
        for(int j = 0; j &amp;lt; map[0].size(); ++j)
            if(map[i][j] != target[i][j])
                return false;
       
    return true;
}

int solution(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; beginning, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; target) {

    int row = beginning.size();
    int col = beginning[0].size();
    
    // 행 -&amp;gt; 열 순서에서 행이 다른경우? flip
    int answer1 = 0;
    bool escape1 = false;
    bool success1 = false;
    vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; ch = beginning;
    for(int i = 0; i &amp;lt; row; ++i)
        if(ch[i][0] != target[i][0])
        {
            ++answer1;
            flip(ch, i, true);
            if(compare(ch, target))
            {
                escape1 = true;
                success1 = true;
                break;   
            }
        }
    if(!escape1)
    for(int i = 0; i &amp;lt; col; ++i)
        if(ch[0][i] != target[0][i])
        {
            ++answer1;
            flip(ch, i, false);
            if(compare(ch, target))
            {
                success1 = true;
                break;
            }
        }
    if(!success1)
        answer1 = -1;
    
    // 열 -&amp;gt; 행 순서에서 열이 다른경우? flip
    int answer2 = 0;
    bool escape2 = false;
    bool success2 = false;
    ch = beginning;
    for(int i = 0; i &amp;lt; col; ++i)
        if(ch[0][i] != target[0][i])
        {
            ++answer2;
            flip(ch, i, false);
            if(compare(ch, target))
            {
                escape2 = true;
                success2 = true;
                break;   
            }
        }      
    if(!escape2)
    for(int i = 0; i &amp;lt; row; ++i)
        if(ch[i][0] != target[i][0])
        {
            ++answer2;
            flip(ch, i, true);
            if(compare(ch, target))
            {
                success2 = true;
                break;             
            }
        }
    if(!success2)
        answer2 = -1;
    
    // 행 -&amp;gt; 열 순서에서 행이 같은경우? flip
    int answer3 = 0;
    bool escape3 = false;
    bool success3 = false;
    ch = beginning;    
    for(int i = 0; i &amp;lt; row; ++i)
        if(ch[i][0] == target[i][0])
        {
            ++answer3;
            flip(ch, i, true);
            if(compare(ch, target))
            {
                escape3 = true;
                success3 = true;
                break;   
            }
        }
    if(!escape3)
    for(int i = 0; i &amp;lt; col; ++i)
        if(ch[0][i] != target[0][i])
        {
            ++answer3;
            flip(ch, i, false);
            if(compare(ch, target))
            {
                success3 = true;
                break;
            }
        }
    if(!success3)
        answer3 = -1;    
    
    // 열 -&amp;gt; 행 순서에서 열이 같은경우? flip
    int answer4 = 0;
    bool escape4 = false;
    bool success4 = false;
    ch = beginning;    
    for(int i = 0; i &amp;lt; col; ++i)
        if(ch[0][i] == target[0][i])
        {
            ++answer4;
            flip(ch, i, false);
            if(compare(ch, target))
            {
                escape4 = true;
                success4 = true;
                break;   
            }
        }   
    if(!escape4)
    for(int i = 0; i &amp;lt; row; ++i)
        if(ch[i][0] != target[i][0])
        {
            ++answer4;
            flip(ch, i, true);
            if(compare(ch, target))
            {
                success4 = true;
                break;             
            }
        }
    if(!success4)
        answer4 = -1;      
    
    return min({answer1, answer2, answer3, answer4});
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네가지의 규칙을 적용하여 문제를 해결합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행을 먼저 검사하여 행의 맨 앞의 값이 서로 다르다면 flip을 하고 열의 맨 앞 값이 다르다면 flip을 한 갯수&lt;/li&gt;
&lt;li&gt;열을 먼저 검사하여 열의 맨 앞의 값이 서로 다르다면 flip을 하고 행의 맨 앞 값이 다르다면 flip을 한 갯수&lt;/li&gt;
&lt;li&gt;행을 먼저 검사하여 행의 맨 앞의 값이 서로 같다면 flip을 하고 열의 맨 앞 값이 다르다면 flip을 한 갯수&lt;/li&gt;
&lt;li&gt;열을 먼저 검사하여 열의 맨 앞의 값이 서로 같다면 flip을 하고 행의 맨 앞 값이 다르다면 flip을 한 갯수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위에서 구한 네가지의 정답(answer1, 2, 3, 4)의 최소값을 리턴합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>level3</category>
      <category>구현</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/543</guid>
      <comments>https://bonnate.tistory.com/543#entry543comment</comments>
      <pubDate>Sun, 26 Nov 2023 02:35:23 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 부대복귀</title>
      <link>https://bonnate.tistory.com/542</link>
      <description>&lt;figure id=&quot;og_1700923812163&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/132266#qna&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cPnO3L/hyUB5y2may/GEdCHYy5F4PdNWd8rQOgy1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/CSEDQ/hyUCaf0xr8/mxfUpfgh6ug3oMc9w1doKK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/132266#qna&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/132266#qna&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cPnO3L/hyUB5y2may/GEdCHYy5F4PdNWd8rQOgy1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/CSEDQ/hyUCaf0xr8/mxfUpfgh6ug3oMc9w1doKK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;임무를&amp;nbsp;수행&amp;nbsp;중입니다.&amp;nbsp;지도에서&amp;nbsp;강철부대가&amp;nbsp;위치한&amp;nbsp;지역을&amp;nbsp;포함한&amp;nbsp;각&amp;nbsp;지역은&amp;nbsp;유일한&amp;nbsp;번호로&amp;nbsp;구분되며,&amp;nbsp;두&amp;nbsp;지역&amp;nbsp;간의&amp;nbsp;길을&amp;nbsp;통과하는&amp;nbsp;데&amp;nbsp;걸리는&amp;nbsp;시간은&amp;nbsp;모두&amp;nbsp;1로&amp;nbsp;동일합니다.&amp;nbsp;임무를&amp;nbsp;수행한&amp;nbsp;각&amp;nbsp;부대원은&amp;nbsp;지도&amp;nbsp;정보를&amp;nbsp;이용하여&amp;nbsp;최단시간에&amp;nbsp;부대로&amp;nbsp;복귀하고자&amp;nbsp;합니다.&amp;nbsp;다만&amp;nbsp;적군의&amp;nbsp;방해로&amp;nbsp;인해,&amp;nbsp;임무의&amp;nbsp;시작&amp;nbsp;때와&amp;nbsp;다르게&amp;nbsp;되돌아오는&amp;nbsp;경로가&amp;nbsp;없어져&amp;nbsp;복귀가&amp;nbsp;불가능한&amp;nbsp;부대원도&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;강철부대가&amp;nbsp;위치한&amp;nbsp;지역을&amp;nbsp;포함한&amp;nbsp;총지역의&amp;nbsp;수&amp;nbsp;n,&amp;nbsp;두&amp;nbsp;지역을&amp;nbsp;왕복할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;길&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;2차원&amp;nbsp;정수&amp;nbsp;배열&amp;nbsp;roads,&amp;nbsp;각&amp;nbsp;부대원이&amp;nbsp;위치한&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;지역들을&amp;nbsp;나타내는&amp;nbsp;정수&amp;nbsp;배열&amp;nbsp;sources,&amp;nbsp;강철부대의&amp;nbsp;지역&amp;nbsp;destination이&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;주어진&amp;nbsp;sources의&amp;nbsp;원소&amp;nbsp;순서대로&amp;nbsp;강철부대로&amp;nbsp;복귀할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;최단시간을&amp;nbsp;담은&amp;nbsp;배열을&amp;nbsp;return하는&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해주세요.&amp;nbsp;복귀가&amp;nbsp;불가능한&amp;nbsp;경우&amp;nbsp;해당&amp;nbsp;부대원의&amp;nbsp;최단시간은&amp;nbsp;-1입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700923825453&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;queue&amp;gt;
#include &amp;lt;iostream&amp;gt;

using namespace std;
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; v;
vector&amp;lt;int&amp;gt; dist;

vector&amp;lt;int&amp;gt; solution(int n, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; roads, vector&amp;lt;int&amp;gt; sources, int destination) {
    v = vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;(n + 1, vector&amp;lt;int&amp;gt;());
    dist = vector&amp;lt;int&amp;gt;(n + 1, -1);
    
    for(vector&amp;lt;int&amp;gt; road : roads)
    {
        v[road[0]].push_back(road[1]);
        v[road[1]].push_back(road[0]);
    }
    
    queue&amp;lt;int&amp;gt; q;
    q.push(destination);
    dist[destination] = 0;
    
    while(!q.empty())
    {
        int here = q.front();
        q.pop();
        
        for(int i = 0; i &amp;lt; v[here].size(); ++i)
        {
            int to = v[here][i];
            if(dist[to] != -1)
                continue;
            
            q.push(to);
            dist[to] = dist[here] + 1;
        }
    }
    
    vector&amp;lt;int&amp;gt; answer;
    for(int n : sources)
        answer.push_back(dist[n]);
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BFS를 이용하여 문제를 해결하였습니다.&lt;/li&gt;
&lt;li&gt;dist를 -1로 모두 초기화합니다. 단 한번도 해당 노드를 방문하지 못하는경우, -1로 리턴할 수 있게 합니다.&lt;/li&gt;
&lt;li&gt;시작점에서 가까운 노드들을 먼저 방문하고, 그 다음에는 그 노드들과 인접한 노드들을 방문하게 됩니다. 이런식으로 하나씩 계속해서 가까운 순서대로 이동하면, 최종적으로 목표 지점까지의 가장 짧은 경로를 찾을 수 있습니다.&lt;/li&gt;
&lt;li&gt;while을 시작하기 전 push를 시작점인 destination을 삽입하여 모든 노드에 대하여 검색하도록 합니다.&lt;/li&gt;
&lt;li&gt;q가 empty가 되어 while문을 빠져나온경우, sources를 순회하여 dist의 값을 answer에 차례대로 삽입합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>BFS</category>
      <category>level3</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/542</guid>
      <comments>https://bonnate.tistory.com/542#entry542comment</comments>
      <pubDate>Sun, 26 Nov 2023 00:02:02 +0900</pubDate>
    </item>
    <item>
      <title>[티스토리] 업데이트된 Namecard 제거하기</title>
      <link>https://bonnate.tistory.com/541</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;최근 티스토리에서 추가된 Namecard로 다크모드에서 색상이 올바르게 적용되지 않아 어색하게 보이는 문제점이 생겨 이를 제거하는 방법을 공유합니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;954&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oBHl5/btsAQB6cdQD/nKIVPzRNaJmNiUJfSxUPB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oBHl5/btsAQB6cdQD/nKIVPzRNaJmNiUJfSxUPB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oBHl5/btsAQB6cdQD/nKIVPzRNaJmNiUJfSxUPB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoBHl5%2FbtsAQB6cdQD%2FnKIVPzRNaJmNiUJfSxUPB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;954&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;954&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 이미지와 같이 다크모드에서 흰색 영역으로  매우 어색한것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700904268258&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;div[data-tistory-react-app=&quot;Namecard&quot;] 
{
  display: none
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;티스토리 스킨편집에서 CSS 영역에 위 코드를 추가합니다.&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;1044&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0DoFz/btsAXfGFbXT/LgLXANdGywdyyOfAk21AU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0DoFz/btsAXfGFbXT/LgLXANdGywdyyOfAk21AU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0DoFz/btsAXfGFbXT/LgLXANdGywdyyOfAk21AU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0DoFz%2FbtsAXfGFbXT%2FLgLXANdGywdyyOfAk21AU0%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;1044&quot; height=&quot;560&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;560&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;1146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RtgCA/btsATQ8GITC/AZfEkv132WlT87p5rMSAok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RtgCA/btsATQ8GITC/AZfEkv132WlT87p5rMSAok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RtgCA/btsATQ8GITC/AZfEkv132WlT87p5rMSAok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRtgCA%2FbtsATQ8GITC%2FAZfEkv132WlT87p5rMSAok%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;1366&quot; height=&quot;1146&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;1146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;적용 후 새로고침하면 정상적으로 제거된것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>기타/useful things</category>
      <category>티스토리</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/541</guid>
      <comments>https://bonnate.tistory.com/541#entry541comment</comments>
      <pubDate>Sat, 25 Nov 2023 18:26:07 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 등대  </title>
      <link>https://bonnate.tistory.com/540</link>
      <description>&lt;figure id=&quot;og_1700902813263&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133500#qna&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bAED0g/hyUCbeN5TU/ChrEBLo0skbRcOA7TxkbwK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cdkW2e/hyUB9H6ayY/5u06l5qKAKLbN8A8tpSxV0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133500#qna&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/133500#qna&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bAED0g/hyUCbeN5TU/ChrEBLo0skbRcOA7TxkbwK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cdkW2e/hyUB9H6ayY/5u06l5qKAKLbN8A8tpSxV0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인천&amp;nbsp;앞바다에는&amp;nbsp;1부터&amp;nbsp;n까지&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;번호가&amp;nbsp;매겨진&amp;nbsp;등대&amp;nbsp;n개가&amp;nbsp;존재합니다.&amp;nbsp;등대와&amp;nbsp;등대&amp;nbsp;사이를&amp;nbsp;오가는&amp;nbsp;뱃길이&amp;nbsp;n-1개&amp;nbsp;존재하여,&amp;nbsp;어느&amp;nbsp;등대에서&amp;nbsp;출발해도&amp;nbsp;다른&amp;nbsp;모든&amp;nbsp;등대까지&amp;nbsp;이동할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;등대&amp;nbsp;관리자&amp;nbsp;윤성이는&amp;nbsp;전력을&amp;nbsp;아끼기&amp;nbsp;위하여,&amp;nbsp;이&amp;nbsp;중&amp;nbsp;몇&amp;nbsp;개의&amp;nbsp;등대만&amp;nbsp;켜&amp;nbsp;두려고&amp;nbsp;합니다.&amp;nbsp;하지만&amp;nbsp;등대를&amp;nbsp;아무렇게나&amp;nbsp;꺼버리면,&amp;nbsp;뱃길을&amp;nbsp;오가는&amp;nbsp;배들이&amp;nbsp;위험할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;한&amp;nbsp;뱃길의&amp;nbsp;양쪽&amp;nbsp;끝&amp;nbsp;등대&amp;nbsp;중&amp;nbsp;적어도&amp;nbsp;하나는&amp;nbsp;켜져&amp;nbsp;있도록&amp;nbsp;등대를&amp;nbsp;켜&amp;nbsp;두어야&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어,&amp;nbsp;아래&amp;nbsp;그림과&amp;nbsp;같이&amp;nbsp;등대&amp;nbsp;8개와&amp;nbsp;7개의&amp;nbsp;뱃길들이&amp;nbsp;있다고&amp;nbsp;합시다.&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;1번&amp;nbsp;등대와&amp;nbsp;5번&amp;nbsp;등대&amp;nbsp;두&amp;nbsp;개만&amp;nbsp;켜&amp;nbsp;두어도&amp;nbsp;모든&amp;nbsp;뱃길은&amp;nbsp;양쪽&amp;nbsp;끝&amp;nbsp;등대&amp;nbsp;중&amp;nbsp;하나가&amp;nbsp;켜져&amp;nbsp;있으므로,&amp;nbsp;배들은&amp;nbsp;안전하게&amp;nbsp;운항할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FVMBh/btsASrWgV6n/Lm6Tx9krpgDg51zgxqJTTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FVMBh/btsASrWgV6n/Lm6Tx9krpgDg51zgxqJTTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FVMBh/btsASrWgV6n/Lm6Tx9krpgDg51zgxqJTTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFVMBh%2FbtsASrWgV6n%2FLm6Tx9krpgDg51zgxqJTTk%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;578&quot; height=&quot;290&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;등대의&amp;nbsp;개수&amp;nbsp;n과&amp;nbsp;각&amp;nbsp;뱃길이&amp;nbsp;연결된&amp;nbsp;등대의&amp;nbsp;번호를&amp;nbsp;담은&amp;nbsp;이차원&amp;nbsp;배열&amp;nbsp;lighthouse가&amp;nbsp;매개변수로&amp;nbsp;주어집니다.&amp;nbsp;윤성이가&amp;nbsp;켜&amp;nbsp;두어야&amp;nbsp;하는&amp;nbsp;등대&amp;nbsp;개수의&amp;nbsp;최솟값을&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;작성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700903148735&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; v;
bool light[100001] = {false, }; // 불이 켜진 등대인지 체크
int answer = 0;

// from: 어느 노드에서 왔는가?
// here: 현재 노드
void DFS(int from, int here) 
{
    // here(현재 위치)에서 갈 수 있는 모든 노드를 검사
    for (int i = 0; i &amp;lt; v[here].size(); i++) 
    {
        // 이전 노드(from)로 돌아가지 않아야 함
        // DFS를 통해 무방향 탐색을 할경우 1 -&amp;gt; 2 -&amp;gt; 3 -&amp;gt; 2처럼 v[here][i] == from이 되는 경우가 있음
        if (v[here][i] != from) 
        {
            // 현재 위치에서 v[here][i]로 이동
            DFS(here, v[here][i]);
            
            // 만약 현재 위치와, 다음 위치 모두 불이 꺼져있는경우, 불을 켜면서, ++answer
            if (!light[v[here][i]] &amp;amp;&amp;amp; !light[here]) 
            {
                light[here] = true;
                ++answer;
            }
        }
    }
}

int solution(int n, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; lighthouse) {
    v = vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;(n + 1, vector&amp;lt;int&amp;gt;());
    
    // 무방향 그래프로 양쪽으로 이동할 수 있게 삽입
    for(vector&amp;lt;int&amp;gt; path : lighthouse)
    {
        v[path[0]].push_back(path[1]);
        v[path[1]].push_back(path[0]);
    }
    
    // 가상위치(0)에서 1번 노드로 이동하는것으로 탐색 시작
    DFS(0, 1);
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS를 이용하여 문제를 해결하였습니다.&lt;/li&gt;
&lt;li&gt;무방향 그래프로, 왕복할 수 있도록 v에 1 -&amp;gt; 2, 2 -&amp;gt; 1에 대하여 경로를 삽입해줘야합니다.&lt;/li&gt;
&lt;li&gt;1번 노드부터 시작하여 DFS를 시작합니다.&lt;/li&gt;
&lt;li&gt;현재 노드(here)에서부터 갈 수 있는 모든 노드를 검사합니다. 이때, here과 이전 노드(from)이 같다면, 말단 노드에 들렀다가 돌아온 경우로, 더 이상 진행하지 않습니다.
&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;/li&gt;
&lt;li&gt;깊이 탐색 중 현재 노드와, 다음 노드가 둘 다 불이 꺼져있다면, 해당 위치에 불을 켜고, ++answer을 수행합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>dfs</category>
      <category>level3</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/540</guid>
      <comments>https://bonnate.tistory.com/540#entry540comment</comments>
      <pubDate>Sat, 25 Nov 2023 18:08:44 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 숫자 타자 대회  </title>
      <link>https://bonnate.tistory.com/539</link>
      <description>&lt;figure id=&quot;og_1700891947809&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/136797&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgjQqz/hyUB290njv/owZdNqF7ROJop1BCFonBYK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cdRY7H/hyUCcSjxSX/X8FqKz2ZgkP8RWtK2CehF1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/136797&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/136797&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgjQqz/hyUB290njv/owZdNqF7ROJop1BCFonBYK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cdRY7H/hyUCcSjxSX/X8FqKz2ZgkP8RWtK2CehF1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;1142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKhi0l/btsAUJ88ui6/oVMA8XGCpIOS9kkoypL5N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKhi0l/btsAUJ88ui6/oVMA8XGCpIOS9kkoypL5N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKhi0l/btsAUJ88ui6/oVMA8XGCpIOS9kkoypL5N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKhi0l%2FbtsAUJ88ui6%2FoVMA8XGCpIOS9kkoypL5N1%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;451&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;1142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이동하지 않고 제자리에서 다시 누르는 것은 가중치가 1입니다.&lt;/li&gt;
&lt;li&gt;상하좌우로 인접한 숫자로 이동하여 누르는 것은 가중치가 2입니다.&lt;/li&gt;
&lt;li&gt;대각선으로 인접한 숫자로 이동하여 누르는 것은 가중치가 3입니다.&lt;/li&gt;
&lt;li&gt;같지 않고 인접하지 않은 숫자를 누를 때는 위 규칙에 따라 가중치 합이 최소가 되는 경로를 따릅니다.&lt;/li&gt;
&lt;/ul&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;들어&amp;nbsp;1&amp;nbsp;위에&amp;nbsp;있던&amp;nbsp;손가락을&amp;nbsp;0&amp;nbsp;으로&amp;nbsp;이동하여&amp;nbsp;누르는&amp;nbsp;것은&amp;nbsp;2&amp;nbsp;+&amp;nbsp;2&amp;nbsp;+&amp;nbsp;3&amp;nbsp;=&amp;nbsp;7&amp;nbsp;만큼의&amp;nbsp;가중치를&amp;nbsp;갖습니다.&lt;br /&gt;단,&amp;nbsp;숫자&amp;nbsp;자판은&amp;nbsp;버튼의&amp;nbsp;크기가&amp;nbsp;작기&amp;nbsp;때문에&amp;nbsp;같은&amp;nbsp;숫자&amp;nbsp;버튼&amp;nbsp;위에&amp;nbsp;동시에&amp;nbsp;두&amp;nbsp;엄지&amp;nbsp;손가락을&amp;nbsp;올려놓을&amp;nbsp;수&amp;nbsp;없습니다.&amp;nbsp;즉,&amp;nbsp;어떤&amp;nbsp;숫자를&amp;nbsp;눌러야&amp;nbsp;할&amp;nbsp;차례에&amp;nbsp;그&amp;nbsp;숫자&amp;nbsp;위에&amp;nbsp;올려져&amp;nbsp;있는&amp;nbsp;손가락이&amp;nbsp;있다면&amp;nbsp;반드시&amp;nbsp;그&amp;nbsp;손가락으로&amp;nbsp;눌러야&amp;nbsp;합니다.&lt;br /&gt;&lt;br /&gt;숫자로&amp;nbsp;이루어진&amp;nbsp;문자열&amp;nbsp;numbers가&amp;nbsp;주어졌을&amp;nbsp;때&amp;nbsp;최소한의&amp;nbsp;시간으로&amp;nbsp;타이핑을&amp;nbsp;하는&amp;nbsp;경우의&amp;nbsp;가중치&amp;nbsp;합을&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700892013163&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;unordered_map&amp;gt;

using namespace std;

unordered_map&amp;lt;char, pair&amp;lt;int, int&amp;gt;&amp;gt; m;
int dp[100001][10][10];

int getWeight(int from, char c) {
    // from을 기준으로 c에 해당하는 x, y의 길이를 가져오기
    int x = abs(m[c].first - m[from + '0'].first) ;
    int y = abs(m[c].second - m[from + '0'].second);
    
    int weight = -1;
    if(!x &amp;amp;&amp;amp; !y) // 만약 x, y가 from과 같은 위치라면 1 리턴
        return 1;
    else if(!x || !y) // 만약 x나 y중 하나가 0이라면, 직선 거리만 사용하기에 큰 값 * 2 리턴
        return max(x, y) * 2;
    else // 대각선이 포함된경우 직선거리 * 2 + 대각선거리 * 3 리턴
    {
        int minValue = min(x, y);
        x -= minValue;
        y -= minValue;
        return minValue * 3 + max(x, y) * 2;
    }
}

int func(string&amp;amp; numbers, int left = 4, int right = 6, int idx = 0) {
    // 끝까지 검사하였다면 리턴
    if(idx == numbers.size())
        return 0;

    // 두 손가락의 위치가 같으면 안되기에 매우 큰 수를 리턴하여 사용할 수 없도록 함
    if(left == right)
        return 99999999;
    
    // 이미 해당 값이 있다면, 중복 연산을 피하기 위하여 즉시 리턴
    if(dp[idx][left][right])
        return dp[idx][left][right];
    
    // 현재 left와 right의 위치에서 numbers[idx]까지의 가중치를 구하기
    int leftW1 = getWeight(left, numbers[idx]);
    int rightW1 = getWeight(right, numbers[idx]);
    
    // left와 right를 이용한 가중치를 각각 구하기
    int leftW2 = leftW1 + func(numbers, numbers[idx] - '0', right, idx + 1);
    int rightW2 = rightW1 + func(numbers, left, numbers[idx] - '0', idx + 1);

    // 각 가중치에서 최소값을 선택
    return dp[idx][left][right] = min(leftW2, rightW2);
}

int solution(string numbers) {
    // 숫자 글자에 해당하는 위치를 map에 저장
    char c = '1';
    for(int i = 0; i &amp;lt; 3; ++i)
        for(int j = 0; j &amp;lt; 3; ++j)
            m[c++] = {i, j};
    m['0'] = {3, 1};
  
    // 정답 구하기
    return func(numbers);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;numbers의 길이가 100,000이기때문에 n^2로 해결할 수 없는 문제입니다.&lt;/li&gt;
&lt;li&gt;탐욕법 해결법으로, 두 손가락의 현재 위치에서 가중치가 낮은 손가락을 사용하였을때에도 뒤에있는 값들을 고려해야하기에 이 방법으로도 해결할 수 없습니다.&lt;/li&gt;
&lt;li&gt;Top-Down 방식의 DP를 해결하여 문제를 해결할 수 있었습니다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 상태에서 왼손, 오른손을 사용할 때의 모든 경우의 수를 고려해야합니다.&lt;/li&gt;
&lt;li&gt;2 + 4 + 8 + 16 + 32.... 와 같이 계산을 해야 문제를 해결할 수 있지만, DP를 이용하여 중복된 계산을 회피할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;왼손, 오른손을 모두 사용한다고 가정하였을 때, 누적된 가중치의 최소값을 찾아낼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>DP</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/539</guid>
      <comments>https://bonnate.tistory.com/539#entry539comment</comments>
      <pubDate>Sat, 25 Nov 2023 15:05:47 +0900</pubDate>
    </item>
    <item>
      <title>[유니티] BoxColliders does not support negative scale or size. 해결 Tool</title>
      <link>https://bonnate.tistory.com/538</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&quot;BoxColliders does not support negative scale or size.&quot; Warning은 오브젝트의 스케일과 반대 값인 Collider의 size가 Negative값으로 설정되어있으면 나타나는 경고입니다. 이것은 오브젝트를 좌우반전 등 특정 scale을 음수값으로 설정하였을 때, Collider의 size도 함께 음수로 설정하지 않아 발생합니다. 이것을 쉽게 해결하는 Tool을 제작하여 배포합니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  서론&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfFq23/btsAFFGw4eB/G2FwZmV5BTEEatlwSMpHq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfFq23/btsAFFGw4eB/G2FwZmV5BTEEatlwSMpHq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfFq23/btsAFFGw4eB/G2FwZmV5BTEEatlwSMpHq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfFq23%2FbtsAFFGw4eB%2FG2FwZmV5BTEEatlwSMpHq1%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;1069&quot; height=&quot;687&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; 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;Tools에서 Window창을 열고 쉽게 Scene에 있는 문제가 발생할 수 있는 BoxCollider을 찾을 수 있습니다.&lt;/li&gt;
&lt;li&gt;해당 오브젝트를 손쉽게 보고, 문제를 해결할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;✅ 적용&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 스크립트 다운로드&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignLeft&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/w7FSO/btsAIccrY8a/sNbKPq4R4PuRcDK9YYz2F1/NegativeBoxColliderModifier.cs?attach=1&amp;amp;knm=tfile.cs&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;NegativeBoxColliderModifier.cs&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스크립트를 다운로드 받아 프로젝트에 포함시킵니다.&lt;/li&gt;
&lt;li&gt;스크립트 파일의 위치는 어디든지 상관 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; Window 열기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4xUCg/btsAzCYzHSi/EKUkAlaO90iEP1SfiCfwK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4xUCg/btsAzCYzHSi/EKUkAlaO90iEP1SfiCfwK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4xUCg/btsAzCYzHSi/EKUkAlaO90iEP1SfiCfwK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4xUCg%2FbtsAzCYzHSi%2FEKUkAlaO90iEP1SfiCfwK0%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;760&quot; height=&quot;380&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Tools/Bonnate/Negative Box Collider Modifier을 엽니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 보기 및 수정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWezlm/btsAzcSOt78/KeMkrDAqHTAt1rpv1dRSoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWezlm/btsAzcSOt78/KeMkrDAqHTAt1rpv1dRSoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWezlm/btsAzcSOt78/KeMkrDAqHTAt1rpv1dRSoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWezlm%2FbtsAzcSOt78%2FKeMkrDAqHTAt1rpv1dRSoK%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;1003&quot; height=&quot;809&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;창이 열리면, 오브젝트 이름들과 View, Fix 버튼이 나타납니다.&lt;/li&gt;
&lt;li&gt;View 버튼을 클릭하면, 해당 오브젝트를 Scene에서 바로 보고, 선택할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Fix 버튼을 클릭하면, 해당 오브젝트의 scale값에 대하여 자동으로 Collider의 size의 음수, 양수가 결정됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;middot; 문제가 없는경우&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O1iWp/btsAF3G9wPt/KfTZB1MVR4aF9SSfmVGsNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O1iWp/btsAF3G9wPt/KfTZB1MVR4aF9SSfmVGsNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O1iWp/btsAF3G9wPt/KfTZB1MVR4aF9SSfmVGsNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO1iWp%2FbtsAF3G9wPt%2FKfTZB1MVR4aF9SSfmVGsNK%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;1003&quot; height=&quot;809&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제되는 BoxCollider가 없는경우 아무것도 나오지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ Unity Affiliate&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unity Affiliate Program 파트너로서 아래의 배너를 통해 접속하신 경우 수수료를 받을 수 있습니다.&lt;/li&gt;
&lt;li&gt;아래 배너의 에셋들은 &lt;b&gt;'실시간 무료 에셋 랭킹'&lt;/b&gt;을 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;iframe src=&quot;https://assetstore.unity.com/linkmaker/embed/list/top-free/widget-wide-light?aid=1101lvUFr&quot; style=&quot;width:860px; height:100px; border:0px;&quot;&gt;&lt;/iframe&gt;</description>
      <category>unity tools &amp;amp; functions</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/538</guid>
      <comments>https://bonnate.tistory.com/538#entry538comment</comments>
      <pubDate>Tue, 21 Nov 2023 12:55:52 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 단체사진 찍기</title>
      <link>https://bonnate.tistory.com/537</link>
      <description>&lt;figure id=&quot;og_1700474985550&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/1835#qna&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rfvfv/hyUCdCqSm5/XKXep8djxXKo0I2oYau3q1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/BsqZ6/hyUChrhisQ/DhGq54Q0OefN3kkaYGdFt0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/1835#qna&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/1835#qna&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rfvfv/hyUCdCqSm5/XKXep8djxXKo0I2oYau3q1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/BsqZ6/hyUChrhisQ/DhGq54Q0OefN3kkaYGdFt0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buL75a/btsAGYd8S6S/zcFFe0TXucgwEjisq9N9A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buL75a/btsAGYd8S6S/zcFFe0TXucgwEjisq9N9A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buL75a/btsAGYd8S6S/zcFFe0TXucgwEjisq9N9A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuL75a%2FbtsAGYd8S6S%2FzcFFe0TXucgwEjisq9N9A1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;214&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가을을&amp;nbsp;맞아&amp;nbsp;카카오프렌즈는&amp;nbsp;단체로&amp;nbsp;소풍을&amp;nbsp;떠났다.&amp;nbsp;즐거운&amp;nbsp;시간을&amp;nbsp;보내고&amp;nbsp;마지막에&amp;nbsp;단체사진을&amp;nbsp;찍기&amp;nbsp;위해&amp;nbsp;카메라&amp;nbsp;앞에&amp;nbsp;일렬로&amp;nbsp;나란히&amp;nbsp;섰다.&amp;nbsp;그런데&amp;nbsp;각자가&amp;nbsp;원하는&amp;nbsp;배치가&amp;nbsp;모두&amp;nbsp;달라&amp;nbsp;어떤&amp;nbsp;순서로&amp;nbsp;설지&amp;nbsp;정하는데&amp;nbsp;시간이&amp;nbsp;오래&amp;nbsp;걸렸다.&amp;nbsp;네오는&amp;nbsp;프로도와&amp;nbsp;나란히&amp;nbsp;서기를&amp;nbsp;원했고,&amp;nbsp;튜브가&amp;nbsp;뿜은&amp;nbsp;불을&amp;nbsp;맞은&amp;nbsp;적이&amp;nbsp;있던&amp;nbsp;라이언은&amp;nbsp;튜브에게서&amp;nbsp;적어도&amp;nbsp;세&amp;nbsp;칸&amp;nbsp;이상&amp;nbsp;떨어져서&amp;nbsp;서기를&amp;nbsp;원했다.&amp;nbsp;사진을&amp;nbsp;찍고&amp;nbsp;나서&amp;nbsp;돌아오는&amp;nbsp;길에,&amp;nbsp;무지는&amp;nbsp;모두가&amp;nbsp;원하는&amp;nbsp;조건을&amp;nbsp;만족하면서도&amp;nbsp;다르게&amp;nbsp;서는&amp;nbsp;방법이&amp;nbsp;있지&amp;nbsp;않았을까&amp;nbsp;생각해보게&amp;nbsp;되었다.&amp;nbsp;각&amp;nbsp;프렌즈가&amp;nbsp;원하는&amp;nbsp;조건을&amp;nbsp;입력으로&amp;nbsp;받았을&amp;nbsp;때&amp;nbsp;모든&amp;nbsp;조건을&amp;nbsp;만족할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;서는&amp;nbsp;경우의&amp;nbsp;수를&amp;nbsp;계산하는&amp;nbsp;프로그램을&amp;nbsp;작성해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700475001516&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;map&amp;gt;
#include &amp;lt;iostream&amp;gt;

using namespace std;

vector&amp;lt;bool&amp;gt; ch; // DFS에서 해당 원소를 사용했는가
vector&amp;lt;int&amp;gt; sel; // n번째에서 몇번 값을 사용하는가
string characters; // 캐릭터 배열
int cnt; // 사용할 개수 (캐릭터는 8개)
int answer; // 정답 누적

bool checkValid(vector&amp;lt;string&amp;gt;&amp;amp; data, map&amp;lt;char, int&amp;gt;&amp;amp; m)
{
    for(string s : data)
    {
        // 두 캐릭터 사이의 간격
        int dist = abs(m[s[0]] - m[s[2]]) - 1;
        
        // 요구 숫자
        int num = s[4] - '0';
                
        // 요구 조건
        switch(s[3])
        {
            case '=': // 간격이 같은경우?
            {
                // 간격이 다르면 false
                if(dist != num)
                    return false;
                break;
            }
            case '&amp;lt;': // 간격이 미만?
            {
                // 간격이 이상이면 false
                if(dist &amp;gt;= num)
                    return false;
                break;
            }
            case '&amp;gt;': // 간격이 초과?
            {
                // 간격이 이하이면 false
                if(dist &amp;lt;= num)
                    return false;                
                break;
            }                
        }
    }
    
    return true;
}

void DFS(int n, vector&amp;lt;string&amp;gt;&amp;amp; data)
{
    // 모두 선택했다면?
    if(n == cnt)
    {
        // map에 해당 캐릭터의 위치를 저장
        map&amp;lt;char, int&amp;gt; m;
        for(int i = 0; i &amp;lt; cnt; ++i)
            m[characters[sel[i]]] = i;
        
        // 해당 캐릭터 조합이 data 조건을 모두 만족한다면, ++answer;
        if(checkValid(data, m))
            ++answer;
    }
    else
    {
        for(int i = 0; i &amp;lt; cnt; ++i)
        {
            if(!ch[i])
            {
                sel[n] = i;
                ch[i] = true;
                DFS(n + 1, data);
                ch[i] = false;
            }
        }
    }
}

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int n, vector&amp;lt;string&amp;gt; data) {
    
    characters = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
    ch = vector&amp;lt;bool&amp;gt;(8, false);
    sel = vector&amp;lt;int&amp;gt;(8, -1);
    answer = 0;
    cnt = 8;
    DFS(0, data);
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS와 map을 이용하여 문제를 해결하였습니다.&lt;/li&gt;
&lt;li&gt;DFS를 이용하여 캐릭터 8개의 가능한 모든 배치 순열을 구합니다.&lt;/li&gt;
&lt;li&gt;하나의 캐릭터 조합이 나왔다면, map에 해당 캐릭터 글자를 기반으로 위치를 저장합니다. 이 과정은 조건계산에서 위치값을 빠르게 찾기 위해 사용합니다.&lt;/li&gt;
&lt;li&gt;checkValid 함수에서 data의 글자 규칙을 기반으로 필요한 요소들을 추출한 후 계산합니다.&lt;/li&gt;
&lt;li&gt;m[char]의 값은 현재 해당 캐릭터의 위치로, dist를 구할 수 있습니다.&lt;/li&gt;
&lt;li&gt;= &amp;lt; &amp;gt; 의 조건에 맞게 거짓이 되는 return false를 적은 후, 모든 조건을 통과하였다면 return true와 함께 answer을 1씩 올려줍니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700475885328&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;map&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace std;

vector&amp;lt;bool&amp;gt; ch; // DFS에서 해당 원소를 사용했는가
vector&amp;lt;int&amp;gt; sel; // n번째에서 몇번 값을 사용하는가
string characters; // 캐릭터 배열
int cnt; // 사용할 개수 (캐릭터는 8개)
int answer; // 정답 누적

bool checkValid(vector&amp;lt;string&amp;gt;&amp;amp; data, map&amp;lt;char, int&amp;gt;&amp;amp; m)
{
    for(string s : data)
    {
        // 두 캐릭터 사이의 간격
        int dist = abs(m[s[0]] - m[s[2]]) - 1;
        
        // 요구 숫자
        int num = s[4] - '0';
                
        // 요구 조건
        switch(s[3])
        {
            case '=': // 간격이 같은경우?
            {
                // 간격이 다르면 false
                if(dist != num)
                    return false;
                break;
            }
            case '&amp;lt;': // 간격이 미만?
            {
                // 간격이 이상이면 false
                if(dist &amp;gt;= num)
                    return false;
                break;
            }
            case '&amp;gt;': // 간격이 초과?
            {
                // 간격이 이하이면 false
                if(dist &amp;lt;= num)
                    return false;                
                break;
            }                
        }
    }
    
    return true;
}

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int n, vector&amp;lt;string&amp;gt; data) {
    
    characters = &quot;ACFJMNRT&quot;;
    ch = vector&amp;lt;bool&amp;gt;(8, false);
    sel = vector&amp;lt;int&amp;gt;(8, -1);
    answer = 0;
    cnt = 8;
    
    do {
        map&amp;lt;char, int&amp;gt; m;
        for(int i = 0; i &amp;lt; cnt; ++i)
            m[characters[i]] = i;
        
        if(checkValid(data, m))
            ++answer;
        
    } while(next_permutation(characters.begin(), characters.end()));
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS를 이용하여 직접 순열을 구하지 않고, 내장된 함수인 next_permutation 함수를 이용하여 더욱 간편하게 문제를 해결할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이 방법에서 do-while을 사용한 이유는, while문을 먼저 사용할경우, next_permutation을 먼저 호출하여 첫번째 순열부터 검사를 시작하기 때문입니다. 초기 값인 &quot;ACFJMNRT&quot;가 검사되지 않습니다.&lt;/li&gt;
&lt;li&gt;DFS를 이용하여 직접 구현하는 방식보다 성능이 좋습니다. 위 DFS를 활용한 방식은 4500ms가 나온 반면, 함수를 통해 구현한 방식은 4000ms로 약 10%의 성능 개선이 있습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>dfs</category>
      <category>해시</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/537</guid>
      <comments>https://bonnate.tistory.com/537#entry537comment</comments>
      <pubDate>Mon, 20 Nov 2023 19:13:29 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 게임 맵 최단거리</title>
      <link>https://bonnate.tistory.com/536</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROR&amp;nbsp;게임은&amp;nbsp;두&amp;nbsp;팀으로&amp;nbsp;나누어서&amp;nbsp;진행하며,&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영을&amp;nbsp;먼저&amp;nbsp;파괴하면&amp;nbsp;이기는&amp;nbsp;게임입니다.&amp;nbsp;따라서,&amp;nbsp;각&amp;nbsp;팀은&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영에&amp;nbsp;최대한&amp;nbsp;빨리&amp;nbsp;도착하는&amp;nbsp;것이&amp;nbsp;유리합니다.&lt;br /&gt;&lt;br /&gt;지금부터&amp;nbsp;당신은&amp;nbsp;한&amp;nbsp;팀의&amp;nbsp;팀원이&amp;nbsp;되어&amp;nbsp;게임을&amp;nbsp;진행하려고&amp;nbsp;합니다.&amp;nbsp;다음은&amp;nbsp;5&amp;nbsp;x&amp;nbsp;5&amp;nbsp;크기의&amp;nbsp;맵에,&amp;nbsp;당신의&amp;nbsp;캐릭터가&amp;nbsp;(행:&amp;nbsp;1,&amp;nbsp;열:&amp;nbsp;1)&amp;nbsp;위치에&amp;nbsp;있고,&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영은&amp;nbsp;(행:&amp;nbsp;5,&amp;nbsp;열:&amp;nbsp;5)&amp;nbsp;위치에&amp;nbsp;있는&amp;nbsp;경우의&amp;nbsp;예시입니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXcVO/btsAxhfZgGs/j0sEPR367Afaj8tX85kY0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXcVO/btsAxhfZgGs/j0sEPR367Afaj8tX85kY0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXcVO/btsAxhfZgGs/j0sEPR367Afaj8tX85kY0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXcVO%2FbtsAxhfZgGs%2Fj0sEPR367Afaj8tX85kY0k%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;173&quot; height=&quot;185&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;위&amp;nbsp;그림에서&amp;nbsp;검은색&amp;nbsp;부분은&amp;nbsp;벽으로&amp;nbsp;막혀있어&amp;nbsp;갈&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;길이며,&amp;nbsp;흰색&amp;nbsp;부분은&amp;nbsp;갈&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;길입니다.&amp;nbsp;캐릭터가&amp;nbsp;움직일&amp;nbsp;때는&amp;nbsp;동,&amp;nbsp;서,&amp;nbsp;남,&amp;nbsp;북&amp;nbsp;방향으로&amp;nbsp;한&amp;nbsp;칸씩&amp;nbsp;이동하며,&amp;nbsp;게임&amp;nbsp;맵을&amp;nbsp;벗어난&amp;nbsp;길은&amp;nbsp;갈&amp;nbsp;수&amp;nbsp;없습니다.&lt;br /&gt;아래&amp;nbsp;예시는&amp;nbsp;캐릭터가&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영으로&amp;nbsp;가는&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;방법을&amp;nbsp;나타내고&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;첫&amp;nbsp;번째&amp;nbsp;방법은&amp;nbsp;11개의&amp;nbsp;칸을&amp;nbsp;지나서&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영에&amp;nbsp;도착했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YsZnz/btsAFvDu2hH/c9xrdoJtLPGwWKBJDdgkcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YsZnz/btsAFvDu2hH/c9xrdoJtLPGwWKBJDdgkcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YsZnz/btsAFvDu2hH/c9xrdoJtLPGwWKBJDdgkcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYsZnz%2FbtsAFvDu2hH%2Fc9xrdoJtLPGwWKBJDdgkcK%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;173&quot; height=&quot;186&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;두&amp;nbsp;번째&amp;nbsp;방법은&amp;nbsp;15개의&amp;nbsp;칸을&amp;nbsp;지나서&amp;nbsp;상대팀&amp;nbsp;진영에&amp;nbsp;도착했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvFS8Q/btsAF28W0xW/VkLKkKyb5IpYG2KeZqNHRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvFS8Q/btsAF28W0xW/VkLKkKyb5IpYG2KeZqNHRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvFS8Q/btsAF28W0xW/VkLKkKyb5IpYG2KeZqNHRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvFS8Q%2FbtsAF28W0xW%2FVkLKkKyb5IpYG2KeZqNHRK%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;173&quot; height=&quot;184&quot; data-origin-width=&quot;173&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;위&amp;nbsp;예시에서는&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;방법보다&amp;nbsp;더&amp;nbsp;빠르게&amp;nbsp;상대팀&amp;nbsp;진영에&amp;nbsp;도착하는&amp;nbsp;방법은&amp;nbsp;없으므로,&amp;nbsp;이&amp;nbsp;방법이&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영으로&amp;nbsp;가는&amp;nbsp;가장&amp;nbsp;빠른&amp;nbsp;방법입니다.&lt;br /&gt;&lt;br /&gt;만약,&amp;nbsp;상대&amp;nbsp;팀이&amp;nbsp;자신의&amp;nbsp;팀&amp;nbsp;진영&amp;nbsp;주위에&amp;nbsp;벽을&amp;nbsp;세워두었다면&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영에&amp;nbsp;도착하지&amp;nbsp;못할&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;경우에&amp;nbsp;당신의&amp;nbsp;캐릭터는&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영에&amp;nbsp;도착할&amp;nbsp;수&amp;nbsp;없습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;171&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D3cWN/btsAyK3xIu5/FPczxIkM45ELdWJbTTTxd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D3cWN/btsAyK3xIu5/FPczxIkM45ELdWJbTTTxd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D3cWN/btsAyK3xIu5/FPczxIkM45ELdWJbTTTxd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD3cWN%2FbtsAyK3xIu5%2FFPczxIkM45ELdWJbTTTxd1%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;171&quot; height=&quot;185&quot; data-origin-width=&quot;171&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;게임&amp;nbsp;맵의&amp;nbsp;상태&amp;nbsp;maps가&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;캐릭터가&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영에&amp;nbsp;도착하기&amp;nbsp;위해서&amp;nbsp;지나가야&amp;nbsp;하는&amp;nbsp;칸의&amp;nbsp;개수의&amp;nbsp;최솟값을&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해주세요.&amp;nbsp;단,&amp;nbsp;상대&amp;nbsp;팀&amp;nbsp;진영에&amp;nbsp;도착할&amp;nbsp;수&amp;nbsp;없을&amp;nbsp;때는&amp;nbsp;-1을&amp;nbsp;return&amp;nbsp;해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700471032758&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include&amp;lt;vector&amp;gt;
#include&amp;lt;queue&amp;gt;
using namespace std;

int dx[4] { -1, 1, 0, 0};
int dy[4] { 0, 0, -1, 1};
 
int solution(vector&amp;lt;vector&amp;lt;int&amp;gt; &amp;gt; maps)
{
    int row = maps.size();
    int col = maps[0].size();
    
    vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; dist(row, vector&amp;lt;int&amp;gt;(col, -1));
    
    queue&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; q;
       
    q.push({0, 0});
    dist[0][0] = 1;
    
    while(!q.empty())
    {
        int y = q.front().first;
        int x = q.front().second;
        q.pop();
 
        for(int i = 0; i &amp;lt; 4; ++i)
        {
            int yy = y + dy[i];
            int xx = x + dx[i];
            
            if(xx == -1 || yy == -1 || xx == col || yy == row || maps[yy][xx] == 0 || dist[yy][xx] != -1)
                continue;
            
            q.push({yy, xx});
            dist[yy][xx] = dist[y][x] + 1;
        }
    }
    
    return dist[row - 1][col - 1];
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BFS를 이용하여 문제를 해결할 수 있습니다.&lt;/li&gt;
&lt;li&gt;2차원 벡터 dist를 이용하여 누적 거리를 검사합니다.&lt;/li&gt;
&lt;li&gt;현재 위치 {y, x}에서 네 방향을 검사합니다.&lt;/li&gt;
&lt;li&gt;만약 해당 위치가 map을 벗어나거나, 이미 다른 방법에 의해 도달한적이 있어 dist가 초기값인 -1이 아니라면 해당 경로로 검사하지 않습니다. 이 이유는 Queue의 특성으로, 이전에 이미 도달한 위치라면 이보다 최선의 값이 갱신될 수 없기 때문입니다.(선입선출)&lt;/li&gt;
&lt;li&gt;목적지인 {row -1, col -1}위치의 dist를 리턴합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>BFS</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/536</guid>
      <comments>https://bonnate.tistory.com/536#entry536comment</comments>
      <pubDate>Mon, 20 Nov 2023 18:06:56 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 가장 큰 정사각형 찾기</title>
      <link>https://bonnate.tistory.com/535</link>
      <description>&lt;figure id=&quot;og_1700468822093&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12905#&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HKw6Z/hyUyr98Abx/RbIYsbbQ2NPkfFgBKGh3z0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cexv40/hyUymVi8WW/JKA3JRj1jpjZ3DudKKhPJ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12905#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12905#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HKw6Z/hyUyr98Abx/RbIYsbbQ2NPkfFgBKGh3z0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cexv40/hyUymVi8WW/JKA3JRj1jpjZ3DudKKhPJ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1와&amp;nbsp;0로&amp;nbsp;채워진&amp;nbsp;표(board)가&amp;nbsp;있습니다.&amp;nbsp;표&amp;nbsp;1칸은&amp;nbsp;1&amp;nbsp;x&amp;nbsp;1&amp;nbsp;의&amp;nbsp;정사각형으로&amp;nbsp;이루어져&amp;nbsp;있습니다.&amp;nbsp;표에서&amp;nbsp;1로&amp;nbsp;이루어진&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;정사각형을&amp;nbsp;찾아&amp;nbsp;넓이를&amp;nbsp;return&amp;nbsp;하는&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해&amp;nbsp;주세요.&amp;nbsp;(단,&amp;nbsp;정사각형이란&amp;nbsp;축에&amp;nbsp;평행한&amp;nbsp;정사각형을&amp;nbsp;말합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700468851383&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 solution(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; board)
{
    int answer = 0;
    bool isZero = true;

    // 블록이 한줄만 되어있는경우?
    if(board.size() == 1 || board[0].size() == 1)
    {
        bool isEscape = true;
        
        for(int i = 0; i &amp;lt; board.size() &amp;amp;&amp;amp; isEscape; ++i)
            for(int j = 0; j &amp;lt; board[0].size(); ++j)
                if(board[i][j] == 1)
                {
                    isEscape = false;
                    break;
                }
    
        // 0만 있는 경우 0을 리턴
        if(isEscape)
            return 0;
        // 1이 하나라도 있는경우, 1리턴
        else
            return 1;
    }
    
    // dp
    for(int i = 1; i &amp;lt; board.size(); ++i)
    {
        for(int j = 1; j &amp;lt; board[0].size(); ++j)
        {
            if(board[i][j])
            {
                board[i][j] = 1 + min({board[i-1][j-1],board[i-1][j],board[i][j-1]});
                answer = max(answer, board[i][j] * board[i][j]);
            }
        }
    }
    
    // [0][0], [1][0], [0][1]의 값도 함께 검사하여 리턴
    return max({answer, board[0][0], board[0][1], board[1][0]});
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dp를 이용하여 문제를 해결합니다.&lt;/li&gt;
&lt;li&gt;2x2 영역을 차례대로 모두 검사하여 누적된 길이를 저장합니다.&lt;/li&gt;
&lt;li&gt;2x2의 영역에 대한 최소값 + 1을 저장합니다. 낮은 값이 있다면, 그 값을 기준으로 정사각형이 이루어지기 때문입니다.&lt;/li&gt;
&lt;li&gt;board[i][j]가 1이 아니라면, 빈 공간이므로 계산하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>DP</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/535</guid>
      <comments>https://bonnate.tistory.com/535#entry535comment</comments>
      <pubDate>Mon, 20 Nov 2023 17:43:49 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 배달 ⭐️</title>
      <link>https://bonnate.tistory.com/534</link>
      <description>&lt;figure id=&quot;og_1700397454385&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12978&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XFjLO/hyUyyH1kB0/XBPVg24EtrAEW75KPpQke0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/hYEEC/hyUyvLj82M/4iKgqkA1Kfj9SHi4NBUkPK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12978&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/12978&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XFjLO/hyUyyH1kB0/XBPVg24EtrAEW75KPpQke0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/hYEEC/hyUyvLj82M/4iKgqkA1Kfj9SHi4NBUkPK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N개의&amp;nbsp;마을로&amp;nbsp;이루어진&amp;nbsp;나라가&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;나라의&amp;nbsp;각&amp;nbsp;마을에는&amp;nbsp;1부터&amp;nbsp;N까지의&amp;nbsp;번호가&amp;nbsp;각각&amp;nbsp;하나씩&amp;nbsp;부여되어&amp;nbsp;있습니다.&amp;nbsp;각&amp;nbsp;마을은&amp;nbsp;양방향으로&amp;nbsp;통행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;도로로&amp;nbsp;연결되어&amp;nbsp;있는데,&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;마을&amp;nbsp;간에&amp;nbsp;이동할&amp;nbsp;때는&amp;nbsp;이&amp;nbsp;도로를&amp;nbsp;지나야&amp;nbsp;합니다.&amp;nbsp;도로를&amp;nbsp;지날&amp;nbsp;때&amp;nbsp;걸리는&amp;nbsp;시간은&amp;nbsp;도로별로&amp;nbsp;다릅니다.&amp;nbsp;현재&amp;nbsp;1번&amp;nbsp;마을에&amp;nbsp;있는&amp;nbsp;음식점에서&amp;nbsp;각&amp;nbsp;마을로&amp;nbsp;음식&amp;nbsp;배달을&amp;nbsp;하려고&amp;nbsp;합니다.&amp;nbsp;각&amp;nbsp;마을로부터&amp;nbsp;음식&amp;nbsp;주문을&amp;nbsp;받으려고&amp;nbsp;하는데,&amp;nbsp;N개의&amp;nbsp;마을&amp;nbsp;중에서&amp;nbsp;K&amp;nbsp;시간&amp;nbsp;이하로&amp;nbsp;배달이&amp;nbsp;가능한&amp;nbsp;마을에서만&amp;nbsp;주문을&amp;nbsp;받으려고&amp;nbsp;합니다.&amp;nbsp;다음은&amp;nbsp;N&amp;nbsp;=&amp;nbsp;5,&amp;nbsp;K&amp;nbsp;=&amp;nbsp;3인&amp;nbsp;경우의&amp;nbsp;예시입니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9viNv/btsAyWn5nwp/885hGaOwFXRsmkr39JpoC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9viNv/btsAyWn5nwp/885hGaOwFXRsmkr39JpoC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9viNv/btsAyWn5nwp/885hGaOwFXRsmkr39JpoC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9viNv%2FbtsAyWn5nwp%2F885hGaOwFXRsmkr39JpoC0%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;250&quot; height=&quot;212&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;위&amp;nbsp;그림에서&amp;nbsp;1번&amp;nbsp;마을에&amp;nbsp;있는&amp;nbsp;음식점은&amp;nbsp;[1,&amp;nbsp;2,&amp;nbsp;4,&amp;nbsp;5]&amp;nbsp;번&amp;nbsp;마을까지는&amp;nbsp;3&amp;nbsp;이하의&amp;nbsp;시간에&amp;nbsp;배달할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;그러나&amp;nbsp;3번&amp;nbsp;마을까지는&amp;nbsp;3시간&amp;nbsp;이내로&amp;nbsp;배달할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;경로가&amp;nbsp;없으므로&amp;nbsp;3번&amp;nbsp;마을에서는&amp;nbsp;주문을&amp;nbsp;받지&amp;nbsp;않습니다.&amp;nbsp;따라서&amp;nbsp;1번&amp;nbsp;마을에&amp;nbsp;있는&amp;nbsp;음식점이&amp;nbsp;배달&amp;nbsp;주문을&amp;nbsp;받을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;마을은&amp;nbsp;4개가&amp;nbsp;됩니다. &lt;br /&gt;마을의&amp;nbsp;개수&amp;nbsp;N,&amp;nbsp;각&amp;nbsp;마을을&amp;nbsp;연결하는&amp;nbsp;도로의&amp;nbsp;정보&amp;nbsp;road,&amp;nbsp;음식&amp;nbsp;배달이&amp;nbsp;가능한&amp;nbsp;시간&amp;nbsp;K가&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;음식&amp;nbsp;주문을&amp;nbsp;받을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;마을의&amp;nbsp;개수를&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;적용&amp;nbsp;시점:&amp;nbsp;음의&amp;nbsp;가중치를&amp;nbsp;갖지&amp;nbsp;않는&amp;nbsp;그래프에&amp;nbsp;적합합니다.&amp;nbsp;각&amp;nbsp;간선의&amp;nbsp;가중치는&amp;nbsp;양수여야&amp;nbsp;합니다. &lt;br /&gt;동작&amp;nbsp;방식:&amp;nbsp;시작&amp;nbsp;노드로부터&amp;nbsp;다른&amp;nbsp;모든&amp;nbsp;노드까지의&amp;nbsp;최단&amp;nbsp;경로를&amp;nbsp;찾을&amp;nbsp;때&amp;nbsp;사용됩니다. &lt;br /&gt;작동&amp;nbsp;방식:&amp;nbsp;각&amp;nbsp;노드마다&amp;nbsp;최단&amp;nbsp;거리를&amp;nbsp;저장하면서,&amp;nbsp;해당&amp;nbsp;노드와&amp;nbsp;연결된&amp;nbsp;간선을&amp;nbsp;탐색하며&amp;nbsp;최단&amp;nbsp;거리를&amp;nbsp;업데이트합니다.&amp;nbsp;이를&amp;nbsp;위해&amp;nbsp;우선순위&amp;nbsp;큐를&amp;nbsp;사용하여&amp;nbsp;현재까지의&amp;nbsp;최단&amp;nbsp;거리를&amp;nbsp;계산하여&amp;nbsp;처리합니다. &lt;br /&gt;시간&amp;nbsp;복잡도:&amp;nbsp;힙(우선순위&amp;nbsp;큐)을&amp;nbsp;사용하므로&amp;nbsp;O((V&amp;nbsp;+&amp;nbsp;E)logV)의&amp;nbsp;시간&amp;nbsp;복잡도를&amp;nbsp;가집니다.&amp;nbsp;(V:&amp;nbsp;노드&amp;nbsp;수,&amp;nbsp;E:&amp;nbsp;간선&amp;nbsp;수)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;벨만-포드 알고리즘&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용&amp;nbsp;시점:&amp;nbsp;음의&amp;nbsp;가중치를&amp;nbsp;포함하거나&amp;nbsp;음수&amp;nbsp;사이클이&amp;nbsp;있는&amp;nbsp;경우에&amp;nbsp;사용됩니다.&amp;nbsp;음수&amp;nbsp;사이클이&amp;nbsp;없는&amp;nbsp;경우에도&amp;nbsp;사용&amp;nbsp;가능하지만,&amp;nbsp;다익스트라보다&amp;nbsp;느린&amp;nbsp;성능을&amp;nbsp;보입니다. &lt;br /&gt;동작&amp;nbsp;방식:&amp;nbsp;모든&amp;nbsp;간선을&amp;nbsp;순회하면서&amp;nbsp;최단&amp;nbsp;경로를&amp;nbsp;찾습니다.&amp;nbsp;각&amp;nbsp;노드를&amp;nbsp;반복해서&amp;nbsp;거치며&amp;nbsp;최단&amp;nbsp;거리를&amp;nbsp;업데이트합니다.&amp;nbsp;음수&amp;nbsp;사이클을&amp;nbsp;탐지할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;작동&amp;nbsp;방식:&amp;nbsp;간선을&amp;nbsp;모든&amp;nbsp;노드&amp;nbsp;수&amp;nbsp;-&amp;nbsp;1만큼&amp;nbsp;반복하여&amp;nbsp;최단&amp;nbsp;거리를&amp;nbsp;찾습니다.&amp;nbsp;모든&amp;nbsp;노드&amp;nbsp;쌍에&amp;nbsp;대한&amp;nbsp;최단&amp;nbsp;거리를&amp;nbsp;확인하기&amp;nbsp;위해&amp;nbsp;사용될&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;시간&amp;nbsp;복잡도:&amp;nbsp;O(VE)의&amp;nbsp;시간&amp;nbsp;복잡도를&amp;nbsp;가집니다.&amp;nbsp;(V:&amp;nbsp;노드&amp;nbsp;수,&amp;nbsp;E:&amp;nbsp;간선&amp;nbsp;수)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;어느 시점에서 사용하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다익스트라&amp;nbsp;알고리즘은&amp;nbsp;음의&amp;nbsp;가중치가&amp;nbsp;없는&amp;nbsp;그래프에서&amp;nbsp;최단&amp;nbsp;거리를&amp;nbsp;찾을&amp;nbsp;때&amp;nbsp;적합합니다. &lt;br /&gt;벨만-포드&amp;nbsp;알고리즘은&amp;nbsp;음의&amp;nbsp;가중치가&amp;nbsp;있거나&amp;nbsp;음수&amp;nbsp;사이클을&amp;nbsp;탐지해야&amp;nbsp;할&amp;nbsp;때&amp;nbsp;사용됩니다.&amp;nbsp;또한,&amp;nbsp;모든&amp;nbsp;노드&amp;nbsp;쌍에&amp;nbsp;대한&amp;nbsp;최단&amp;nbsp;경로를&amp;nbsp;확인할&amp;nbsp;때에도&amp;nbsp;사용될&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;요약하자면,&amp;nbsp;음의&amp;nbsp;가중치가&amp;nbsp;없는&amp;nbsp;경우에는&amp;nbsp;다익스트라&amp;nbsp;알고리즘이&amp;nbsp;효율적입니다.&amp;nbsp;그러나&amp;nbsp;음수&amp;nbsp;가중치가&amp;nbsp;있거나&amp;nbsp;음수&amp;nbsp;사이클을&amp;nbsp;확인해야&amp;nbsp;하는&amp;nbsp;경우에는&amp;nbsp;벨만-포드&amp;nbsp;알고리즘이&amp;nbsp;더&amp;nbsp;적합합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700397306089&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;climits&amp;gt;
using namespace std;

// 간선 정보
struct Edge {
    int from, to, weight;
};

int solution(int N, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; road, int K) {
    vector&amp;lt;Edge&amp;gt; edges;
    vector&amp;lt;int&amp;gt; dist(N + 1, INT_MAX);

    // 그래프 정보 초기화 (무방향 그래프로 양측 노드에 삽입)
    for (vector&amp;lt;int&amp;gt; r : road) {
        edges.push_back({ r[0], r[1], r[2] });
        edges.push_back({ r[1], r[0], r[2] });
    }

    // 시작 노드의 거리는 0
    dist[1] = 0; 

    // 벨만-포드 알고리즘
    // 모든 노드에 대한 가장 짧은 경로는 노드의 수보다 하나 작은 간선의 수(N-1)로 이루어지기에 N-1번 반복
    for (int i = 0; i &amp;lt; N - 1; ++i)
        for (Edge edge : edges) 
        {
            int from = edge.from;
            int to = edge.to;
            int weight = edge.weight;
    
            // 아직 다른 간선에 의해 비용이 계산되지 않은경우에는 무시
            if(dist[from] == INT_MAX)
                continue;
            
            // 현재 위치의 비용(dist[from]) + 다음 위치까지의 비용(weight)이 저장된 비용(dist[to])보다 작으면 갱신
            dist[to] = min(dist[to], dist[from] + weight);
        }
    
    // 정답 구하기
    int answer = 0;
    for(int i = 1; i &amp;lt;= N; ++i)
        if(dist[i] &amp;lt;= K)
            ++answer;

    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1702208509524&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;climits&amp;gt;
using namespace std;

struct Edge {
    int from, to, weight;
};

int solution(int N, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; road, int K) {

    vector&amp;lt;Edge&amp;gt; graph;
    for(vector&amp;lt;int&amp;gt;&amp;amp; v : road)
    {
        graph.push_back({v[0], v[1], v[2]});
        graph.push_back({v[1], v[0], v[2]});
    }
        
    vector&amp;lt;int&amp;gt; dist(N + 1, INT_MAX);
    
    dist[1] = 0; // 시작 지점은 거리가 0으로 시작

    // N-1만큼 반복한 후, 음의 사이클을 검사하기위해 한번 더 검사(&amp;lt;=로 표현)
    for (int i = 0; i &amp;lt;= N - 1; ++i) {
        for (Edge&amp;amp; edge : graph) {
            int from = edge.from;
            int to = edge.to;
            int weight = edge.weight;
            
            if(dist[from] == INT_MAX)
                continue;
            
            // 음의 사이클을 검사
            // N-1번째에도 dist[from] + weight &amp;lt; dist[to]가 참이라면, 음의 사이클이 존재
            if(i == N - 1 &amp;amp;&amp;amp; dist[from] + weight &amp;lt; dist[to])
                return -1;
            
            dist[to] = min(dist[to], dist[from] + weight);
        }
    }

    // 정답 구하기
    int answer = 0;
    for(int i = 1; i &amp;lt;= N; ++i)
        if(dist[i] &amp;lt;= K)
            ++answer;        

    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;1960&quot; data-origin-height=&quot;1274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cplwGv/btsBKgrujYS/aLajJt9pKUi8sMYxknpJOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cplwGv/btsBKgrujYS/aLajJt9pKUi8sMYxknpJOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cplwGv/btsBKgrujYS/aLajJt9pKUi8sMYxknpJOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcplwGv%2FbtsBKgrujYS%2FaLajJt9pKUi8sMYxknpJOk%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;1960&quot; height=&quot;1274&quot; data-origin-width=&quot;1960&quot; data-origin-height=&quot;1274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벨만 포드 알고리즘을 활용하여 문제를 해결하였습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700398469265&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;
#include &amp;lt;climits&amp;gt;
using namespace std;

// 간선 정보
struct Edge {
    int to, weight;
};

int solution(int N, vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; road, int K) {
    vector&amp;lt;vector&amp;lt;Edge&amp;gt;&amp;gt; graph(N + 1);
    vector&amp;lt;int&amp;gt; dist(N + 1, INT_MAX);

    // 그래프 정보 초기화 (양방향)
    for (vector&amp;lt;int&amp;gt; r : road) {
        int from = r[0];
        int to = r[1];
        int weight = r[2];
        graph[from].push_back({to, weight});
        graph[to].push_back({from, weight});
    }

    // 우선순위 큐를 이용한 다익스트라 알고리즘
    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; pq;

    dist[1] = 0; // 시작 노드의 거리는 0
    pq.push({0, 1}); // {거리, 노드} 쌍을 우선순위 큐에 삽입

    while (!pq.empty()) {
        int current_distance = pq.top().first;
        int current_node = pq.top().second;
        pq.pop();

        // 현재 노드에서 갈 수 있는 모든 노드들에 대해 최단 거리 갱신
        for (Edge&amp;amp; e : graph[current_node]) {
            int next_node = e.to;
            int weight = e.weight;

            if (dist[next_node] &amp;gt; current_distance + weight) {
                dist[next_node] = current_distance + weight;
                pq.push({dist[next_node], next_node});
            }
        }
    }

    // 정답 구하기
    int answer = 0;
    for (int i = 1; i &amp;lt;= N; ++i)
        if (dist[i] &amp;lt;= K)
            ++answer;

    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1702207809433&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;
#include &amp;lt;climits&amp;gt;
using namespace std;

int solution(int N, vector&amp;lt;vector&amp;lt;int&amp;gt; &amp;gt; road, int K) {

    vector&amp;lt;vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt; graph(N + 1, vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;());
    for(vector&amp;lt;int&amp;gt;&amp;amp; v : road)
    {
        graph[v[0]].push_back({v[1], v[2]});
        graph[v[1]].push_back({v[0], v[2]});
    }
    
    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; pq;
    vector&amp;lt;int&amp;gt; dist(N + 1, INT_MAX);
    
    pq.push({0, 1});
    dist[1] = 0;
    while(!pq.empty())
    {
        int currentDistance = pq.top().first; // 현재 노드까지의 누적 가중치
        int currentNode = pq.top().second; // 현재 노드 위치
        
        pq.pop();
        
        // 현재 노드를 기준으로 갈 수 있는 모든 경로를 반복
        for(pair&amp;lt;int, int&amp;gt;&amp;amp; p : graph[currentNode])
        {
            int nextNode = p.first; // 다음 노드의 번호
            int weight = p.second; // 다음 노드로 가기까지 가중치
        
            // 현재 노드까지의 가중치 + 다음 노드 가중치가 저장된 값보다 더 작다면?
            if(dist[nextNode] &amp;gt; currentDistance + weight)
            {
                dist[nextNode] = currentDistance + weight; // 값을 갱신
                pq.push({dist[nextNode], nextNode}); // 큐에 가중치와 다음노드 번호를 삽입
            }
        }
    }
    
    // 정답 구하기
    int answer = 0;
    for (int i = 1; i &amp;lt;= N; ++i)
        if (dist[i] &amp;lt;= K)
            ++answer;
    
    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;1962&quot; data-origin-height=&quot;1276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqiBfl/btsBG3e6LtB/lBatv0uLluzqre4R9HlEAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqiBfl/btsBG3e6LtB/lBatv0uLluzqre4R9HlEAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqiBfl/btsBG3e6LtB/lBatv0uLluzqre4R9HlEAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqiBfl%2FbtsBG3e6LtB%2FlBatv0uLluzqre4R9HlEAK%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;1962&quot; height=&quot;1276&quot; data-origin-width=&quot;1962&quot; data-origin-height=&quot;1276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다익스트라 알고리즘을 이용하여 문제를 해결하였습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>다익스트라</category>
      <category>벨만포드</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/534</guid>
      <comments>https://bonnate.tistory.com/534#entry534comment</comments>
      <pubDate>Sun, 19 Nov 2023 21:37:41 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] [1차] 프렌즈4블록</title>
      <link>https://bonnate.tistory.com/533</link>
      <description>&lt;figure id=&quot;og_1700394922809&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/17679#qna&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bEvzeL/hyUysnuxOY/C3OxiKAqkqu7QRokktKaa0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cmlK0W/hyUymU6RAI/596KmKehwpKjCAUebs7lQK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/17679#qna&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/17679#qna&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bEvzeL/hyUysnuxOY/C3OxiKAqkqu7QRokktKaa0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cmlK0W/hyUymU6RAI/596KmKehwpKjCAUebs7lQK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;개발&amp;nbsp;업무를&amp;nbsp;맡게&amp;nbsp;되었다.&amp;nbsp;이번에&amp;nbsp;출시할&amp;nbsp;게임&amp;nbsp;제목은&amp;nbsp;&quot;프렌즈4블록&quot;. &lt;br /&gt;같은&amp;nbsp;모양의&amp;nbsp;카카오프렌즈&amp;nbsp;블록이&amp;nbsp;2 &amp;times;2&amp;nbsp;형태로&amp;nbsp;4개가&amp;nbsp;붙어있을&amp;nbsp;경우&amp;nbsp;사라지면서&amp;nbsp;점수를&amp;nbsp;얻는&amp;nbsp;게임이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pang1.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dD2YTL/btsAzB43cNZ/dkOKFHA9uuKJGYZFQrHOKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dD2YTL/btsAzB43cNZ/dkOKFHA9uuKJGYZFQrHOKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dD2YTL/btsAzB43cNZ/dkOKFHA9uuKJGYZFQrHOKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdD2YTL%2FbtsAzB43cNZ%2FdkOKFHA9uuKJGYZFQrHOKK%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;350&quot; height=&quot;343&quot; data-filename=&quot;pang1.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;만약 판이 위와 같이 주어질 경우, 라이언이 2&amp;times;2로 배치된 7개 블록과 콘이 2&amp;times;2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2&amp;times;2에 포함될 수 있으며, 지워지는 조건에 만족하는 2&amp;times;2 모양이 여러 개 있다면 한꺼번에 지워진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pang2.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhfX3l/btsAxfocWVJ/pkhTKcK6ZEN3xjDS5mDhTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhfX3l/btsAxfocWVJ/pkhTKcK6ZEN3xjDS5mDhTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhfX3l/btsAxfocWVJ/pkhTKcK6ZEN3xjDS5mDhTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhfX3l%2FbtsAxfocWVJ%2FpkhTKcK6ZEN3xjDS5mDhTk%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;350&quot; height=&quot;345&quot; data-filename=&quot;pang2.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pang3.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oKU5A/btsAxgtRwzK/kjYa9n252tpKM45Ve9RwHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oKU5A/btsAxgtRwzK/kjYa9n252tpKM45Ve9RwHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oKU5A/btsAxgtRwzK/kjYa9n252tpKM45Ve9RwHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoKU5A%2FbtsAxgtRwzK%2FkjYa9n252tpKM45Ve9RwHK%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;350&quot; height=&quot;343&quot; data-filename=&quot;pang3.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;343&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;만약 빈 공간을 채운 후에 다시 2&amp;times;2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pang4.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T9gcB/btsAx1DruEL/bVPU51Cu9YHFG6SMZO9L3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T9gcB/btsAx1DruEL/bVPU51Cu9YHFG6SMZO9L3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T9gcB/btsAx1DruEL/bVPU51Cu9YHFG6SMZO9L3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT9gcB%2FbtsAx1DruEL%2FbVPU51Cu9YHFG6SMZO9L3k%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;350&quot; height=&quot;345&quot; data-filename=&quot;pang4.png&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;TTTANT &lt;br /&gt;RRFACC &lt;br /&gt;RRRFCC &lt;br /&gt;TRRRAA &lt;br /&gt;TTMMMF &lt;br /&gt;TMMTTJ&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;각&amp;nbsp;문자는&amp;nbsp;라이언(R),&amp;nbsp;무지(M),&amp;nbsp;어피치(A),&amp;nbsp;프로도(F),&amp;nbsp;네오(N),&amp;nbsp;튜브(T),&amp;nbsp;제이지(J),&amp;nbsp;콘(C)을&amp;nbsp;의미한다 &lt;br /&gt;&lt;br /&gt;입력으로&amp;nbsp;블록의&amp;nbsp;첫&amp;nbsp;배치가&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;지워지는&amp;nbsp;블록은&amp;nbsp;모두&amp;nbsp;몇&amp;nbsp;개인지&amp;nbsp;판단하는&amp;nbsp;프로그램을&amp;nbsp;제작하라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700394928113&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;set&amp;gt;

using namespace std;

set&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; s;

void removeRect(vector&amp;lt;string&amp;gt;&amp;amp; board, int row, int col)
{
    set&amp;lt;char&amp;gt; m;
    
    m.insert(board[row][col]);
    m.insert(board[row][col + 1]);
    m.insert(board[row + 1][col]);
    m.insert(board[row + 1][col + 1]);
    
    if(m.size() == 1)
    {
        if(m.find('-') != m.end())
            return;
        
        s.insert({row, col});
        s.insert({row, col + 1});
        s.insert({row + 1, col});
        s.insert({row + 1, col + 1});
    }
}

void print(vector&amp;lt;string&amp;gt;&amp;amp; board);

void clearRect(vector&amp;lt;string&amp;gt;&amp;amp; board)
{
    for(pair&amp;lt;int, int&amp;gt; p : s)
        board[p.first][p.second] = '-';
    
    s.clear();
    
    // print(board);
    
    for(int i = 0; i &amp;lt; board[i].size(); ++i)
    {
        for(int j = board.size() - 1; j &amp;gt;= 1; --j)
        {
            if(board[j][i] == '-')
            {
                for(int k = j - 1; k &amp;gt;= 0; --k)
                {
                    if(board[k][i] != '-')
                    {
                        board[j][i] = board[k][i];
                        board[k][i] = '-';
                        break;
                    }
                }
            }
        }
    }
}

void print(vector&amp;lt;string&amp;gt;&amp;amp; board)
{
    for(int i = 0 ; i &amp;lt; board.size(); ++i)
    {
        for(int j = 0; j &amp;lt; board[0].size(); ++j)
        {
            cout&amp;lt;&amp;lt;board[i][j];
        }
        
        cout&amp;lt;&amp;lt;endl;
    }
    
    cout&amp;lt;&amp;lt;endl;
}

int solution(int m, int n, vector&amp;lt;string&amp;gt; board) {
    int answer = 0;
    
    while(1)
    {
        for(int i = 0; i &amp;lt; m - 1; ++i)
            for(int j = 0; j &amp;lt; n - 1; ++j)
                removeRect(board, i, j);
        
        if(s.empty())
            break;
        
        answer += s.size();
        clearRect(board);
        // print(board);
    }
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;set을 활용하여 문제를 해결하였습니다.&lt;/li&gt;
&lt;li&gt;매번 2x2 영역이 같은지 removeRect에서 검사합니다. 만약 네 블록이 모두 같은 글자로 되어있다면, set에 삽입합니다. set에 삽입할 때 중복값을 제거할 수 있습니다.&lt;/li&gt;
&lt;li&gt;clearRect에서 글자를 제거한 후, 빈 공간을 위 블록으로 채웁니다.&lt;/li&gt;
&lt;li&gt;위 과정을 반복하여 set이 비어있을 때(더 이상 2x2가 없음) 종료합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/533</guid>
      <comments>https://bonnate.tistory.com/533#entry533comment</comments>
      <pubDate>Sun, 19 Nov 2023 20:57:24 +0900</pubDate>
    </item>
    <item>
      <title>[C++] 코딩테스트 유용한 함수 및 표현 정리  </title>
      <link>https://bonnate.tistory.com/532</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;C++을 이용하여 코딩테스트를 볼 때 유용한 STL 함수 및 표현을 정리합니다. 이 글은 지속적으로 업데이트되어 추가 될 예정입니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문자열을 대소문자로 변환&lt;/h2&gt;
&lt;pre id=&quot;code_1700321230188&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;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace std;

int main()
{
	string s = &quot;AbCdEfGhI&quot;;

	transform(s.begin(), s.end(), s.begin(), [](char c)
		{
			return toupper(c);
		});

	cout &amp;lt;&amp;lt; s &amp;lt;&amp;lt; endl;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;std::transform은&amp;nbsp;C++&amp;nbsp;STL(표준&amp;nbsp;템플릿&amp;nbsp;라이브러리)에서&amp;nbsp;제공되는&amp;nbsp;알고리즘&amp;nbsp;중&amp;nbsp;하나로,&amp;nbsp;순차&amp;nbsp;컨테이너의&amp;nbsp;요소를&amp;nbsp;변환하는&amp;nbsp;함수입니다.&amp;nbsp;주로&amp;nbsp;범위&amp;nbsp;기반&amp;nbsp;알고리즘&amp;nbsp;중&amp;nbsp;하나로&amp;nbsp;사용됩니다.&lt;/li&gt;
&lt;li&gt;s.begin()과&amp;nbsp;s.end()는&amp;nbsp;문자열&amp;nbsp;s의&amp;nbsp;시작과&amp;nbsp;끝을&amp;nbsp;가리키는&amp;nbsp;반복자(iterator)입니다.&lt;/li&gt;
&lt;li&gt;세 번째 인자인 s.begin()은 출력 대상 범위의 시작 지점을 나타냅니다. 여기서는 변환된 값이 다시 s에 저장되기 때문에 입력과 출력이 같은 범위입니다.&lt;/li&gt;
&lt;li&gt;네&amp;nbsp;번째&amp;nbsp;인자는&amp;nbsp;변환을&amp;nbsp;수행하는&amp;nbsp;함수자(람다&amp;nbsp;함수)입니다.&amp;nbsp;[](char&amp;nbsp;c)&amp;nbsp;{&amp;nbsp;return&amp;nbsp;toupper(c);&amp;nbsp;}는&amp;nbsp;입력으로&amp;nbsp;받은&amp;nbsp;문자&amp;nbsp;c를&amp;nbsp;toupper&amp;nbsp;함수를&amp;nbsp;사용하여&amp;nbsp;대문자로&amp;nbsp;변환한&amp;nbsp;값을&amp;nbsp;반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;문자열에서 숫자만 추출&lt;/h2&gt;
&lt;pre id=&quot;code_1700322307389&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;

using namespace std;

int main() {
	string str = &quot;abc123def456ghi&quot;;

	string numbers;

	// 문자열에서 숫자만 추출하여 numbers에 저장
	for (char c : str)
		if (isdigit(c))
			numbers += c;

	// 추출된 숫자 출력
	cout &amp;lt;&amp;lt; &quot;추출된 숫자: &quot; &amp;lt;&amp;lt; numbers &amp;lt;&amp;lt; endl;

	// string을 int로 변환
	stoi(numbers);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 문자열에서 숫자만 추출합니다.&lt;/li&gt;
&lt;li&gt;isdigit라는 함수를 이용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700322392880&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string&amp;gt;

using namespace std;

int main() {
	string str = &quot;abc123def456ghi&quot;;

	string numbers;

	// 문자열에서 숫자만 추출하여 numbers에 저장
	for (char c : str)
		if (c &amp;gt;= '0' &amp;amp;&amp;amp; c &amp;lt;= '9')
			numbers += c;

	// 추출된 숫자 출력
	cout &amp;lt;&amp;lt; &quot;추출된 숫자: &quot; &amp;lt;&amp;lt; numbers &amp;lt;&amp;lt; endl;

	// string을 int로 변환
	stoi(numbers);

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;c++ 버전으로 인해 함수를 사용할 수 없는경우, if (c &amp;gt;= '0' &amp;amp;&amp;amp; c &amp;lt;= '9')를 이용하여 직접 구현할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;vector에서 값을 찾아 제거&lt;/h2&gt;
&lt;pre id=&quot;code_1700322580509&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() {
	vector&amp;lt;string&amp;gt; v = { &quot;apple&quot;, &quot;orange&quot;, &quot;banana&quot;, &quot;orange&quot;, &quot;grape&quot; };

	string _s = &quot;orange&quot;;

	// 벡터에서 특정 값 찾기
	auto it = find(v.begin(), v.end(), _s);

	if (it != v.end()) {
		// 값을 찾았으면 제거
		v.erase(it);
	}

	// 제거 후 벡터 출력
	for (const auto&amp;amp; element : v) {
		cout &amp;lt;&amp;lt; element &amp;lt;&amp;lt; &quot; &quot;;
	}
	cout &amp;lt;&amp;lt; endl;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;std::find&amp;nbsp;함수를&amp;nbsp;사용하여&amp;nbsp;벡터&amp;nbsp;v에서&amp;nbsp;_s라는&amp;nbsp;값을&amp;nbsp;찾습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;만약&amp;nbsp;해당&amp;nbsp;값이&amp;nbsp;벡터&amp;nbsp;안에&amp;nbsp;존재하면,&amp;nbsp;std::erase&amp;nbsp;함수를&amp;nbsp;사용하여&amp;nbsp;해당&amp;nbsp;값을&amp;nbsp;제거합니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;std::vector&amp;lt;string&amp;gt;::iterator 타입을 직접 명시하지 않고 auto를 사용하면 더욱 편리하게 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;vector의 배열 회전&lt;/h2&gt;
&lt;pre id=&quot;code_1700322843808&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() {
	vector&amp;lt;int&amp;gt; v{ 0, 1, 2, 3, 4, 5 };
	int depth = 1;

	for (int n : v)
		cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; &quot; &quot;;
	cout &amp;lt;&amp;lt; endl;

	rotate(v.begin(), v.begin() + depth, v.end()); // 인덱스가 감소하는 방향으로 depth만큼 회전

	for (int n : v)
		cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; &quot; &quot;;
	cout &amp;lt;&amp;lt; endl;

	rotate(v.rbegin(), v.rbegin() + depth, v.rend()); // 인덱스가 증가하는 방향으로 depth만큼 회전

	for (int n : v)
		cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; &quot; &quot;;
	cout &amp;lt;&amp;lt; endl;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rotate 함수를 이용하여 배열을 회전시킬 수 있습니다.&lt;/li&gt;
&lt;li&gt;v.begin()을 시작으로 사용하면, 인덱스가 감소하는 방향으로 회전시킬 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;{0 1 2 3 4 5} -&amp;gt; {1 2 3 4 5 0}&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;v.rbegin()을 시작으로 사용하면, 인덱스가 증가하는 방향으로 회전시킬 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;{1 2 3 4 5 0} -&amp;gt; {0 1 2 3 4 5}&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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_1700323649025&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() {
	vector&amp;lt;int&amp;gt; v = { 1, 2, 3, 3, 3, 3, 5, 6, 7, 8, 9 };

	bool found = binary_search(v.begin(), v.end(), 3);

	cout &amp;lt;&amp;lt; &quot;기존 벡터 값: &quot;;
	for (int n : v)
		cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; &quot; &quot;;
	cout &amp;lt;&amp;lt; endl;

	if (found) {
		cout &amp;lt;&amp;lt; &quot;3이 존재함&quot; &amp;lt;&amp;lt; endl;
	}
	else {
		cout &amp;lt;&amp;lt; &quot;3이 존재하지 않음!&quot; &amp;lt;&amp;lt; endl;
	}

	auto it_lower = lower_bound(v.begin(), v.end(), 3);

	if (it_lower != v.end()) {
		printf(&quot;3 이상이 처음으로 나타나는 인덱스 위치: %d, 값: %d\n&quot;, distance(v.begin(), it_lower), *it_lower);
	}
	else {
		cout &amp;lt;&amp;lt; &quot;3 이상이 나타나는 위치를 찾지 못함!&quot; &amp;lt;&amp;lt; endl;
	}

	auto it_upper = upper_bound(v.begin(), v.end(), 3);

	if (it_upper != v.end()) {
		printf(&quot;3보다 큰 값이 처음으로 나타나는 인덱스 위치: %d, 값: %d\n&quot;, distance(v.begin(), it_upper), *it_upper);
	}
	else {
		cout &amp;lt;&amp;lt; &quot;3보다 큰 값이 나타나는 위치를 찾지 못함!&quot; &amp;lt;&amp;lt; endl;
	}

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1700323844777&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;기존 벡터 값: 1 2 3 3 3 3 5 6 7 8 9
3이 존재함
3 이상이 처음으로 나타나는 인덱스 위치: 2, 값: 3
3보다 큰 값이 처음으로 나타나는 인덱스 위치: 6, 값: 5&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;std::binary_search 함수: 주어진 값이 정렬된 범위에 존재하는지 확인합니다.&lt;/li&gt;
&lt;li&gt;std::lower_bound 함수: 주어진 값 이상이 처음으로 나타나는 위치를 찾습니다.&lt;/li&gt;
&lt;li&gt;std::upper_bound&amp;nbsp;함수:&amp;nbsp;주어진&amp;nbsp;값보다&amp;nbsp;큰&amp;nbsp;값이&amp;nbsp;처음으로&amp;nbsp;나타나는&amp;nbsp;위치를&amp;nbsp;찾습니다.&lt;/li&gt;
&lt;li&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: #ef5369;&quot;&gt;&lt;b&gt;정렬된 데이터: 이분 탐색은 정렬된 데이터에서 사용됩니다. 데이터가 정렬되어 있지 않으면 이분 탐색을 적용할 수 없습니다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;가능한한 중복되지 않는 키 값: 중복된 값이 많을수록 이분 탐색의 성능이 저하될 수 있습니다. 중복을 줄이는 것이 유리합니다.&lt;/li&gt;
&lt;li&gt;인덱스 기반 접근이 가능한 데이터 구조: 이분 탐색은 인덱스 기반으로 작동합니다. 배열 또는 벡터와 같이 인덱스로 원소에 접근할 수 있는 데이터 구조에서 사용됩니다.&lt;/li&gt;
&lt;li&gt;순차적인 데이터: 이분 탐색은 일반적으로 순차적인 데이터에서 사용됩니다. 이는 특정 요소를 찾는 것이지 임의의 요소를 검색하는 것이 아닙니다.&lt;/li&gt;
&lt;li&gt;탐색&amp;nbsp;대상의&amp;nbsp;크기가&amp;nbsp;충분히&amp;nbsp;크거나&amp;nbsp;탐색&amp;nbsp;빈도가&amp;nbsp;높을&amp;nbsp;때&amp;nbsp;유용:&amp;nbsp;데이터&amp;nbsp;크기가&amp;nbsp;작거나&amp;nbsp;탐색&amp;nbsp;빈도가&amp;nbsp;낮은&amp;nbsp;경우에는&amp;nbsp;선형&amp;nbsp;탐색과&amp;nbsp;비교해&amp;nbsp;별다른&amp;nbsp;이점을&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;우선순위 큐는 기본으로 생성하면 내림차순으로 되어있습니다. { 9, 8, 7 .... }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성을 할 때, 추가 매개변수를 통해 오름차순으로 설정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700401731335&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// pair&amp;lt;int, int&amp;gt;를 오름차순
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; pqASC;

// int를 오름차순
priority_queue &amp;lt;int, vector&amp;lt;int&amp;gt;, greater&amp;lt;int&amp;gt;&amp;gt; pqIntASC;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pair&amp;lt;int, int&amp;gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우선순위 큐에 저장될 요소의 형식을 지정합니다. 여기서는 int형 두 개가 묶인 쌍(pair)으로 이루어진 요소입니다. 첫 번째 int는 거리를, 두 번째 int는 노드 번호를 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;priority_queue에서 내부적으로 사용되는 컨테이너 타입을 지정합니다. priority_queue는 내부적으로 이 컨테이너를 사용하여 요소를 저장합니다. 여기서는 pair&amp;lt;int, int&amp;gt;를 저장하는 vector가 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;greater&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비교 함수 객체를 지정하는 부분입니다. greater는 STL 라이브러리에 내장된 비교 함수 객체로, 두 요소를 비교할 때 첫 번째 요소가 두 번째 요소보다 작은지 여부를 확인하여 우선순위를 정합니다.&lt;/li&gt;
&lt;li&gt;이 경우에는 내림차순으로 정렬하도록 합니다.&lt;/li&gt;
&lt;li&gt;greater의 반대는 less입니다. (오름차순)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700401702512&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;

int main()
{
	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; pqASC;
	for (int i = 0; i &amp;lt; 10; ++i)
	{
		pqASC.push({ rand() % 1000, rand() % 1000 });
	}

	for (int i = 0; i &amp;lt; 10; ++i)
	{
		pqASC.push({ 500, rand() % 1000 });
	}

	cout &amp;lt;&amp;lt; &quot;오름차순&quot; &amp;lt;&amp;lt; endl;
	while (!pqASC.empty())
	{
		printf(&quot;%d %d\n&quot;, pqASC.top().first, pqASC.top().second);
		pqASC.pop();
	}

	priority_queue &amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; pqDESC;
	for (int i = 0; i &amp;lt; 10; ++i)
	{
		pqDESC.push({ rand() % 1000, rand() % 1000 });
	}

	for (int i = 0; i &amp;lt; 10; ++i)
	{
		pqDESC.push({ 500, rand() % 1000 });
	}

	cout &amp;lt;&amp;lt; &quot;내림차순&quot; &amp;lt;&amp;lt; endl;
	while (!pqDESC.empty())
	{
		printf(&quot;%d %d\n&quot;, pqDESC.top().first, pqDESC.top().second);
		pqDESC.pop();
	}

	priority_queue &amp;lt;int, vector&amp;lt;int&amp;gt;, greater&amp;lt;int&amp;gt;&amp;gt; pqIntASC;
	for (int i = 0; i &amp;lt; 10; ++i)
	{
		pqIntASC.push({ rand() % 1000 });
	}

	for (int i = 0; i &amp;lt; 10; ++i)
	{
		pqIntASC.push({ 500 });
	}

	cout &amp;lt;&amp;lt; &quot;내림차순&quot; &amp;lt;&amp;lt; endl;
	while (!pqIntASC.empty())
	{
		printf(&quot;%d\n&quot;, pqIntASC.top());
		pqIntASC.pop();
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700612867122&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;cmath&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;queue&amp;gt;
using namespace std;

int getNextPickaxe(vector&amp;lt;int&amp;gt;&amp;amp; picks)
{
    if(picks[0]-- &amp;gt; 0)
        return 0;
    if(picks[1]-- &amp;gt; 0)
        return 1;
    if(picks[2]-- &amp;gt; 0)
        return 2;

    return 3;
}

int solution(vector&amp;lt;int&amp;gt; picks, vector&amp;lt;string&amp;gt; minerals) {
    int answer = 0;
    priority_queue&amp;lt;pair&amp;lt;int, pair&amp;lt;int, int&amp;gt;&amp;gt;, vector&amp;lt;pair&amp;lt;int, pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt;, greater&amp;lt;pair&amp;lt;int, pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt;&amp;gt; pq;
    int pickaxeCount = picks[0] + picks[1] + picks[2];

    for(int i = 0; i &amp;lt; ceil(minerals.size() / 5.0f); ++i)
    {
        int arr[3] {0, 0, 0};
        for(int j = 0; j &amp;lt; 5 &amp;amp;&amp;amp; i * 5 + j &amp;lt; minerals.size() &amp;amp;&amp;amp; pickaxeCount - i; ++j)
        {
            switch(minerals[i * 5 + j][0])
            {
                case 'd':
                    ++arr[0];
                    break;
                case 'i':
                    ++arr[1];
                    break;
                case 's':
                    ++arr[2];
                    break;            
            }
        }

        pq.push({arr[0], {arr[1], arr[2]}});
    }

    while(!pq.empty())
    {
        int diamond = pq.top().first;
        int iron = pq.top().second.first;
        int stone = pq.top().second.second;
        pq.pop();
        
        printf(&quot;%d %d %d\n&quot;, diamond, iron, stone);

        switch(getNextPickaxe(picks))
        {
            case 0:
                answer += (diamond + iron + stone);
                break;
            case 1:
                answer += (diamond * 5 + iron + stone);
                break;
            case 2:
                answer += (diamond * 25 + iron * 5 + stone);
                break;
            default:
                return answer;
                break;
        }
    }

    return answer;
}

int main()
{
    solution({1, 3, 2}, {&quot;diamond&quot;, &quot;diamond&quot;, &quot;diamond&quot;, &quot;iron&quot;, &quot;iron&quot;, &quot;diamond&quot;, &quot;iron&quot;, &quot;stone&quot;});
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;priority_queue&amp;lt;pair&amp;lt;int, pair&amp;lt;int, int&amp;gt;&amp;gt;, vector&amp;lt;pair&amp;lt;int, pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt;, greater&amp;lt;pair&amp;lt;int, pair&amp;lt;int, int&amp;gt;&amp;gt;&amp;gt;&amp;gt; pq;와 같은 복잡한 형태의 우선순위 큐라 할지라도, 생성 규칙을 제대로 적용하면 내림차순의 우선순위 큐를 만들 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2차원 벡터의 생성자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적으로 크기를 할당할 때, 2차원 벡터를 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1700401981618&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; v = vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;(10, vector&amp;lt;int&amp;gt;(20, 30));&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;:&amp;nbsp;2차원&amp;nbsp;벡터를&amp;nbsp;나타냅니다.&amp;nbsp;즉,&amp;nbsp;각&amp;nbsp;요소가&amp;nbsp;정수형&amp;nbsp;벡터인&amp;nbsp;벡터입니다.&lt;/li&gt;
&lt;li&gt;v = vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;(10, vector&amp;lt;int&amp;gt;(20, 30)): 10개의 요소를 가진 벡터를 생성합니다.&lt;/li&gt;
&lt;li&gt;각 요소는 20개의 정수로 이루어진 벡터이며, 모든 요소는 30으로 초기화됩니다.&lt;/li&gt;
&lt;li&gt;이 코드는 10x20 크기의 2차원 벡터를 만들고, 모든 요소를 30으로 초기화하는 데 사용됩니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;만약 예를 들어, v[0][0]을 조회하면 30이 반환됩니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는, 아래와 같이 선언과 동시에 초기화 할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1700402058893&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; v(10, vector&amp;lt;int&amp;gt;(20, 30));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;순열&lt;/h2&gt;
&lt;figure id=&quot;og_1700477066311&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[C++][DFS] 수의 조합 ⭐&quot; data-og-description=&quot;#include int sel; int used[10]; int ch[10]; char arr[10]{ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }; /// /// 순서를 무시하고 가능한 모든 경우의 수를 조합 /// /// void DFS_ALL_Combinations(int s) { if (s == sel) { for (int i = 0;&quot; data-og-host=&quot;bonnate.tistory.com&quot; data-og-source-url=&quot;https://bonnate.tistory.com/496&quot; data-og-url=&quot;https://bonnate.tistory.com/496&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xm3V5/hyUykQJTcP/XmBc6XdwuAq2jyLK9EaVXk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/cFNi5d/hyUB5RU6wX/okPtLJOLh4NFWH4KxaEI60/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://bonnate.tistory.com/496&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bonnate.tistory.com/496&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xm3V5/hyUykQJTcP/XmBc6XdwuAq2jyLK9EaVXk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/cFNi5d/hyUB5RU6wX/okPtLJOLh4NFWH4KxaEI60/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;[C++][DFS] 수의 조합 ⭐&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;#include int sel; int used[10]; int ch[10]; char arr[10]{ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }; /// /// 순서를 무시하고 가능한 모든 경우의 수를 조합 /// /// void DFS_ALL_Combinations(int s) { if (s == sel) { for (int i = 0;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bonnate.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;figure id=&quot;og_1700475964772&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[C++][프로그래머스] 단체사진 찍기&quot; data-og-description=&quot;프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr   문제&quot; data-og-host=&quot;bonnate.tistory.com&quot; data-og-source-url=&quot;https://bonnate.tistory.com/537&quot; data-og-url=&quot;https://bonnate.tistory.com/537&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/obokz/hyUCccq69T/DFqVTjrKCUOwjuz2m5ZM31/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/cGNDA9/hyUylvlZcd/4B7vTlWX9PMwJtty7qlzJ0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/CDGrg/hyUytmBpNi/ks57orylNKBCG30anGOFFk/img.png?width=500&amp;amp;height=214&amp;amp;face=0_0_500_214&quot;&gt;&lt;a href=&quot;https://bonnate.tistory.com/537&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://bonnate.tistory.com/537&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/obokz/hyUCccq69T/DFqVTjrKCUOwjuz2m5ZM31/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/cGNDA9/hyUylvlZcd/4B7vTlWX9PMwJtty7qlzJ0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/CDGrg/hyUytmBpNi/ks57orylNKBCG30anGOFFk/img.png?width=500&amp;amp;height=214&amp;amp;face=0_0_500_214');&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;[C++][프로그래머스] 단체사진 찍기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr   문제&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;bonnate.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주어진 문자열을 서로 다르게 나열하는 모든 경우의 수 순열을 DFS를 통해 직접 구현하지 않고, 알고리즘 함수를 이용하여 간편하게 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;next_permutation 함수를 사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1700475761485&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do {
    map&amp;lt;char, int&amp;gt; m;
    for(int i = 0; i &amp;lt; cnt; ++i)
        m[characters[i]] = i;

    if(checkValid(data, m))
        ++answer;

} while(next_permutation(characters.begin(), characters.end()));&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;next_permutaion(characters.begin(), characters.end())를 사용하면 characters의 요소 자체의 값이 변경됩니다. 이를 통해 가능한 모든 조합을 얻어낼 수 있습니다.&lt;/li&gt;
&lt;li&gt;DFS를 이용하여 직접 구현하는 방식보다 성능이 좋습니다. DFS를 활용한 구현은 위 문제에서 4500ms가 나온 반면, 함수를 통해 구현한 방식은 4000ms로 약 10%의 성능 개선이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/532</guid>
      <comments>https://bonnate.tistory.com/532#entry532comment</comments>
      <pubDate>Sun, 19 Nov 2023 00:58:19 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] [1차] 캐시</title>
      <link>https://bonnate.tistory.com/531</link>
      <description>&lt;figure id=&quot;og_1700320314635&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/17680&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/C74NN/hyUypRxZ2h/uTXMyLQ7bUcPsTD1kJUdi0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b5UQdg/hyUyrIA3jG/JmkPocrMmDLeZwyKBdoFxK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/17680&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/17680&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/C74NN/hyUypRxZ2h/uTXMyLQ7bUcPsTD1kJUdi0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b5UQdg/hyUyrIA3jG/JmkPocrMmDLeZwyKBdoFxK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;도시와&amp;nbsp;관련된&amp;nbsp;맛집&amp;nbsp;게시물들을&amp;nbsp;데이터베이스에서&amp;nbsp;읽어&amp;nbsp;보여주는&amp;nbsp;서비스를&amp;nbsp;개발하고&amp;nbsp;있다. &lt;br /&gt;이&amp;nbsp;프로그램의&amp;nbsp;테스팅&amp;nbsp;업무를&amp;nbsp;담당하고&amp;nbsp;있는&amp;nbsp;어피치는&amp;nbsp;서비스를&amp;nbsp;오픈하기&amp;nbsp;전&amp;nbsp;각&amp;nbsp;로직에&amp;nbsp;대한&amp;nbsp;성능&amp;nbsp;측정을&amp;nbsp;수행하였는데,&amp;nbsp;제이지가&amp;nbsp;작성한&amp;nbsp;부분&amp;nbsp;중&amp;nbsp;데이터베이스에서&amp;nbsp;게시물을&amp;nbsp;가져오는&amp;nbsp;부분의&amp;nbsp;실행시간이&amp;nbsp;너무&amp;nbsp;오래&amp;nbsp;걸린다는&amp;nbsp;것을&amp;nbsp;알게&amp;nbsp;되었다. &lt;br /&gt;어피치는&amp;nbsp;제이지에게&amp;nbsp;해당&amp;nbsp;로직을&amp;nbsp;개선하라고&amp;nbsp;닦달하기&amp;nbsp;시작하였고,&amp;nbsp;제이지는&amp;nbsp;DB&amp;nbsp;캐시를&amp;nbsp;적용하여&amp;nbsp;성능&amp;nbsp;개선을&amp;nbsp;시도하고&amp;nbsp;있지만&amp;nbsp;캐시&amp;nbsp;크기를&amp;nbsp;얼마로&amp;nbsp;해야&amp;nbsp;효율적인지&amp;nbsp;몰라&amp;nbsp;난감한&amp;nbsp;상황이다. &lt;br /&gt;&lt;br /&gt;어피치에게&amp;nbsp;시달리는&amp;nbsp;제이지를&amp;nbsp;도와,&amp;nbsp;DB&amp;nbsp;캐시를&amp;nbsp;적용할&amp;nbsp;때&amp;nbsp;캐시&amp;nbsp;크기에&amp;nbsp;따른&amp;nbsp;실행시간&amp;nbsp;측정&amp;nbsp;프로그램을&amp;nbsp;작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700320350438&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;set&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace std;


int solution(int cacheSize, vector&amp;lt;string&amp;gt; cities) {
    int answer = 0;
    
    set&amp;lt;string&amp;gt; s;
    vector&amp;lt;string&amp;gt; v;
    
    for(string _s : cities)
    {
        transform(s.begin(), s.end(), s.begin(), [](char c) { return toupper(c); });
        v.push_back(_s);
        
        if(s.find(_s) != s.end()) // cache hit
        {
            ++answer;
            
            auto it = find(v.begin(), v.end(), _s);
            if(it != v.end())
                v.erase(it);
        }
        else // cache miss
        {
            answer += 5;
            
            if(s.size() &amp;gt;= cacheSize)
            {
                s.erase(*v.begin());    
                v.erase(v.begin());
            }
            
            if(cacheSize != 0)
                s.insert(_s);
        }
    }
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;map과 vector 배열을 활용해서 문제를 해결하였습니다.&lt;/li&gt;
&lt;li&gt;map을 이용하여 현재 캐시에 값이 있는지 확인합니다.&lt;/li&gt;
&lt;li&gt;s에는 가장 마지막에 사용한 값이 front에 이동하도록 합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>해시</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/531</guid>
      <comments>https://bonnate.tistory.com/531#entry531comment</comments>
      <pubDate>Sun, 19 Nov 2023 00:13:55 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 다리를 지나는 트럭 rotate(), q.back()</title>
      <link>https://bonnate.tistory.com/530</link>
      <description>&lt;figure id=&quot;og_1700314292445&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42583&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bELv1m/hyUym8iCJE/9kciRJDJyKdgKr8h4BiH61/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/JnMjd/hyUyzT7SY3/f2h6gNjnHWTLhHjPYNFJIK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42583&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42583&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bELv1m/hyUym8iCJE/9kciRJDJyKdgKr8h4BiH61/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/JnMjd/hyUyzT7SY3/f2h6gNjnHWTLhHjPYNFJIK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;순으로&amp;nbsp;건너려&amp;nbsp;합니다.&amp;nbsp;모든&amp;nbsp;트럭이&amp;nbsp;다리를&amp;nbsp;건너려면&amp;nbsp;최소&amp;nbsp;몇&amp;nbsp;초가&amp;nbsp;걸리는지&amp;nbsp;알아내야&amp;nbsp;합니다.&amp;nbsp;다리에는&amp;nbsp;트럭이&amp;nbsp;최대&amp;nbsp;bridge_length대&amp;nbsp;올라갈&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;다리는&amp;nbsp;weight&amp;nbsp;이하까지의&amp;nbsp;무게를&amp;nbsp;견딜&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;단,&amp;nbsp;다리에&amp;nbsp;완전히&amp;nbsp;오르지&amp;nbsp;않은&amp;nbsp;트럭의&amp;nbsp;무게는&amp;nbsp;무시합니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어,&amp;nbsp;트럭&amp;nbsp;2대가&amp;nbsp;올라갈&amp;nbsp;수&amp;nbsp;있고&amp;nbsp;무게를&amp;nbsp;10kg까지&amp;nbsp;견디는&amp;nbsp;다리가&amp;nbsp;있습니다.&amp;nbsp;무게가&amp;nbsp;[7,&amp;nbsp;4,&amp;nbsp;5,&amp;nbsp;6]kg인&amp;nbsp;트럭이&amp;nbsp;순서대로&amp;nbsp;최단&amp;nbsp;시간&amp;nbsp;안에&amp;nbsp;다리를&amp;nbsp;건너려면&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;건너야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700314375116&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace std;

int solution(int bridge_length, int weight, vector&amp;lt;int&amp;gt; truck_weights) {
    int answer = 0;
    int n = truck_weights.size();
    
    vector&amp;lt;int&amp;gt; v(bridge_length + 1, 0);
    int sum = 0;
    int idx = 0;
    
    while(idx &amp;lt; n)
    {
        // 왼쪽으로 한칸씩 이동
        rotate(v.rbegin(), v.rbegin() + 1, v.rend());
        
		// 마지막에 있는 트럭을 내보내기
		sum -= v[bridge_length]; // 마지막에 있는 트럭의 무게를 빼기
		v[bridge_length] = 0; // 해당 값은 0으로 설정        
        
		// 트랙 보내기 시도
		if (sum + truck_weights[idx] &amp;lt;= weight)
		{
			v[0] = truck_weights[idx++];
			sum += v[0];
		}

		++answer;
    }
    
    for(int i = 0; i &amp;lt; bridge_length; ++i)
        if(v[i])
        {
            answer += bridge_length - i;
            break;
        }
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rotate 함수를 이용하여 문제를 해결하였습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(인덱스가 1에서 0로) 한칸씩 이동 rotate(v.begin(),&amp;nbsp;v.begin()&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;v.end());&lt;/li&gt;
&lt;li&gt;(인덱스가 0에서 1로) 한칸씩 이동 rotate(v.rbegin(), v.rbegin() + 1, v.rend());&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;트럭의 무게를 0부터 삽입하여 brigde_length까지 회전하여 더합니다.&lt;/li&gt;
&lt;li&gt;v[brigde_length]에 값이 있다면, 트럭이 다리를 모두 지난것으로, sum에서 빼줍니다.&lt;/li&gt;
&lt;li&gt;매 반복문마다 검사하여 트럭의 무게를 삽입하고, 종단에서 트럭을 빼줌으로써 문제를 해결하였습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700315875762&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;queue&amp;gt;

using namespace std;

int solution(int bridge_length, int weight, vector&amp;lt;int&amp;gt; truck_weights) {
    queue&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; q;
    int sum = 0; // 현재 다리에 있는 트럭의 무게 합
    int idx = 0; // 삽입할 인덱스 번호
    int time = 0; // 경과된 시간
    int n = truck_weights.size(); // 트럭의 개수
    
    while(idx &amp;lt; n)
    {
        // q가 비어있지 않으면서, q의 front의 시간이 경과되었다면? (도착)
        if(!q.empty() &amp;amp;&amp;amp; time &amp;gt;= q.front().second)
        {
            sum -= q.front().first; // 무게에서 빼기
            q.pop(); // 큐에서 제거
        }
        
        // idx번째의 트럭을 다리에 둘 수 있는가? (무게를 초과하지 않는가?)
        if(sum + truck_weights[idx] &amp;lt;= weight)
        {
            q.push({truck_weights[idx], time + bridge_length}); // 큐에 트럭의 무게와 도착 예정 시간 삽입
            sum += truck_weights[idx++]; // 무게 합
        }
        
        ++time; // 시간 경과
    }
    
    // 큐의 가장 마지막 원소의 시간 + 1을 리턴
    return q.back().second + 1;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;큐를 이용하여 문제를 해결합니다.&lt;/li&gt;
&lt;li&gt;큐에 차례대로 삽입을 시도합니다. 이때, 총 합의 무게가 weight를 넘어서는 안됩니다.&lt;/li&gt;
&lt;li&gt;time을 지속적으로 증가하여 만약, 큐의 front의 second(도착 예정 시간)이 time 이상이라면, 도착을 한 경우로 sum에서 first(무게)를 제거하고, 큐에서 제거합니다.&lt;/li&gt;
&lt;li&gt;모든 idx를 삽입하였다면, q.back().second + 1을 리턴합니다. 이 과정은 다리 위에서 가장 늦게 삽입된 트럭이 도착하는 시간을 더한 값입니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>큐</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/530</guid>
      <comments>https://bonnate.tistory.com/530#entry530comment</comments>
      <pubDate>Sat, 18 Nov 2023 23:02:16 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 주식가격</title>
      <link>https://bonnate.tistory.com/529</link>
      <description>&lt;figure id=&quot;og_1700230294034&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42586&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cyUK9S/hyUysG77Pv/MsEdo0g2wcXdZqsk9o9buk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/voeOh/hyUymUs2s5/X61X1xcZFV0CQt64WUvxik/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42586&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42586&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cyUK9S/hyUysG77Pv/MsEdo0g2wcXdZqsk9o9buk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/voeOh/hyUymUs2s5/X61X1xcZFV0CQt64WUvxik/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;prices가&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;가격이&amp;nbsp;떨어지지&amp;nbsp;않은&amp;nbsp;기간은&amp;nbsp;몇&amp;nbsp;초인지를&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700231028262&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;stack&amp;gt;

using namespace std;

vector&amp;lt;int&amp;gt; solution(vector&amp;lt;int&amp;gt; prices) {
    int n = prices.size();
    vector&amp;lt;int&amp;gt; answer(n, 0);
    stack&amp;lt;int&amp;gt; s;
    
    // 모든 값 검사
    for(int i = 0; i &amp;lt; n; ++i)
    {
        // s가 비어있지 않을때, 
        // top의 가격이 prices[i]보다 크다면 가격이 떨어지기 시작
        while(!s.empty() &amp;amp;&amp;amp; prices[s.top()] &amp;gt; prices[i])
        {
            // answer[s.top()]에는 현재 위치(i) 에서 삽입한 위치(s.top)의 차이를 삽입
            answer[s.top()] = i - s.top();
            s.pop();
        }
        
        // 현재 위치 삽입
        s.push(i);
    }

    // 해당 위치의 가격은 마지막까지 한번도 떨어지지 않은 경우임
    // s가 빌때까지 모두 정답에 삽입
    while(!s.empty())
    {
        answer[s.top()] = n - s.top() - 1;
        s.pop();
    }
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스택을 이용하여 문제를 해결하였습니다.&lt;/li&gt;
&lt;li&gt;i를 지속적으로 push하면서 가격이 직전 가격보다 떨어지는지 검사합니다.&lt;/li&gt;
&lt;li&gt;만약, 가격이 떨어진다면 가격이 떨어지지 않는 경우까지 계속 정답에 삽입한 후, s의 값을 pop 합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/529</guid>
      <comments>https://bonnate.tistory.com/529#entry529comment</comments>
      <pubDate>Fri, 17 Nov 2023 23:25:12 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 기능 개발</title>
      <link>https://bonnate.tistory.com/528</link>
      <description>&lt;figure id=&quot;og_1700230294034&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42586&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cyUK9S/hyUysG77Pv/MsEdo0g2wcXdZqsk9o9buk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/voeOh/hyUymUs2s5/X61X1xcZFV0CQt64WUvxik/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42586&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42586&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cyUK9S/hyUysG77Pv/MsEdo0g2wcXdZqsk9o9buk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/voeOh/hyUymUs2s5/X61X1xcZFV0CQt64WUvxik/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;기능은&amp;nbsp;진도가&amp;nbsp;100%일&amp;nbsp;때&amp;nbsp;서비스에&amp;nbsp;반영할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;또,&amp;nbsp;각&amp;nbsp;기능의&amp;nbsp;개발속도는&amp;nbsp;모두&amp;nbsp;다르기&amp;nbsp;때문에&amp;nbsp;뒤에&amp;nbsp;있는&amp;nbsp;기능이&amp;nbsp;앞에&amp;nbsp;있는&amp;nbsp;기능보다&amp;nbsp;먼저&amp;nbsp;개발될&amp;nbsp;수&amp;nbsp;있고,&amp;nbsp;이때&amp;nbsp;뒤에&amp;nbsp;있는&amp;nbsp;기능은&amp;nbsp;앞에&amp;nbsp;있는&amp;nbsp;기능이&amp;nbsp;배포될&amp;nbsp;때&amp;nbsp;함께&amp;nbsp;배포됩니다. &lt;br /&gt;&lt;br /&gt;먼저&amp;nbsp;배포되어야&amp;nbsp;하는&amp;nbsp;순서대로&amp;nbsp;작업의&amp;nbsp;진도가&amp;nbsp;적힌&amp;nbsp;정수&amp;nbsp;배열&amp;nbsp;progresses와&amp;nbsp;각&amp;nbsp;작업의&amp;nbsp;개발&amp;nbsp;속도가&amp;nbsp;적힌&amp;nbsp;정수&amp;nbsp;배열&amp;nbsp;speeds가&amp;nbsp;주어질&amp;nbsp;때&amp;nbsp;각&amp;nbsp;배포마다&amp;nbsp;몇&amp;nbsp;개의&amp;nbsp;기능이&amp;nbsp;배포되는지를&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700230229333&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;

using namespace std;

vector&amp;lt;int&amp;gt; solution(vector&amp;lt;int&amp;gt; progresses, vector&amp;lt;int&amp;gt; speeds) {
    
    int size = progresses.size();
    vector&amp;lt;int&amp;gt; answer;
    
    int idx = 0;
    int days = 0;
    while(idx &amp;lt; size)
    {
        for(int i = idx; i &amp;lt; size; ++i)
            progresses[i] += speeds[i];

        int cnt = 0;
        for(int i = idx; i &amp;lt; size; ++i)
            if(progresses[i] &amp;gt;= 100)
                ++cnt, ++idx;
            else
                break;
                
        if(cnt)
            answer.push_back(cnt);
    }
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;while문에서 idx부터 끝까지 speeds[i]만큼을 더해줍니다.&lt;/li&gt;
&lt;li&gt;progress[i]가 100 이상일경우, 완료된 작업입니다. 100 미만일때까지 개수를 샌 후 정답에 push합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/528</guid>
      <comments>https://bonnate.tistory.com/528#entry528comment</comments>
      <pubDate>Fri, 17 Nov 2023 23:11:31 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 프로세스</title>
      <link>https://bonnate.tistory.com/527</link>
      <description>&lt;figure id=&quot;og_1700439806893&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42587&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yu49Q/hyUB7oy0mQ/mQmyKaaJAM1vheVf2ruUUK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b3TfNF/hyUyoMiwwR/FOUNqUkGRhEqGdPdK2L3u0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42587&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42587&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yu49Q/hyUB7oy0mQ/mQmyKaaJAM1vheVf2ruUUK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b3TfNF/hyUyoMiwwR/FOUNqUkGRhEqGdPdK2L3u0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;관리하는&amp;nbsp;것입니다.&amp;nbsp;이&amp;nbsp;문제에서는&amp;nbsp;운영체제가&amp;nbsp;다음&amp;nbsp;규칙에&amp;nbsp;따라&amp;nbsp;프로세스를&amp;nbsp;관리할&amp;nbsp;경우&amp;nbsp;특정&amp;nbsp;프로세스가&amp;nbsp;몇&amp;nbsp;번째로&amp;nbsp;실행되는지&amp;nbsp;알아내면&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;실행&amp;nbsp;대기&amp;nbsp;큐(Queue)에서&amp;nbsp;대기중인&amp;nbsp;프로세스&amp;nbsp;하나를&amp;nbsp;꺼냅니다. &lt;br /&gt;2.&amp;nbsp;큐에&amp;nbsp;대기중인&amp;nbsp;프로세스&amp;nbsp;중&amp;nbsp;우선순위가&amp;nbsp;더&amp;nbsp;높은&amp;nbsp;프로세스가&amp;nbsp;있다면&amp;nbsp;방금&amp;nbsp;꺼낸&amp;nbsp;프로세스를&amp;nbsp;다시&amp;nbsp;큐에&amp;nbsp;넣습니다. &lt;br /&gt;3.&amp;nbsp;만약&amp;nbsp;그런&amp;nbsp;프로세스가&amp;nbsp;없다면&amp;nbsp;방금&amp;nbsp;꺼낸&amp;nbsp;프로세스를&amp;nbsp;실행합니다. &lt;br /&gt;&amp;nbsp;&amp;nbsp;3.1&amp;nbsp;한&amp;nbsp;번&amp;nbsp;실행한&amp;nbsp;프로세스는&amp;nbsp;다시&amp;nbsp;큐에&amp;nbsp;넣지&amp;nbsp;않고&amp;nbsp;그대로&amp;nbsp;종료됩니다. &lt;br /&gt;예를&amp;nbsp;들어&amp;nbsp;프로세스&amp;nbsp;4개&amp;nbsp;[A,&amp;nbsp;B,&amp;nbsp;C,&amp;nbsp;D]가&amp;nbsp;순서대로&amp;nbsp;실행&amp;nbsp;대기&amp;nbsp;큐에&amp;nbsp;들어있고,&amp;nbsp;우선순위가&amp;nbsp;[2,&amp;nbsp;1,&amp;nbsp;3,&amp;nbsp;2]라면&amp;nbsp;[C,&amp;nbsp;D,&amp;nbsp;A,&amp;nbsp;B]&amp;nbsp;순으로&amp;nbsp;실행하게&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;현재&amp;nbsp;실행&amp;nbsp;대기&amp;nbsp;큐(Queue)에&amp;nbsp;있는&amp;nbsp;프로세스의&amp;nbsp;중요도가&amp;nbsp;순서대로&amp;nbsp;담긴&amp;nbsp;배열&amp;nbsp;priorities와,&amp;nbsp;몇&amp;nbsp;번째로&amp;nbsp;실행되는지&amp;nbsp;알고싶은&amp;nbsp;프로세스의&amp;nbsp;위치를&amp;nbsp;알려주는&amp;nbsp;location이&amp;nbsp;매개변수로&amp;nbsp;주어질&amp;nbsp;때,&amp;nbsp;해당&amp;nbsp;프로세스가&amp;nbsp;몇&amp;nbsp;번째로&amp;nbsp;실행되는지&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;작성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700147042609&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;iostream&amp;gt;

using namespace std;

int solution(vector&amp;lt;int&amp;gt; priorities, int location) {
    
    int answer = 0;
    int lastIdx = 0;
    for(int i = 9; i &amp;gt;= 0; --i)
    {
        int last = lastIdx;
        
        for(int j = 0; j &amp;lt; priorities.size(); ++j)
        {
            int idx = j + lastIdx;
            while(idx &amp;gt;= priorities.size())
                idx -= priorities.size();
            
            if(priorities[idx] == i)
            {
                ++answer;
                
                if(idx == location)
                    return answer;    
                
                last = idx;
            }
        }
        
        lastIdx = last;
    }
    
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2중 for문을 이용하여 문제를 해결하였습니다.&lt;/li&gt;
&lt;li&gt;i를 9부터 0까지 차례대로 검사하여 우선순위가 높은 순서대로 검사합니다.&lt;/li&gt;
&lt;li&gt;i가 9일때, priorities.size()만큼 검사하여 모든 값을 검사하면, 다음 값인 i를 8부터 검사하되, lastIdx부터 시작하도록 합니다. 그렇게되면 가장 최근에 검사한 위치 이후부터 priorities.size()만큼 검사할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1700147727427&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;

using namespace std;

int solution(vector&amp;lt;int&amp;gt; priorities, int location) {
    int answer = 0;
    
    // max_element를 사용하여 priorities 내에서 가장 큰 값을 가져오기
    int max = *max_element(priorities.begin(), priorities.end());
    
    while(true)
    {
        // priorities.size()까지 검색
        // max 값이 바뀌어도 i의 값은 1씩 증가하며 검색 (C, D, E, F, A, B 순서 가능)
        for(int i = 0; i &amp;lt; priorities.size(); ++i)
            if(priorities[i] == max) // 현재 위치(i)가 max값이라면?
            {
                ++answer; // 실행 순서 1 증가
                priorities[i] = -1; // 해당 위치는 사용 완료
                max = *max_element(priorities.begin(), priorities.end()); // 다음 max값 검색(같은 max일 수 있음)

                // i가 현재 위치라면 리턴
                if(i == location)    
                    return answer;
            }
    }
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;max_element를 이용하여 문제를 해결합니다. 반대로, min_element 함수도 있습니다.&lt;/li&gt;
&lt;li&gt;현재 주어진 수에서 가장 큰 수를 구한 후, 해당 값을 찾아 검사합니다.&lt;/li&gt;
&lt;li&gt;만약, 큰 수가 더 이상 없다면, 새로운 max를 구하여 해당 값을 또 검사합니다.&lt;/li&gt;
&lt;li&gt;for문에서 i의 위치가 1씩 증가하기에 max를 구해도 i는 유지되어 이어서 검사할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/527</guid>
      <comments>https://bonnate.tistory.com/527#entry527comment</comments>
      <pubDate>Fri, 17 Nov 2023 00:16:51 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 소수 찾기</title>
      <link>https://bonnate.tistory.com/526</link>
      <description>&lt;figure id=&quot;og_1700057972262&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;프로그래머스&quot; data-og-description=&quot;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42839&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xyBXM/hyUuYG9dQu/1gXbZ7LCmkODH0C7Nnx5w1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/DrIbv/hyUyqINMk9/oexKs2116cStawXNtwOSu1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42839&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42839&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xyBXM/hyUuYG9dQu/1gXbZ7LCmkODH0C7Nnx5w1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/DrIbv/hyUyqINMk9/oexKs2116cStawXNtwOSu1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; 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;조각을&amp;nbsp;붙여&amp;nbsp;소수를&amp;nbsp;몇&amp;nbsp;개&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;알아내려&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;각&amp;nbsp;종이&amp;nbsp;조각에&amp;nbsp;적힌&amp;nbsp;숫자가&amp;nbsp;적힌&amp;nbsp;문자열&amp;nbsp;numbers가&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;종이&amp;nbsp;조각으로&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;소수가&amp;nbsp;몇&amp;nbsp;개인지&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성해주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;pre id=&quot;code_1700057982261&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;cmath&amp;gt;
#include &amp;lt;set&amp;gt;

using namespace std;

int sel[7];
bool ch[7];
vector&amp;lt;bool&amp;gt; v;
set&amp;lt;string&amp;gt; duplicatedSet;
int answer = 0;

void DFS(string numbers, int select, int s)
{
    if(s == select)
    {
        string num;
        for(int i = 0; i &amp;lt; select; ++i)
            num.push_back(numbers[sel[i]]);
            
        while(num.size() &amp;gt; 0)
            if(num[0] == '0')
                num.erase(0, 1);
            else
                break;
        
        if(num.size() &amp;gt; 0 &amp;amp;&amp;amp; duplicatedSet.find(num) == duplicatedSet.end())
        {
            duplicatedSet.insert(num);
            if(v[stoi(num)])
                ++answer;
        }
    }
    else
    {
        for(int i = 0; i &amp;lt; numbers.size(); ++i)
        {
            if(!ch[i])
            {
                ch[i] = true;
                sel[s] = i;
                DFS(numbers, select, s + 1);
                ch[i] = false;
            }
        }
    }
}

int solution(string numbers) {

    sort(numbers.begin(), numbers.end(), greater&amp;lt;int&amp;gt;());
    int num = stoi(numbers);

    v = vector&amp;lt;bool&amp;gt;(num, true);
    v[0] = v[1] = false;
    
    for(int i = 2; i &amp;lt;= sqrt(num); ++i)
        for(int j = i * 2; j &amp;lt;= num; j += i)
            v[j] = false;
    
    for(int i = 1; i &amp;lt;= numbers.size(); ++i)
        DFS(numbers, i, 0);
    
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DFS를 이용하여 numbers를 뽑을 수 있는 모든 경우의 수를 뽑아서 찾습니다.&lt;/li&gt;
&lt;li&gt;찾은 수열에서 앞자리 0을 제거한 후 중복되는지 확인하기위해 set을 이용합니다.&lt;/li&gt;
&lt;li&gt;에라스토테네스의 체를 이용하여 numbers에서 가장 큰 값에 대한 모든 소수를 빠르게 찾은 후 v벡터에 저장합니다.&lt;/li&gt;
&lt;li&gt;수열에서 v 벡터의 값을 비교하여 해당 값이 소수이면, answer의 값을 1씩 올려 정답을 리턴합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/526</guid>
      <comments>https://bonnate.tistory.com/526#entry526comment</comments>
      <pubDate>Wed, 15 Nov 2023 23:21:44 +0900</pubDate>
    </item>
    <item>
      <title>[C++][프로그래머스] 큰 수 만들기  </title>
      <link>https://bonnate.tistory.com/525</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤&amp;nbsp;숫자에서&amp;nbsp;k개의&amp;nbsp;수를&amp;nbsp;제거했을&amp;nbsp;때&amp;nbsp;얻을&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;숫자를&amp;nbsp;구하려&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어,&amp;nbsp;숫자&amp;nbsp;1924에서&amp;nbsp;수&amp;nbsp;두&amp;nbsp;개를&amp;nbsp;제거하면&amp;nbsp;[19,&amp;nbsp;12,&amp;nbsp;14,&amp;nbsp;92,&amp;nbsp;94,&amp;nbsp;24]&amp;nbsp;를&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;중&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;숫자는&amp;nbsp;94&amp;nbsp;입니다. &lt;br /&gt;&lt;br /&gt;문자열&amp;nbsp;형식으로&amp;nbsp;숫자&amp;nbsp;number와&amp;nbsp;제거할&amp;nbsp;수의&amp;nbsp;개수&amp;nbsp;k가&amp;nbsp;solution&amp;nbsp;함수의&amp;nbsp;매개변수로&amp;nbsp;주어집니다.&amp;nbsp;number에서&amp;nbsp;k&amp;nbsp;개의&amp;nbsp;수를&amp;nbsp;제거했을&amp;nbsp;때&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;수&amp;nbsp;중&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;숫자를&amp;nbsp;문자열&amp;nbsp;형태로&amp;nbsp;return&amp;nbsp;하도록&amp;nbsp;solution&amp;nbsp;함수를&amp;nbsp;완성하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;number &quot;12345&quot;, k 2일때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i 반복문은 0부터 2까지 반복합니다. (number.size() - 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;i가 0일때에는 startIdx가 0이므로, j는 0부터 시작합니다. j는 2까지 반복할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면, {1, 2, 3}에서 가장 큰 값은 3이고, maxIdx는 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;i가 1이 되면, startIdx는 3이 됩니다. j는 3부터 시작합니다. j는 3까지 반복할 수 있습니다. (j &amp;lt;= k + i)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서는 최대값이 3이 됩니다. maxIdx는 3이 됩니다.&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가 2가 되면, startIdx는 4가 됩니다. j는 4부터 시작하며, 4까지 반복할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699974486813&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
 
using namespace std;
 
string solution(string number, int k) {
    string answer = &quot;&quot;;
 
    int startIdx = 0;
    // number에서 k개를 뺀 것을 뽑기 위해 number.size() - k 만큼 반복
    for(int i = 0; i &amp;lt; number.size() - k; ++i)
    {
        char maxChar = number[startIdx];
        int maxIdx = startIdx;

        // 시작 위치로부터 k + 1번까지 반복 (뒤에서 뽑을 것을 보장하기 위해 반복을 제한)
        // 만약, 현재 뽑은 값이 마지막 인덱스가 가장 크다면, 다음에 뽑는 경우는 호출되지 않을 수 있음
        // 12345 중 k가 2인경우, {1, 2, [3]}, [4], [5] 가 뽑힘
        for(int j = startIdx; j &amp;lt;= k + i; ++j)
        {
            // 현재 선택에서 최상의 값을 구하기
            if(maxChar &amp;lt; number[j])
            {
                maxChar = number[j];
                maxIdx = j;
            }
        }
        
        // 정답에 추가하고, 다음 반복문은 maxIdx + 1번부터 뽑기 시작
        answer.push_back(maxChar);
        startIdx = maxIdx + 1;
    }
 
    return answer;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;number에서 k개를 뺀 수를 구하는 문제이기에 number.size() - k 만큼 반복을 해 해당 반복문에서 수를 무조건 1개씩 뽑아 정답에 삽입하도록 합니다.&lt;/li&gt;
&lt;li&gt;j가 startIdx로부터 k + 1까지만 뽑아야 합니다. 그 이유는, 다음 뽑기에서 영역에 제한을 두어 나중에 값을 무조건 뽑을 수 있도록 보장하기 위해서입니다.&lt;/li&gt;
&lt;li&gt;이런 상태에서, startIdx부터 k + i까지 값 중 가장 큰 값을 뽑아 정답에 삽입합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithms (C++)</category>
      <category>그리디</category>
      <author>bonnate</author>
      <guid isPermaLink="true">https://bonnate.tistory.com/525</guid>
      <comments>https://bonnate.tistory.com/525#entry525comment</comments>
      <pubDate>Wed, 15 Nov 2023 00:13:30 +0900</pubDate>
    </item>
  </channel>
</rss>