<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>언제나 처음처럼</title>
    <link>https://onlytrying.tistory.com/</link>
    <description>알고리즘을 공부하면서 풀게 되는 문제들을 포스팅하고 있습니다</description>
    <language>ko</language>
    <pubDate>Tue, 14 Jul 2026 12:21:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>대 혁</managingEditor>
    <item>
      <title>백준 14888번: 연산자 끼워넣기</title>
      <link>https://onlytrying.tistory.com/245</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문제 링크]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/14888&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/14888&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 백트래킹 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기저사례는 시작 인덱스가 수열의 끝에 도달하는 경우로 설정하였고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기저사례에 도달할 경우 현재까지 계산된 값으로 최소값과 최대값을 갱신하도록 구현하였다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1771853361888&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;

int minVal = 1987654321;
int maxVal = -1987654321;

enum class Operator
{
	Plus,
	Minus,
	Multiple,
	Division
};

void backtracking(vector&amp;lt;int&amp;gt;&amp;amp; arr, vector&amp;lt;int&amp;gt;&amp;amp; operatorArr, int start, int value)
{
	if (start == arr.size())
	{
		minVal = min(minVal, value);
		maxVal = max(maxVal, value);
		return;
	}

	for (int i = 0; i &amp;lt; 4; i++)
	{
		if (operatorArr[i] == 0) continue;
		
		int nextValue = value;

		switch (i)
		{
		case (int)Operator::Plus:
			nextValue += arr[start];
			break;

		case (int)Operator::Minus:
			nextValue -= arr[start];
			break;

		case (int)Operator::Multiple:
			nextValue *= arr[start];
			break;
			
		case (int)Operator::Division:
			nextValue /= arr[start];
			break;
		}

		operatorArr[i]--;
		backtracking(arr, operatorArr, start + 1, nextValue);
		operatorArr[i]++;
	}
}

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

	vector&amp;lt;int&amp;gt; arr(N);

	for (int i = 0; i &amp;lt; N; i++)
	{
		cin &amp;gt;&amp;gt; arr[i];
	}

	vector&amp;lt;int&amp;gt; operatorArr(4, 0);
	cin &amp;gt;&amp;gt; operatorArr[0] &amp;gt;&amp;gt; operatorArr[1] &amp;gt;&amp;gt; operatorArr[2] &amp;gt;&amp;gt; operatorArr[3];

	backtracking(arr, operatorArr, 1, arr[0]);

	cout &amp;lt;&amp;lt; maxVal &amp;lt;&amp;lt; '\n' &amp;lt;&amp;lt; minVal;

	return 0;
}&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;1178&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7jxP3/dJMcaaj2LAh/oK7oaZS3s099hVh4ihdjd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7jxP3/dJMcaaj2LAh/oK7oaZS3s099hVh4ihdjd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7jxP3/dJMcaaj2LAh/oK7oaZS3s099hVh4ihdjd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7jxP3%2FdJMcaaj2LAh%2FoK7oaZS3s099hVh4ihdjd1%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;1178&quot; height=&quot;347&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <category>Backtracking</category>
      <category>백트래킹</category>
      <author>대 혁</author>
      <guid isPermaLink="true">https://onlytrying.tistory.com/245</guid>
      <comments>https://onlytrying.tistory.com/245#entry245comment</comments>
      <pubDate>Mon, 23 Feb 2026 22:32:10 +0900</pubDate>
    </item>
    <item>
      <title>백준 15649번: N과 M (1)</title>
      <link>https://onlytrying.tistory.com/244</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문제 링크]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/15649&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/15649&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 백트래킹 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 담은 숫자를 중복으로 담지 않기 위해 vector&amp;lt;bool&amp;gt;에 담은 숫자를 마킹하는 방식을 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기저사례는 vector&amp;lt;int&amp;gt; 크기가 M과 같아지는 경우로 설정하였고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기저사례에 도달할 경우 재귀를 수행하지 않고 vector에 담긴 원소를 출력하는 방식으로 구현하였다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1771847406752&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;

int N, M;

void backtracking(vector&amp;lt;int&amp;gt;&amp;amp; backpack, vector&amp;lt;bool&amp;gt;&amp;amp; picked)
{
	if (backpack.size() == M)
	{
		for (auto a : backpack)
		{
			cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt; ' ';
		}
		cout &amp;lt;&amp;lt; '\n';

		return;
	}
	
	for (int i = 1; i &amp;lt;= N; i++)
	{
		if (picked[i]) continue;

		backpack.push_back(i);
		picked[i] = true;
		backtracking(backpack, picked);
		backpack.pop_back();
		picked[i] = false;
	}
}

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

	vector&amp;lt;int&amp;gt; backpack;
	vector&amp;lt;bool&amp;gt; picked(N+1, false);
	backtracking(backpack, picked);

	return 0;
}&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;1147&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnxk6O/dJMb99SXo6Y/m2AhCmN8sf9Y2rSmofDlY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnxk6O/dJMb99SXo6Y/m2AhCmN8sf9Y2rSmofDlY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnxk6O/dJMb99SXo6Y/m2AhCmN8sf9Y2rSmofDlY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcnxk6O%2FdJMb99SXo6Y%2Fm2AhCmN8sf9Y2rSmofDlY1%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;1147&quot; height=&quot;1040&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <category>Backtracking</category>
      <category>백트래킹</category>
      <author>대 혁</author>
      <guid isPermaLink="true">https://onlytrying.tistory.com/244</guid>
      <comments>https://onlytrying.tistory.com/244#entry244comment</comments>
      <pubDate>Mon, 23 Feb 2026 20:51:09 +0900</pubDate>
    </item>
    <item>
      <title>백준 1068번 : 트리</title>
      <link>https://onlytrying.tistory.com/243</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문제 링크]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1068&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1068&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 그래프 탐색 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리프노드를 찾는 탐색은 부모노드에서 자식노드 방향으로의 탐색만 필요하기 때문에 단방향 그래프로 구성하였고, &lt;br /&gt;트리 구조로 구성된 그래프 특성 상 간선의 수가 많지 않다는 특징이 있기 때문에 인접리스트로 그래프를 표현하여 공간복잡도를 최적화하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한가지 예외사항으로 루트노드가 제거될 경우 트리 자체가 제거되기 때문에 루트노드와 제거한 노드를 비교하는 로직을 추가하였다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1767166490112&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;stack&amp;gt;
using namespace std;

int getLeafNodeCount(const vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; tree, int rootNode)
{
	int LeafNodeCnt = 0;

	//DFS
	vector&amp;lt;bool&amp;gt; visited(tree.size());

	stack&amp;lt;int&amp;gt; stk;
	stk.push(rootNode);
	visited[rootNode] = true;

	while (!stk.empty())
	{
		int here = stk.top();
		stk.pop();

		if (tree[here].empty())
			LeafNodeCnt++;
		else
		{
			for (const int child : tree[here])
			{
				if (!visited[child])
				{
					stk.push(child);
					visited[child] = true;
				}
			}
		}
	}

	return LeafNodeCnt;
}

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

	vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; tree(N);
	int rootNode = -1;

	for (int i = 0; i &amp;lt; N; i++)
	{
		int parent;
		cin &amp;gt;&amp;gt; parent;

		if (parent != -1)
		{
			tree[parent].push_back(i);
		}
		else
		{
			rootNode = i;
		}
	}

	int removeNode;
	cin &amp;gt;&amp;gt; removeNode;

	for (auto&amp;amp; parentTree : tree)
	{
		bool isRemoved = false;
		for (vector&amp;lt;int&amp;gt;::iterator iter = parentTree.begin(); iter != parentTree.end(); iter++)
		{
			if (*iter == removeNode)
			{
				parentTree.erase(iter);
				isRemoved = true;
				break;
			}
		}
		if (isRemoved)
			break;
	}

	if (rootNode == -1 || rootNode == removeNode)
		cout &amp;lt;&amp;lt; 0;
	else
		cout &amp;lt;&amp;lt; getLeafNodeCount(tree, rootNode);

	return 0;
}&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;772&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjmhGZ/dJMcaaKHMLR/47cXdLELBu3rf07gdmyLu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjmhGZ/dJMcaaKHMLR/47cXdLELBu3rf07gdmyLu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjmhGZ/dJMcaaKHMLR/47cXdLELBu3rf07gdmyLu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjmhGZ%2FdJMcaaKHMLR%2F47cXdLELBu3rf07gdmyLu1%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;772&quot; height=&quot;274&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <category>DFS</category>
      <category>트리</category>
      <author>대 혁</author>
      <guid isPermaLink="true">https://onlytrying.tistory.com/243</guid>
      <comments>https://onlytrying.tistory.com/243#entry243comment</comments>
      <pubDate>Wed, 31 Dec 2025 16:36:46 +0900</pubDate>
    </item>
    <item>
      <title>백준 1013번: Contact</title>
      <link>https://onlytrying.tistory.com/242</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문제 링크]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1013&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1013&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재귀 호출을 이해하고 있는지 물어보는 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;2052&quot; data-start=&quot;2043&quot; data-ke-size=&quot;size23&quot;&gt;(100+1+) 패턴 동작 요약&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2402&quot; data-start=&quot;2054&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2084&quot; data-start=&quot;2054&quot;&gt;먼저 &quot;100&quot; 이 정확히 나오는지 확인한다.&lt;/li&gt;
&lt;li data-end=&quot;2116&quot; data-start=&quot;2085&quot;&gt;그 뒤의 0들을 모두 소비한다. &amp;rarr; 100+&lt;/li&gt;
&lt;li data-end=&quot;2151&quot; data-start=&quot;2117&quot;&gt;그 다음에는 &lt;b&gt;반드시 1이 하나 이상&lt;/b&gt; 나와야 한다.&lt;/li&gt;
&lt;li data-end=&quot;2300&quot; data-start=&quot;2152&quot;&gt;1+ 구간에서는
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2300&quot; data-start=&quot;2169&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2188&quot; data-start=&quot;2169&quot;&gt;1을 하나씩 소비할 때마다, 그 시점(idx)부터 나머지 문자열이 다시 (100+1+ | 01)+ 를 만족하는지 재귀적으로 검사한다.&lt;/li&gt;
&lt;li data-end=&quot;2300&quot; data-start=&quot;2260&quot;&gt;어느 위치에서든 재귀 함수가 true 를 반환하면 전체도 true&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2402&quot; data-start=&quot;2301&quot;&gt;1들을 다 소비한 뒤
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2402&quot; data-start=&quot;2321&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2339&quot; data-start=&quot;2321&quot;&gt;문자열이 딱 끝났으면 &amp;rarr; 성공&lt;/li&gt;
&lt;li data-end=&quot;2402&quot; data-start=&quot;2343&quot;&gt;그 뒤에 문자가 더 있으면 &amp;rarr; 그 위치부터 다시 isContact 를 호출해 이어지는 패턴인지 검사&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;2043&quot; data-end=&quot;2052&quot; data-ke-size=&quot;size23&quot;&gt;(01) 패턴 동작 요약&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&quot;01&quot;이 정확히 나오는지 확인한다.&lt;/li&gt;
&lt;li&gt;&quot;01&quot;을 소비한 뒤&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열이 끝났을 경우 &amp;rarr; 성공&lt;/li&gt;
&lt;li&gt;그 뒤에 문자가 더 있으면 &amp;rarr; 그 위치부터 다시 isContact 를 호출해 이어지는 패턴인지 검사&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-end=&quot;2728&quot; data-start=&quot;2713&quot; data-ke-size=&quot;size26&quot;&gt;종료 조건과 결과&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2832&quot; data-start=&quot;2730&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2800&quot; data-start=&quot;2730&quot;&gt;재귀 호출이 문자열 끝까지 도달하면서 모든 구간이&lt;br /&gt;100+1+ 또는 01 패턴으로만 나누어지면 &amp;rarr; &quot;YES&quot;&lt;/li&gt;
&lt;li data-end=&quot;2832&quot; data-start=&quot;2801&quot;&gt;중간에 어느 위치에서든 패턴이 깨지면 &amp;rarr; &quot;NO&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;2848&quot; data-start=&quot;2839&quot; data-ke-size=&quot;size26&quot;&gt;시간 복잡도&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2964&quot; data-start=&quot;2850&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2964&quot; data-start=&quot;2850&quot;&gt;문자열 길이가 최대 200이고, 각 인덱스가 유효하게 검사되는 횟수는 제한적이라 최악의 경우 &lt;b&gt;O(N^2)&lt;/b&gt; 수준에서 충분히 통과 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1766399861503&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;

bool isContact(const string&amp;amp; str, int curIdx);

bool isContactFirst(const string&amp;amp; str, int curIdx)
{
	int idx = curIdx;

	if (idx + 3 &amp;gt;= str.size())
		return false;

	if (str[idx++] == '1' &amp;amp;&amp;amp; str[idx++] == '0' &amp;amp;&amp;amp; str[idx++] == '0')
	{

		while (idx &amp;lt; str.size() &amp;amp;&amp;amp; str[idx] == '0')
		{
			idx++;
		}

		if (idx &amp;gt;= str.size())
			return false;

		while (idx &amp;lt; str.size() &amp;amp;&amp;amp; str[idx] == '1')
		{
			idx++;

			if (idx &amp;gt;= str.size() || isContact(str, idx))
				return true;
		}
	}

	return false;
}

bool isContactSecond(const string&amp;amp; str, int curIdx)
{
	int idx = curIdx;

	if (idx + 1 &amp;gt;= str.size())
		return false;

	if (str[idx++] == '0' &amp;amp;&amp;amp; str[idx++] == '1')
	{
		if (idx &amp;gt;= str.size())
			return true;
		else
			return isContact(str, idx);
	}

	return false;
}

bool isContact(const string&amp;amp; str, int curIdx)
{
	return isContactFirst(str, curIdx) || isContactSecond(str, curIdx);
}

int main(void)
{
	int T;
	cin &amp;gt;&amp;gt; T;

	while (T--)
	{
		string str;
		cin &amp;gt;&amp;gt; str;

		if (isContact(str, 0))
			cout &amp;lt;&amp;lt; &quot;YES&quot; &amp;lt;&amp;lt; endl;
		else
			cout &amp;lt;&amp;lt; &quot;NO&quot; &amp;lt;&amp;lt; endl;
	}

	return 0;
}&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;2040&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s7FzB/dJMcahbVYny/NCPQt6Zk8U6KpDjExkfLn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s7FzB/dJMcahbVYny/NCPQt6Zk8U6KpDjExkfLn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s7FzB/dJMcahbVYny/NCPQt6Zk8U6KpDjExkfLn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs7FzB%2FdJMcahbVYny%2FNCPQt6Zk8U6KpDjExkfLn0%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;2040&quot; height=&quot;413&quot; data-origin-width=&quot;2040&quot; data-origin-height=&quot;413&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;</description>
      <category>알고리즘/BOJ</category>
      <author>대 혁</author>
      <guid isPermaLink="true">https://onlytrying.tistory.com/242</guid>
      <comments>https://onlytrying.tistory.com/242#entry242comment</comments>
      <pubDate>Mon, 22 Dec 2025 19:39:09 +0900</pubDate>
    </item>
    <item>
      <title>백준 17404번: RGP 거리 2</title>
      <link>https://onlytrying.tistory.com/241</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17404&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[문제 링크]&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차원 DP 문제였지만 3차원 DP로 풀어서 코드가 복잡해졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N번째 집의 경우 1번째 집의 색깔과 겹치면 안되기 때문에 이 조건을 처리하기 위해 1차원 더 추가해서 첫번째 집에 어떤 색깔을 칠했는지 캐싱했는데, 2차원 배열로 선언한 뒤 첫번째 집을 R, G, B 각각 칠했을 경우에 대해 각각 DP 로직을 수행해서 그중 가장 비용이 작은 값을 구해도 된다. 2차원 배열로 선언하는 방식이 캐싱하는데 필요한 메모리를 절약할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1758126438570&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;cmath&amp;gt;
#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt;
using namespace std;

#define INF 987654321
int memo[1000][3][3];

void bottomup(vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; costs, int N)
{
    int R = 0;
    int G = 1;
    int B = 2;
    
    memo[0][R][R] = costs[0][R];
    memo[0][G][G] = costs[0][G];
    memo[0][B][B] = costs[0][B];
    
    for(int i=1; i&amp;lt;N; i++)
    {
        if(i + 1 == N)
        {
            memo[i][R][G] = min(memo[i-1][R][R], memo[i-1][R][B]) + costs[i][G];
            memo[i][R][B] = min(memo[i-1][R][R], memo[i-1][R][G]) + costs[i][B];

            memo[i][G][R] = min(memo[i-1][G][G], memo[i-1][G][B]) + costs[i][R];
            memo[i][G][B] = min(memo[i-1][G][R], memo[i-1][G][G]) + costs[i][B];

            memo[i][B][R] = min(memo[i-1][B][G], memo[i-1][B][B]) + costs[i][R];
            memo[i][B][G] = min(memo[i-1][B][R], memo[i-1][B][B]) + costs[i][G];
        }
        else 
        {
            memo[i][R][R] = min(memo[i-1][R][G], memo[i-1][R][B]) + costs[i][R];
            memo[i][R][G] = min(memo[i-1][R][R], memo[i-1][R][B]) + costs[i][G];
            memo[i][R][B] = min(memo[i-1][R][R], memo[i-1][R][G]) + costs[i][B];

            memo[i][G][R] = min(memo[i-1][G][G], memo[i-1][G][B]) + costs[i][R];
            memo[i][G][G] = min(memo[i-1][G][R], memo[i-1][G][B]) + costs[i][G];
            memo[i][G][B] = min(memo[i-1][G][R], memo[i-1][G][G]) + costs[i][B];
            
            memo[i][B][R] = min(memo[i-1][B][G], memo[i-1][B][B]) + costs[i][R];
            memo[i][B][G] = min(memo[i-1][B][R], memo[i-1][B][B]) + costs[i][G];
            memo[i][B][B] = min(memo[i-1][B][R], memo[i-1][B][G]) + costs[i][B];
        }
    }
    
    int result = INF;
    for(int first = R; first&amp;lt;=B; ++first)
    {
        for(int here = R; here&amp;lt;=B; ++here)
        {
            if(here==first) continue;
            result = min(result, memo[N-1][first][here]);
        }
    }
    
    cout &amp;lt;&amp;lt; result;
}

int main(void)
{
    fill_n(memo[0][0], 1000*3*3, INF);
    
    int N;
    cin &amp;gt;&amp;gt; N;
    
    vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; costs(N, vector&amp;lt;int&amp;gt;(3));
    
    for(int i=0; i&amp;lt;N; ++i)
    {
        for(int j=0; j&amp;lt;3; ++j)
        {
            cin &amp;gt;&amp;gt; costs[i][j];
        }
    }
    
    bottomup(costs, N);
    
    return 0;
}&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;585&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Ygyt/btsQCKGe4Qh/X5k5TvPkLdEfcXOMuKZou0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Ygyt/btsQCKGe4Qh/X5k5TvPkLdEfcXOMuKZou0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Ygyt/btsQCKGe4Qh/X5k5TvPkLdEfcXOMuKZou0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Ygyt%2FbtsQCKGe4Qh%2FX5k5TvPkLdEfcXOMuKZou0%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;585&quot; height=&quot;490&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <author>대 혁</author>
      <guid isPermaLink="true">https://onlytrying.tistory.com/241</guid>
      <comments>https://onlytrying.tistory.com/241#entry241comment</comments>
      <pubDate>Thu, 18 Sep 2025 01:23:38 +0900</pubDate>
    </item>
    <item>
      <title>백준 9655번: 돌 게임</title>
      <link>https://onlytrying.tistory.com/240</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9655&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[문제 링크]&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 DP 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신의 차례에서 1개나 3개를 가져갔을 때 상대방이 승리하는지 여부는 가져간 개수에서 상대방이 1개나 3개를 가져갔을 때 자신이 승리하는지 여부에 결정된다. 그리고 이것을 계속 반복하다가 결국 기저사례 (N=1, N=2, N=3)에 도달하게 되면 최종적으로 승리와 패배가 결정되게 된다. 점화식은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dp(N) = !(DP(N-1) || DP(N-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;참고로 이 문제는 베스킨라빈스31 게임처럼 규칙 상 무조건 승리하는 필승법이 있다. 짝수개가 남도록 가져가면 결국 상대방이 패배한다. 즉 N이 홀수면 상근이가 이기고, 짝수면 창영이 이기게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1757949414012&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 memo[1001] = {false,};
bool visited[1001] = {false,};

bool Topdown(int remain)
{
    if(remain == 1 || remain == 3)
    {
        return true;
    }   
    else if(remain == 2)
    {
        return false;
    }
    
    if(visited[remain]) 
    {
        return memo[remain];        
    }
    
    visited[remain] = true;
    
    return memo[remain] = !(Topdown(remain-1) || Topdown(remain-3));
}

bool Bottomup(int remain)
{
    memo[1] = true;
    memo[2] = false;
    memo[3] = true;
    
    for(int i = 4; i&amp;lt;=remain; ++i)
    {
        memo[i] = !(memo[i-1] || memo[i-3]);
    }
    
    return memo[remain];
}

int main(void)
{
    int N;
    cin &amp;gt;&amp;gt; N;
    
    if(Topdown(N))
    {
        cout &amp;lt;&amp;lt; &quot;SK&quot;;
    }   
    else 
    {
        cout &amp;lt;&amp;lt; &quot;CY&quot;;
    }
    
    return 0;
}&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;484&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qBItv/btsQAZPUYXs/WLlCRcUTOCWwj4IWV30AG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qBItv/btsQAZPUYXs/WLlCRcUTOCWwj4IWV30AG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qBItv/btsQAZPUYXs/WLlCRcUTOCWwj4IWV30AG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqBItv%2FbtsQAZPUYXs%2FWLlCRcUTOCWwj4IWV30AG0%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;484&quot; height=&quot;320&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <category>DP</category>
      <author>대 혁</author>
      <guid isPermaLink="true">https://onlytrying.tistory.com/240</guid>
      <comments>https://onlytrying.tistory.com/240#entry240comment</comments>
      <pubDate>Tue, 16 Sep 2025 00:15:10 +0900</pubDate>
    </item>
    <item>
      <title>백준 2468번: 안전 영역</title>
      <link>https://onlytrying.tistory.com/239</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;[문제 링크]&quot; href=&quot;https://www.acmicpc.net/problem/2468&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/2468&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 BFS 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물높이가 0에서부터 지역 중 최고 높은 지역의 높이까지 경우에서 안전 영역의 개수를 계산하여 가장 많은 안전 영역의 개수를 출력해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안전 영역의 개수는 물높이보다 높은 지역을 시작으로 인접한 칸에 물높이보다 높은 지역이 있는지 탐색하는 BFS를 수행하면서 방문체크를 하고, 모든 좌표를 탐색했을 때 수행한 BFS 탐색의 수가 곧 안전 영역의 개수가 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1754282397822&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;queue&amp;gt;
using namespace std;

int getMaxSafeAreaCount(const vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt;&amp;amp; cityArr, int RainHeight)
{
	int N = cityArr.size();
	vector&amp;lt;vector&amp;lt;bool&amp;gt;&amp;gt; visited(N, vector&amp;lt;bool&amp;gt;(N, false));

	int safeAreaCount = 0;

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

	for(int y=0; y&amp;lt;N; y++)
		for (int x = 0; x &amp;lt; N; x++)
		{
			if (visited[y][x] || cityArr[y][x] &amp;lt;= RainHeight)
				continue;

			safeAreaCount++;

			queue&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; q;
			q.push({ y,x });
			visited[y][x] = true;

			while (!q.empty())
			{
				int hereY = q.front().first;
				int hereX = q.front().second;
				q.pop();

				for (int i = 0; i &amp;lt; 4; i++)
				{
					int nextY = hereY + dy[i];
					int nextX = hereX + dx[i];

					if (nextY &amp;gt;= 0 &amp;amp;&amp;amp; nextY &amp;lt; N &amp;amp;&amp;amp; nextX &amp;gt;= 0 &amp;amp;&amp;amp; nextX &amp;lt; N)
					{
						if (!visited[nextY][nextX] &amp;amp;&amp;amp; cityArr[nextY][nextX] &amp;gt; RainHeight)
						{
							q.push({ nextY, nextX });
							visited[nextY][nextX] = true;
						}
					}
				}

			}
		}

	return safeAreaCount;
}

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

	vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; cityArr(N, vector&amp;lt;int&amp;gt;(N));

	int maxHeight = 0;

	for(int y=0; y&amp;lt;N; y++)
		for (int x = 0; x &amp;lt; N; x++)
		{
			cin &amp;gt;&amp;gt; cityArr[y][x];
			maxHeight = max(maxHeight, cityArr[y][x]);
		}

	int maxSafeAreaCount = 0;

	for (int i = 0; i &amp;lt; maxHeight; i++)
	{
		maxSafeAreaCount = max(maxSafeAreaCount, getMaxSafeAreaCount(cityArr, i));
	}

	cout &amp;lt;&amp;lt; maxSafeAreaCount;

	return 0;
}&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;1203&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djvKCk/btsPFgstjkI/MRjDnfobkRo9oi8lgmRJU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djvKCk/btsPFgstjkI/MRjDnfobkRo9oi8lgmRJU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djvKCk/btsPFgstjkI/MRjDnfobkRo9oi8lgmRJU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjvKCk%2FbtsPFgstjkI%2FMRjDnfobkRo9oi8lgmRJU1%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;1203&quot; height=&quot;274&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <category>BFS</category>
      <author>대 혁</author>
      <guid isPermaLink="true">https://onlytrying.tistory.com/239</guid>
      <comments>https://onlytrying.tistory.com/239#entry239comment</comments>
      <pubDate>Mon, 4 Aug 2025 13:45:45 +0900</pubDate>
    </item>
    <item>
      <title>백준 1057번: 토너먼트</title>
      <link>https://onlytrying.tistory.com/238</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;[문제 링크]&quot; href=&quot;https://www.acmicpc.net/problem/1057&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/1057&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 구현 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 인원이 1명이 될 때 까지 라운드를 반복하다가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매치 트리에서 왼쪽에 있는 참가자 번호와 오른쪽에 있는 참가자 번호가 지민, 한수 번호와 일치한다면 해당 라운드 값을 출력해주면 된다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1754272602973&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;

int main(void)
{
	int jiminNum;
	int hansuNum;
	int maxNum;

	cin &amp;gt;&amp;gt; maxNum;
	cin &amp;gt;&amp;gt; jiminNum;
	cin &amp;gt;&amp;gt; hansuNum;

	int round = 0;
	bool isMatching = false;

	while (maxNum &amp;gt; 1 &amp;amp;&amp;amp; !isMatching)
	{
		round++;

		int matchNum = 0;

		for (int i = 1; i &amp;lt;= maxNum; i += 2)
		{
			matchNum++;

			int leftNum = i;
			int rightNum = i + 1;

			if (leftNum == jiminNum || rightNum == jiminNum)
			{
				jiminNum = matchNum;

				if (rightNum == hansuNum || leftNum == hansuNum)
				{
					isMatching = true;
					break;
				}
			}
			else if (leftNum == hansuNum || rightNum == hansuNum)
			{
				hansuNum = matchNum;
			}
		}

		maxNum = matchNum * 2 &amp;lt; maxNum ? matchNum + 1 : matchNum;
	}

	if (isMatching)
		cout &amp;lt;&amp;lt; round;
	else
		cout &amp;lt;&amp;lt; -1;

	return 0;
}&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;1215&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0exoT/btsPFB3UZqd/QXTW9AvVP79gpEInc4aNU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0exoT/btsPFB3UZqd/QXTW9AvVP79gpEInc4aNU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0exoT/btsPFB3UZqd/QXTW9AvVP79gpEInc4aNU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0exoT%2FbtsPFB3UZqd%2FQXTW9AvVP79gpEInc4aNU0%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;1215&quot; height=&quot;177&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <author>대 혁</author>
      <guid isPermaLink="true">https://onlytrying.tistory.com/238</guid>
      <comments>https://onlytrying.tistory.com/238#entry238comment</comments>
      <pubDate>Mon, 4 Aug 2025 10:58:08 +0900</pubDate>
    </item>
    <item>
      <title>백준 25206번: 너의 평점은</title>
      <link>https://onlytrying.tistory.com/236</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[문제 링크]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/25206&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/25206&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 이용하는간단한 구현 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등급에 따른 과목평점을 Map 컨테이너에 담아서 간단하게 매칭시켰다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1742528098686&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;map&amp;gt;
using namespace std;

void gradeMapping(map&amp;lt;string, float&amp;gt;&amp;amp; gradeScoreMap) {
	gradeScoreMap[&quot;A+&quot;] = 4.5f;
	gradeScoreMap[&quot;A0&quot;] = 4.0f;
	gradeScoreMap[&quot;B+&quot;] = 3.5f;
	gradeScoreMap[&quot;B0&quot;] = 3.0f;
	gradeScoreMap[&quot;C+&quot;] = 2.5f;
	gradeScoreMap[&quot;C0&quot;] = 2.0f;
	gradeScoreMap[&quot;D+&quot;] = 1.5f;
	gradeScoreMap[&quot;D0&quot;] = 1.0f;
	gradeScoreMap[&quot;F&quot;] = 0.0f;
}

int main(void) {
	map&amp;lt;string, float&amp;gt; gradeScoreMap;
	gradeMapping(gradeScoreMap);

	float credit = 0;
	float totalCredit = 0;

	for (int i = 0; i &amp;lt; 20; i++) {
		string subjectStr, creditStr, gradeStr;
		cin &amp;gt;&amp;gt; subjectStr &amp;gt;&amp;gt; creditStr &amp;gt;&amp;gt; gradeStr;
		if (gradeStr == &quot;P&quot;)
			continue;
		else {
			float nowCredit = stof(creditStr);
			float nowGrade = gradeScoreMap[gradeStr];
			credit += nowCredit;
			totalCredit += nowCredit * nowGrade;
		}
	}

	cout &amp;lt;&amp;lt; totalCredit / credit &amp;lt;&amp;lt; endl;

	return 0;
}&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;892&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qS9z3/btsMQGOHEa5/12IFX7SVpYBJMylRjidNjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qS9z3/btsMQGOHEa5/12IFX7SVpYBJMylRjidNjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qS9z3/btsMQGOHEa5/12IFX7SVpYBJMylRjidNjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqS9z3%2FbtsMQGOHEa5%2F12IFX7SVpYBJMylRjidNjK%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;892&quot; height=&quot;447&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <author>대 혁</author>
      <guid isPermaLink="true">https://onlytrying.tistory.com/236</guid>
      <comments>https://onlytrying.tistory.com/236#entry236comment</comments>
      <pubDate>Fri, 21 Mar 2025 12:34:33 +0900</pubDate>
    </item>
    <item>
      <title>백준 7569번: 토마토</title>
      <link>https://onlytrying.tistory.com/235</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7569&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[문제 링크]&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1692293304114&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;7569번: 토마토&quot; data-og-description=&quot;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M &amp;le; 100, 2 &amp;le; N &amp;le; 100, &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/7569&quot; data-og-url=&quot;https://www.acmicpc.net/problem/7569&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8sVvt/hyTFa1ELMZ/D3Ck19t0S24hfzek3xpAdK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/07iTM/hyTFg8CWha/lMaxYQf0VpsU22m7j42rf1/img.png?width=402&amp;amp;height=504&amp;amp;face=0_0_402_504&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/7569&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/7569&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8sVvt/hyTFa1ELMZ/D3Ck19t0S24hfzek3xpAdK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/07iTM/hyTFg8CWha/lMaxYQf0VpsU22m7j42rf1/img.png?width=402&amp;amp;height=504&amp;amp;face=0_0_402_504');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;7569번: 토마토&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M &amp;le; 100, 2 &amp;le; N &amp;le; 100,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://onlytrying.tistory.com/229&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://onlytrying.tistory.com/229&lt;/a&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전에 풀었던 토마토 문제와 동일한 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차이점은 상자의 상태가 3차원 배열이라는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 기존의 구현 코드에서 상자를 3차원 배열로 변경하고 Z 좌표가 바뀌는 경우를 추가해주었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;pre id=&quot;code_1692293935360&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;cstring&amp;gt;
#include &amp;lt;queue&amp;gt;
using namespace std;

struct boxPos {
	int z, y, x;
};

int M, N, H;
int box[101][101][101];
queue&amp;lt;boxPos&amp;gt; ripeTomatoPosQ;
int dz[6] = { 0,0,0,0,1,-1 };
int dy[6] = { 0,0,1,-1,0,0 };
int dx[6] = { 1,-1,0,0,0,0 };

int getDay(int unripeTomato) {
	int day = 0;

	while (unripeTomato &amp;gt; 0) {
		day++;

		int newRipeTomatoCnt = ripeTomatoPosQ.size();
		// 안익은 토마토가 남아있는 상태에서 새롭게 익은 토마토가 없다면 토마토를 모두 익히는건 불가능하다.
		if (newRipeTomatoCnt == 0)
			return -1;

		for (int i = 0; i &amp;lt; newRipeTomatoCnt; i++) {
			int hereZ = ripeTomatoPosQ.front().z;
			int hereY = ripeTomatoPosQ.front().y;
			int hereX = ripeTomatoPosQ.front().x;
			ripeTomatoPosQ.pop();

			// 주변의 토마토를 익힌다.
			for (int i = 0; i &amp;lt; 6; i++) {
				int nearZ = hereZ + dz[i];
				int nearY = hereY + dy[i];
				int nearX = hereX + dx[i];

				if (nearZ &amp;gt;= 0 &amp;amp;&amp;amp; nearZ &amp;lt; H &amp;amp;&amp;amp; nearY &amp;gt;= 0 &amp;amp;&amp;amp; nearY &amp;lt; N &amp;amp;&amp;amp; nearX &amp;gt;= 0 &amp;amp;&amp;amp; nearX &amp;lt; M)
					if (box[nearZ][nearY][nearX] == 0) {
						// 안익은 토마토를 익은 토마토로 바꾸고 안익은 토마토의 갯수를 1 감소시킨다.
						box[nearZ][nearY][nearX] = 1;
						unripeTomato--;

						// 새롭게 익은 토마토의 좌표를 큐에 담는다.
						ripeTomatoPosQ.push({ nearZ, nearY, nearX });
					}
			}
		}
	}

	return day;
}

int main(void) {
	cin.tie(0);
	ios_base::sync_with_stdio(0);

	cin &amp;gt;&amp;gt; M &amp;gt;&amp;gt; N &amp;gt;&amp;gt; H;

	int unripeTomato = 0;
	for (int z = 0; z &amp;lt; H; z++) {
		for (int y = 0; y &amp;lt; N; y++) {
			for (int x = 0; x &amp;lt; M; x++) {
				int state;
				cin &amp;gt;&amp;gt; state;
				box[z][y][x] = state;
				if (state == 0)
					unripeTomato++;
				else if (state == 1)
					ripeTomatoPosQ.push({ z,y,x });
			}
		}
	}

	cout &amp;lt;&amp;lt; getDay(unripeTomato) &amp;lt;&amp;lt; endl;

	return 0;
}&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;979&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baVJA3/btsrDF2ixQh/3U3Qukd1ldK8iXyMh2fer0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baVJA3/btsrDF2ixQh/3U3Qukd1ldK8iXyMh2fer0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baVJA3/btsrDF2ixQh/3U3Qukd1ldK8iXyMh2fer0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaVJA3%2FbtsrDF2ixQh%2F3U3Qukd1ldK8iXyMh2fer0%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;979&quot; height=&quot;241&quot; data-origin-width=&quot;979&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>알고리즘/BOJ</category>
      <category>BFS</category>
      <category>그래프탐색</category>
      <author>대 혁</author>
      <guid isPermaLink="true">https://onlytrying.tistory.com/235</guid>
      <comments>https://onlytrying.tistory.com/235#entry235comment</comments>
      <pubDate>Fri, 18 Aug 2023 02:39:43 +0900</pubDate>
    </item>
  </channel>
</rss>