<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>.</title>
    <link>https://acatistory.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 22:59:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ACA_</managingEditor>
    <item>
      <title>1068번 : 트리</title>
      <link>https://acatistory.tistory.com/103</link>
      <description>&lt;h1&gt;&lt;span&gt;트리&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;성공&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시간 제한&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 제한&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;제출&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;맞은 사람&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답 비율&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 초&lt;/td&gt;
&lt;td&gt;128 MB&lt;/td&gt;
&lt;td&gt;13353&lt;/td&gt;
&lt;td&gt;3025&lt;/td&gt;
&lt;td&gt;2430&lt;/td&gt;
&lt;td&gt;25.239%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;트리에서 리프 노드란, 자식의 개수가 0인 노드를 말한다.&lt;/p&gt;
&lt;p&gt;트리가 주어졌을 때, 노드 중 하나를 제거할 것이다. 그 때, 남은 트리에서 리프 노드의 개수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p&gt;예를 들어, 다음과 같은 트리가 있다고 하자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;264&quot; height=&quot;254&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/13Wan/btqClxIzPFF/LV3g3vblxk2D3OG9H4Hvv0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/13Wan/btqClxIzPFF/LV3g3vblxk2D3OG9H4Hvv0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/13Wan/btqClxIzPFF/LV3g3vblxk2D3OG9H4Hvv0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F13Wan%2FbtqClxIzPFF%2FLV3g3vblxk2D3OG9H4Hvv0%2Fimg.jpg&quot; width=&quot;264&quot; height=&quot;254&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;현재 리프 노드의 개수는 3개이다. (초록색 색칠된 노드) 이때, 1번을 제거한다고 하면, 다음과 같이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; width=&quot;264&quot; height=&quot;254&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zLUsW/btqCoRGkanh/kOKth14wtL35VWxItOkeqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zLUsW/btqCoRGkanh/kOKth14wtL35VWxItOkeqk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zLUsW/btqCoRGkanh/kOKth14wtL35VWxItOkeqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzLUsW%2FbtqCoRGkanh%2FkOKth14wtL35VWxItOkeqk%2Fimg.jpg&quot; width=&quot;264&quot; height=&quot;254&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;이제 리프 노드의 개수는 1개이다.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 입력으로 주어진 트리에서 입력으로 주어진 노드를 지웠을 때, 리프 노드의 개수를 출력한다.&lt;/p&gt;
&lt;h2&gt;예제 입력&lt;/h2&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;-1 0 0 1 1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;h2&gt;예제 출력&lt;/h2&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;cpp&quot; style=&quot;font-size:15px&quot;&gt;

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

int numberof_leaf = 0;

struct Node
{
	int numberof_child = 0;
	std::vector&lt;Node*&gt; parent_list;
	std::vector&lt;Node*&gt; child_list;
};

void Search(Node* node)
{
	if (node-&gt;numberof_child == 0)
		numberof_leaf++;

	for (int ii = 0; ii &lt; node-&gt;child_list.size(); ii++)
	{
		if(node-&gt;child_list[ii] != nullptr)
			Search(node-&gt;child_list[ii]);	
	}
}


int main()
{
	Node* arr[50];

	int N = 0;
	int parent = 0;
	
	std::cin &gt;&gt; N;

	for (int ii = 0; ii &lt; N; ii++)
		arr[ii] = new Node();

	Node** root_node = nullptr;

	for (int ii = 0; ii &lt; N; ii++)
	{
		std::cin &gt;&gt; parent;

		if (parent != -1)
		{
			arr[parent]-&gt;child_list.push_back(arr[ii]);
			arr[parent]-&gt;numberof_child++;
			arr[ii]-&gt;parent_list.push_back(arr[parent]);
		}
		else
			root_node = &amp;arr[ii];
	}
	
	int delete_node;
	std::cin &gt;&gt; delete_node;

	for (int ii = 0; ii &lt; arr[delete_node]-&gt;parent_list.size(); ii++)
	{
		if (arr[delete_node]-&gt;parent_list[ii] != nullptr)
		{
			for (int jj = 0; jj &lt; arr[delete_node]-&gt;parent_list[ii]-&gt;child_list.size(); jj++)
			{
				if (arr[delete_node]-&gt;parent_list[ii]-&gt;child_list[jj] == arr[delete_node])
				{
					arr[delete_node]-&gt;parent_list[ii]-&gt;numberof_child--;
					arr[delete_node]-&gt;parent_list[ii]-&gt;child_list[jj] = nullptr;
				}
			}
		}
	}

	delete arr[delete_node];
	arr[delete_node] = nullptr;

	if(*root_node != nullptr)
		Search(*root_node);

	std::cout &lt;&lt; numberof_leaf;
}







&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;문자 그대로의 풀이였다.&lt;/p&gt;
&lt;p&gt;대신 부모 노드가 지워질 때, 자식 노드가 부모랑 연결되어있는지를 체크하는게 좀 번거로웠다.&lt;/p&gt;
&lt;p&gt;그래서 그냥 자식노드도 부모노드가 누군지 알 수 있게 부모 리스트를 만드는 것으로 해결.&lt;/p&gt;
&lt;p&gt;짧은 사람들의 코드를 봤더니, parent_list를 쓴다던가 해서 트리 대신 배열로만 구현하는 방법도 있더라.&lt;/p&gt;
&lt;p&gt;나같이 동적할당이 필수로 들어가는것보단 훨씬 세련된 방법인것 같지만, 트리스럽지는 않더라.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;간과했던점은, 루트가 항상 처음에 들어오진 않는다는 것(ex. 0 0 1 2 -1)&lt;/p&gt;
&lt;p&gt;또한, 자식이 부모보다 먼저 들어올 수 있다는 점(미리 전부 할당을 해 놓아야 한다)&lt;/p&gt;
&lt;p&gt;그리고 child_list노드를 지우지 않고 nullptr로 만들기 때문에 .size()로는 개수를 정확히 알 수 없어서 따로 카운트를 했어야 한다는 점&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스</category>
      <author>ACA_</author>
      <guid isPermaLink="true">https://acatistory.tistory.com/103</guid>
      <comments>https://acatistory.tistory.com/103#entry103comment</comments>
      <pubDate>Mon, 2 Mar 2020 13:22:43 +0900</pubDate>
    </item>
    <item>
      <title>7576 토마토(BFS)</title>
      <link>https://acatistory.tistory.com/102</link>
      <description>&lt;h1&gt;&lt;span&gt;토마토&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;성공&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시간 제한&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 제한&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;제출&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;맞은 사람&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답 비율&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 초&lt;/td&gt;
&lt;td&gt;256 MB&lt;/td&gt;
&lt;td&gt;59403&lt;/td&gt;
&lt;td&gt;19371&lt;/td&gt;
&lt;td&gt;12202&lt;/td&gt;
&lt;td&gt;31.318%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자 모양 상자의 칸에 하나씩 넣어서 창고에 보관한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rxq9P/btqCkQBAR2V/KLAEh659URnR04UVzSKyX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rxq9P/btqCkQBAR2V/KLAEh659URnR04UVzSKyX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rxq9P/btqCkQBAR2V/KLAEh659URnR04UVzSKyX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frxq9P%2FbtqCkQBAR2V%2FKLAEh659URnR04UVzSKyX0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지, 그 최소 일수를 알고 싶어 한다.&lt;/p&gt;
&lt;p&gt;토마토를 창고에 보관하는 격자모양의 상자들의 크기와 익은 토마토들과 익지 않은 토마토들의 정보가 주어졌을 때, 며칠이 지나면 토마토들이 모두 익는지, 그 최소 일수를 구하는 프로그램을 작성하라. 단, 상자의 일부 칸에는 토마토가 들어있지 않을 수도 있다.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 &amp;le; M,N &amp;le; 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 상자에 담긴 토마토의 정보가 주어진다. 하나의 줄에는 상자 가로줄에 들어있는 토마토의 상태가 M개의 정수로 주어진다. 정수 1은 익은 토마토, 정수 0은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않은 칸을 나타낸다.&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;여러분은 토마토가 모두 익을 때까지의 최소 날짜를 출력해야 한다. 만약, 저장될 때부터 모든 토마토가 익어있는 상태이면 0을 출력해야 하고, 토마토가 모두 익지는 못하는 상황이면 -1을 출력해야 한다.&lt;/p&gt;
&lt;h2&gt;예제 입력&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;6 4&lt;/p&gt;
&lt;p&gt;0 0 0 0 0 0&lt;/p&gt;
&lt;p&gt;0 0 0 0 0 0&lt;/p&gt;
&lt;p&gt;0 0 0 0 0 0&lt;/p&gt;
&lt;p&gt;0 0 0 0 0 1&lt;/p&gt;
&lt;h2&gt;예제 출력&lt;/h2&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;cpp&quot; style=&quot;font-size:15px&quot;&gt;

#include 
#include 
#include 

int map[1001][1001];
int col = 0, row = 0;
std::queue&amp;lt;std::pair&amp;lt;int, int&amp;gt;&amp;gt; que;
int time = 0;
int ripen_tomato = 0;
int empty_tomato = 0;
int numberof_tomatoes = 0;

void BFS()
{
	while (que.size() &amp;gt; 0)
	{
		int size = que.size();
		bool is_connected = false;
		for (int ii = 0; ii &amp;lt; size; ii++)
		{
			std::pair&amp;lt;int, int&amp;gt; pos = que.front(); // first: row, second : col
			que.pop();

			if (pos.second - 1 != 0)
			{
				if (map[pos.first][pos.second - 1] == 0)
				{
					ripen_tomato++;
					map[pos.first][pos.second - 1] = 1;
					que.push(std::pair&amp;lt;int, int&amp;gt;(pos.first, pos.second - 1));
					is_connected = true;
				}
			}
			if (pos.second + 1 &amp;lt;= col)
			{
				if (map[pos.first][pos.second + 1] == 0)
				{
					ripen_tomato++;
					map[pos.first][pos.second + 1] = 1;
					que.push(std::pair&amp;lt;int, int&amp;gt;(pos.first, pos.second + 1));
					is_connected = true;
				}
			}
			if (pos.first - 1 != 0)
			{
				if (map[pos.first - 1][pos.second] == 0)
				{
					ripen_tomato++;
					map[pos.first - 1][pos.second] = 1;
					que.push(std::pair&amp;lt;int, int&amp;gt;(pos.first - 1, pos.second));
					is_connected = true;
				}
			}
			if (pos.first + 1 &amp;lt;= row)
			{
				if (map[pos.first + 1][pos.second] == 0)
				{
					ripen_tomato++;
					map[pos.first + 1][pos.second] = 1;
					que.push(std::pair&amp;lt;int, int&amp;gt;(pos.first + 1, pos.second));
					is_connected = true;
				}
			}
		}

		if(is_connected) //4방향 중 하나라도 숙성 과정 진행(다 막혀있거나 하면 숙성이 진행되지 않았으므로 time 증가하면 안됨)
			time++;

		is_connected = false;

		if (ripen_tomato &amp;gt;= numberof_tomatoes) //토마토가 모두 숙성
		{
			std::cout &amp;lt;&amp;lt; time;
			return;
		}
	}
	std::cout &amp;lt;&amp;lt; -1; //진행불가 상황. 큐가 비었는데도 토마토 갯수가 모자람

}


int main()
{
	std::cin &amp;gt;&amp;gt; col &amp;gt;&amp;gt; row;

	for (int ii = 1; ii &amp;lt;= row; ii++)
	{
		for (int jj = 1; jj &amp;lt;= col; jj++)
		{
			std::cin &amp;gt;&amp;gt; map[ii][jj];

			if (map[ii][jj] == 1)
			{
				que.push(std::pair&amp;lt;int, int&amp;gt;(ii, jj));
				ripen_tomato++;
			}
			else if (map[ii][jj] == -1)
				empty_tomato++;
		}
	}

	numberof_tomatoes = row * col - empty_tomato;
	
	BFS();
}



&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예외사항이 너무 많아져서 좀 까다로웠던 문제. 토마토가 숙성이 불가능한 상황을 어떻게 알아낼 것인가?&lt;/p&gt;
&lt;p&gt;처음 생각한 방법은&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. 이전의 숙성 토마수 개수를 저장해놓고,&amp;nbsp; 탐색을 진행해서 숙성수치가 이전타임과 변하지 않으면 진행불가로 판정.&lt;/b&gt; 을 생각해보았으나&lt;/p&gt;
&lt;p&gt;서로가 토마토를 숙성시키는 과정에서 다른 큐 멤버의 숙성때문에 자신의 숙성(1로변환)이 막히는 경우에도 숙성수치가 변하지 않으므로 진행불가가 되는 문제가 있었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. 그래서 숙성비교를 두 턴으로 늘릴까?&lt;/b&gt; --&amp;gt; 너무 예외가 생길 가능성이 높은 방법이며 부정확&lt;/p&gt;
&lt;p&gt;3. &lt;b&gt;시작할 때 모든 노드의 전후좌우(자식들)을 비교해서 -1로 막혀있으면 진행불가?&lt;/b&gt; -&amp;gt; 정확한 방법이지만 전체를 한번 쭉 탐색해야함. 진행불가 상황이 아니라면 시간적 손해&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;등의 방법을 생각해보았고, &lt;b&gt;결론은 그냥 큐에 노드가 모두 비었는데도 숙성 토마토 갯수가 전체 숙성되어야하는 토마토 갯수보다 작으면 -1를 출력하는 간단한 방법이었다...&lt;/b&gt;&lt;/p&gt;</description>
      <category>프로그래머스</category>
      <author>ACA_</author>
      <guid isPermaLink="true">https://acatistory.tistory.com/102</guid>
      <comments>https://acatistory.tistory.com/102#entry102comment</comments>
      <pubDate>Mon, 2 Mar 2020 11:21:52 +0900</pubDate>
    </item>
    <item>
      <title>BFS 두 문제</title>
      <link>https://acatistory.tistory.com/101</link>
      <description>&lt;h1&gt;&lt;span&gt;미로 탐색&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;성공&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%; height: 40px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시간 제한&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 제한&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;제출&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;맞은 사람&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답 비율&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;1 초&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;192 MB&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;62619&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;22706&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;14445&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;35.210%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;N&amp;times;M크기의 배열로 표현되는 미로가 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;0&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;0&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;0&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;0&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;0&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;0&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;0&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;1&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.&lt;/p&gt;
&lt;p&gt;위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 두 정수 N, M(2 &amp;le; N, M &amp;le; 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;붙어서&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;입력으로 주어진다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.&lt;/p&gt;
&lt;h2&gt;예제 입력&lt;/h2&gt;
&lt;p&gt;4 6&lt;/p&gt;
&lt;p&gt;101111&lt;/p&gt;
&lt;p&gt;101010&lt;/p&gt;
&lt;p&gt;101011&lt;/p&gt;
&lt;p&gt;111011&lt;/p&gt;
&lt;h2&gt;예제 출력&lt;/h2&gt;
&lt;p&gt;15&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;cpp&quot; style=&quot;font-size:16px&quot;&gt;
#include 
#include 
#include 

int map[101][101];
std::queue&amp;lt;std::pair&amp;lt;int,int&amp;gt;&amp;gt; que;
int n = 0, m = 0;
int dist = 0;


void BFS()
{
	que.push(std::pair&amp;lt;int, int&amp;gt;(1, 1));
	dist++;
	while (!que.empty())
	{		
		int size = que.size();

		for (int ii = 0; ii &amp;lt; size; ii++)
		{
			std::pair&amp;lt;int, int&amp;gt; pair = que.front();
			que.pop();
			int row = pair.first;
			int col = pair.second;
			map[row][col] = 0;

			if (row == n &amp;amp;&amp;amp; col == m)
				std::cout &amp;lt;&amp;lt; dist &amp;lt;&amp;lt; std::endl;

			if (map[row - 1][col] == 1) //up
			{
				map[row - 1][col] = 0;
				que.emplace(std::pair&amp;lt;int, int&amp;gt;(row - 1, col));
			}
			if (map[row + 1][col] == 1) //down
			{
				map[row + 1][col] = 0;
				que.emplace(std::pair&amp;lt;int, int&amp;gt;(row + 1, col));
			}
			if (map[row][col - 1] == 1) //left
			{
				map[row][col - 1] = 0;
				que.emplace(std::pair&amp;lt;int, int&amp;gt;(row, col - 1));
			}
			if (map[row][col + 1] == 1) //right
			{
				map[row][col + 1] = 0;
				que.emplace(std::pair&amp;lt;int, int&amp;gt;(row, col + 1));
			}
		}

		dist++;
		
	}
}

int main()
{
	
	std::cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;

	for (int ii = 1; ii &amp;lt;= n; ii++)
	{
		std::string str;
		std::cin &amp;gt;&amp;gt; str;
		for (int j = 1; j &amp;lt;= m; j++)
		{
			map[ii][j] = str[j - 1] - '0';
		}
	}

	BFS();

}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;숨바꼭질&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;성공&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h1&gt;
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%; height: 40px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시간 제한&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 제한&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;제출&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;맞은 사람&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답 비율&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;2 초&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;128 MB&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;69336&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;18873&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;11747&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;24.675%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;수빈이는 동생과&amp;nbsp;숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 &amp;le; N &amp;le; 100,000)에 있고, 동생은 점 K(0 &amp;le; K &amp;le; 100,000)에&amp;nbsp;있다.&amp;nbsp;수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.&lt;/p&gt;
&lt;p&gt;수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다.&amp;nbsp;N과 K는 정수이다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.&lt;/p&gt;
&lt;h2&gt;예제 입력&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;5 17&lt;/p&gt;
&lt;h2&gt;예제 출력&lt;/h2&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;h2&gt;힌트&lt;/h2&gt;
&lt;p&gt;수빈이가 5-10-9-18-17 순으로 가면 4초만에 동생을 찾을 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;cpp&quot; style=&quot;font-size:16px&quot;&gt;

#include 
#include 
#include 

//int* visit;
//int* road;
int visit[100001];
std::queue que;
int sec = 0;

void BFS(int SuzinPos, int DestPos)
{
	que.push(SuzinPos);

	while (!que.empty())
	{
		int size = que.size();
		for (int ii = 0; ii &amp;lt; size; ii++)
		{
			int pos = que.front();
			que.pop();

			if (pos == DestPos)
			{
				std::cout &amp;lt;&amp;lt; sec;
				return;
			}

			if (pos - 1 &amp;gt;= 0 &amp;amp;&amp;amp; visit[pos - 1] == 0)
			{
				visit[pos - 1] = 1;
				que.push(pos - 1);
			}
			if (pos + 1 &amp;lt;= 100001 &amp;amp;&amp;amp; visit[pos + 1] == 0)
			{
				visit[pos + 1] = 1;
				que.push(pos + 1);
			}
			if (pos * 2 &amp;lt;= 100001 &amp;amp;&amp;amp; visit[pos * 2] == 0)
			{
				visit[pos * 2] = 1;
				que.push(pos * 2);
			}
		}

		sec++;
	}


}


int main()
{
	int N, K;
	std::cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; K;
	BFS(N, K);
}


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;간단한 DFS 두문제에 이어 간단한 BFS 두 문제&lt;/p&gt;
&lt;p&gt;간단한 문제인데도 한달동안 까먹어서 많이 버벅였다.&lt;/p&gt;
&lt;p&gt;DFS/BFS는 패턴이 비슷해서 자주자주 봐둬서 체화하면 잊어버리지 않을 것 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스</category>
      <author>ACA_</author>
      <guid isPermaLink="true">https://acatistory.tistory.com/101</guid>
      <comments>https://acatistory.tistory.com/101#entry101comment</comments>
      <pubDate>Fri, 28 Feb 2020 12:55:28 +0900</pubDate>
    </item>
    <item>
      <title>DFS 두 문제</title>
      <link>https://acatistory.tistory.com/100</link>
      <description>&lt;h1&gt;&lt;span&gt;단지번호붙이기&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%; height: 40px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시간 제한&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 제한&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;제출&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;맞은 사람&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답 비율&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;1 초&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;128 MB&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;51479&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;20190&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;12977&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;37.938%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;&amp;lt;그림 1&amp;gt;과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. &amp;lt;그림 2&amp;gt;는 &amp;lt;그림 1&amp;gt;을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgrgKe/btqCgSTwX8m/93Rx82JguHKHaK0Gohvgh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgrgKe/btqCgSTwX8m/93Rx82JguHKHaK0Gohvgh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgrgKe/btqCgSTwX8m/93Rx82JguHKHaK0Gohvgh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgrgKe%2FbtqCgSTwX8m%2F93Rx82JguHKHaK0Gohvgh0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5&amp;le;N&amp;le;25)이 입력되고, 그 다음 N줄에는 각각 N개의 자료(0혹은 1)가 입력된다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;첫 번째 줄에는 총 단지수를 출력하시오. 그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.&lt;/p&gt;
&lt;h2&gt;예제 입력 1&lt;/h2&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;0110100&lt;/p&gt;
&lt;p&gt;0110101&lt;/p&gt;
&lt;p&gt;1110101&lt;/p&gt;
&lt;p&gt;0000111&lt;/p&gt;
&lt;p&gt;0100000&lt;/p&gt;
&lt;p&gt;0111110&lt;/p&gt;
&lt;p&gt;0111000&lt;/p&gt;
&lt;h2&gt;예제 출력 1&lt;span&gt; &lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;3 7 8 9&lt;/p&gt;
&lt;h2&gt;출처&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.acmicpc.net/category/2&quot;&gt;Olympiad&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.acmicpc.net/category/55&quot;&gt;한국정보올림피아드&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.acmicpc.net/category/82&quot;&gt;KOI 1996&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.acmicpc.net/category/detail/403&quot;&gt;초등부&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;1번&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;잘못된 데이터를 찾은 사람:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.acmicpc.net/user/djm03178&quot;&gt;djm03178&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;데이터를 추가한 사람:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.acmicpc.net/user/djm03178&quot;&gt;djm03178&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.acmicpc.net/user/jh05013&quot;&gt;jh05013&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;문제의 오타를 찾은 사람:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.acmicpc.net/user/metadata&quot;&gt;metadata&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;font-size: 1.25em;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;cpp&quot; style=&quot;font-size:15px&quot;&gt;

#include 
#include 
#include 
#include 
#include 

int map[26][26] = { 0 };
std::vector count_list;
int count = 0;

void DFS(int ii, int jj)
{
	if (map[ii][jj] == 0)
		return;

	count++;
	map[ii][jj] = 0;

	if (map[ii][jj - 1] == 1)
		DFS(ii, jj - 1);
	if (map[ii][jj + 1] == 1)
		DFS(ii, jj + 1);
	if (map[ii + 1][jj] == 1)
		DFS(ii + 1, jj);
	if (map[ii - 1][jj] == 1)
		DFS(ii - 1, jj);
}

int main()
{

	int n = 0, k = 0;
	std::cin &amp;gt;&amp;gt; n;
	
	for (int ii = 1; ii &amp;lt;= n; ii++)
	{
		std::string str;
		std::cin &amp;gt;&amp;gt; str;
		for (int j = 1; j &amp;lt;= n; j++)
		{
			map[ii][j] = str[j - 1] - '0';
		}
	}

	for (int ii = 1; ii &amp;lt;= n; ii++)
	{
		for (int j = 1; j &amp;lt;= n; j++)
		{
			count = 0;
			DFS(ii, j);
			
			if (count &amp;gt; 0)
				count_list.push_back(count);
		}
	}

	std::cout &amp;lt;&amp;lt; count_list.size() &amp;lt;&amp;lt; std::endl;
	std::sort(count_list.begin(), count_list.end());
	for (int ii = 0; ii &amp;lt; count_list.size(); ii++)
		std::cout &amp;lt;&amp;lt; count_list[ii] &amp;lt;&amp;lt; std::endl;

	//system(&quot;pause&quot;);
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;DFS와 BFS&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;성공&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table id=&quot;problem-info&quot; style=&quot;border-collapse: collapse; width: 100%; height: 40px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시간 제한&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;메모리 제한&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;제출&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;정답&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;맞은 사람&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;정답&lt;/b&gt; 비율&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;2 초&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;128 MB&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;85742&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;27997&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;16270&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;31.343%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;문제&lt;/h2&gt;
&lt;p&gt;그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다.&amp;nbsp;정점 번호는 1번부터 N번까지이다.&lt;/p&gt;
&lt;h2&gt;입력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 정점의 개수 N(1 &amp;le; N &amp;le; 1,000), 간선의 개수 M(1 &amp;le; M &amp;le; 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.&lt;/p&gt;
&lt;h2&gt;출력&lt;/h2&gt;
&lt;p&gt;첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.&lt;/p&gt;
&lt;h2&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;p&gt;4 5 1&lt;/p&gt;
&lt;p&gt;1 2&lt;/p&gt;
&lt;p&gt;1 3&lt;/p&gt;
&lt;p&gt;1 4&lt;/p&gt;
&lt;p&gt;2 4&lt;/p&gt;
&lt;p&gt;3 4&lt;/p&gt;
&lt;h2&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;복사&lt;/h2&gt;
&lt;p&gt;1 2 4 3&lt;/p&gt;
&lt;p&gt;1 2 3 4&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;cpp&quot; style=&quot;font-size:15px&quot;&gt;

#include 
#include 
#include 

int map[1001][1001] = { 0 };
int vert_count = 0;

int count = 0;
int visit[1001] = { 0 };
int bfs_visit[1001] = { 0 };
std::queue bfs;


void DFS(int ii)
{
	visit[ii] = 1;
	std::cout &amp;lt;&amp;lt; ii &amp;lt;&amp;lt; &quot; &quot;;

	for (int j = 1; j &amp;lt;= vert_count; j++)
	{
		if (map[ii][j] == 1 &amp;amp;&amp;amp; visit[j] == 0)
			DFS(j);
	}
}

void BFS(int ii)
{
	bfs_visit[ii] = 1;

	for (int j = 1; j &amp;lt;= vert_count; j++)
	{
		if (map[ii][j] == 1 &amp;amp;&amp;amp; bfs_visit[j] == 0)
		{
			bfs.push(j);
			bfs_visit[j] = 1;
		}
	}
	std::cout &amp;lt;&amp;lt; bfs.front() &amp;lt;&amp;lt; &quot; &quot;;
	bfs.pop();

	if (bfs.size() == 0)
		return;


	BFS(bfs.front());
}


int main()
{
	int edge_count = 0;
	int start_vert = 0;

	std::cin &amp;gt;&amp;gt; vert_count &amp;gt;&amp;gt; edge_count &amp;gt;&amp;gt; start_vert;

	for (int ii = 1; ii &amp;lt;= edge_count; ii++)
	{
		int m = 0, n = 0;
		std::cin &amp;gt;&amp;gt; m &amp;gt;&amp;gt; n;
		map[m][n] = 1;
		map[n][m] = 1;
	}

	DFS(start_vert);

	std::cout &amp;lt;&amp;lt; std::endl;

	bfs.push(start_vert);
	BFS(start_vert);
}





&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;언리얼 팀프로젝트 5주 간 거의 놨던 알고리즘 공부를 다시 시작&lt;/p&gt;
&lt;p&gt;기억이 잘 안 나서 간단한 DFS 문제를 두 개 정도 풀어보았다.&lt;/p&gt;
&lt;p&gt;다시 하기 막막하다;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스</category>
      <author>ACA_</author>
      <guid isPermaLink="true">https://acatistory.tistory.com/100</guid>
      <comments>https://acatistory.tistory.com/100#entry100comment</comments>
      <pubDate>Thu, 27 Feb 2020 14:59:48 +0900</pubDate>
    </item>
    <item>
      <title>힙 - 디스크 컨트롤러</title>
      <link>https://acatistory.tistory.com/93</link>
      <description>&lt;p&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다.&lt;/p&gt;
&lt;p&gt;예를들어&lt;/p&gt;
&lt;p&gt;- 0ms 시점에 3ms가 소요되는 A작업 요청 - 1ms 시점에 9ms가 소요되는 B작업 요청 - 2ms 시점에 6ms가 소요되는 C작업 요청&lt;/p&gt;
&lt;p&gt;와 같은 요청이 들어왔습니다. 이를 그림으로 표현하면 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uepbo/btqAPdwwpPy/5f7nbVy5TvKlh7qK7nDI6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uepbo/btqAPdwwpPy/5f7nbVy5TvKlh7qK7nDI6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uepbo/btqAPdwwpPy/5f7nbVy5TvKlh7qK7nDI6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuepbo%2FbtqAPdwwpPy%2F5f7nbVy5TvKlh7qK7nDI6k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같이 처리 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YoQ4A/btqAPdwwpQO/HTN0wvW3ObF3VUx3wRmAqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YoQ4A/btqAPdwwpQO/HTN0wvW3ObF3VUx3wRmAqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YoQ4A/btqAPdwwpQO/HTN0wvW3ObF3VUx3wRmAqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYoQ4A%2FbtqAPdwwpQO%2FHTN0wvW3ObF3VUx3wRmAqK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- A: 3ms 시점에 작업 완료 (요청에서 종료까지 : 3ms) - B: 1ms부터 대기하다가, 3ms 시점에 작업을 시작해서 12ms 시점에 작업 완료(요청에서 종료까지 : 11ms) - C: 2ms부터 대기하다가, 12ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 16ms)&lt;/p&gt;
&lt;p&gt;이 때 각 작업의 요청부터 종료까지 걸린 시간의 평균은 10ms(= (3 + 11 + 16) / 3)가 됩니다.&lt;/p&gt;
&lt;p&gt;하지만 A &amp;rarr; C &amp;rarr; B 순서대로 처리하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dI64QC/btqALPRQQIe/0EGUs9ZTQfuL5pM2Cpjzuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dI64QC/btqALPRQQIe/0EGUs9ZTQfuL5pM2Cpjzuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dI64QC/btqALPRQQIe/0EGUs9ZTQfuL5pM2Cpjzuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdI64QC%2FbtqALPRQQIe%2F0EGUs9ZTQfuL5pM2Cpjzuk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;- A: 3ms 시점에 작업 완료(요청에서 종료까지 : 3ms) - C: 2ms부터 대기하다가, 3ms 시점에 작업을 시작해서 9ms 시점에 작업 완료(요청에서 종료까지 : 7ms) - B: 1ms부터 대기하다가, 9ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 17ms)&lt;/p&gt;
&lt;p&gt;이렇게 A &amp;rarr; C &amp;rarr; B의 순서로 처리하면 각 작업의 요청부터 종료까지 걸린 시간의 평균은 9ms(= (3 + 7 + 17) / 3)가 됩니다.&lt;/p&gt;
&lt;p&gt;각 작업에 대해 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어질 때, 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리하면 평균이 얼마가 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소수점 이하의 수는 버립니다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;제한 사항&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;jobs의 길이는 1 이상 500 이하입니다.&lt;/li&gt;
&lt;li&gt;jobs의 각 행은 하나의 작업에 대한 [작업이 요청되는 시점, 작업의 소요시간] 입니다.&lt;/li&gt;
&lt;li&gt;각 작업에 대해 작업이 요청되는 시간은 0 이상 1,000 이하입니다.&lt;/li&gt;
&lt;li&gt;각 작업에 대해 작업의 소요시간은 1 이상 1,000 이하입니다.&lt;/li&gt;
&lt;li&gt;하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;입출력 예&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;jobs&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;return&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[[0, 3], [1, 9], [2, 6]]&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;입출력 예 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;문제에 주어진 예와 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0ms 시점에 3ms 걸리는 작업 요청이 들어옵니다.&lt;/li&gt;
&lt;li&gt;1ms 시점에 9ms 걸리는 작업 요청이 들어옵니다.&lt;/li&gt;
&lt;li&gt;2ms 시점에 6ms 걸리는 작업 요청이 들어옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;내 풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;

int solution(vector&amp;lt;vector&amp;gt; jobs) {
    int answer = 0;

    int cur_time = 0;
    int sum_time = 0;

    //pair의 경우 first비교, 같으면 second 비교
    //first : 걸리는 시간     second : 들어오는 시점
    std::queue&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; wating_queue;
    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; time_q;

    for (int ii = 0; ii &amp;lt; jobs.size(); ii++)
    {
        pair&amp;lt;int, int&amp;gt; p = make_pair(jobs[ii][1], jobs[ii][0]);
        time_q.push(p);
    }

    while (time_q.empty() == false)
    {
        while (time_q.empty() == false)
        {
            pair&amp;lt;int, int&amp;gt; p = time_q.top();
            if (p.second &amp;gt; cur_time)
            {
                wating_queue.push(p);
                time_q.pop();
            }
            else
            {
                sum_time += (cur_time - p.second) + p.first;
                cur_time += p.first;
                time_q.pop();

                int prev_size = wating_queue.size();
               
                //하나 들어갔으므로 관계 재생성
                for (int ii = 0; ii &amp;lt; prev_size; ii++)
                {
                    time_q.push(wating_queue.front());
                    wating_queue.pop();
                }
            }

        }
        if (time_q.empty() == true &amp;amp;&amp;amp; wating_queue.size() &amp;gt; 0) //유휴 상태
        {
            int min = 501;
            pair&amp;lt;int, int&amp;gt; minnode = make_pair(-999, -999);

            int prev_size = wating_queue.size();

            for (int ii = 0; ii &amp;lt; prev_size; ii++)
            {
                if (wating_queue.front().second &amp;lt; min)
                {
                    min = wating_queue.front().second;
                    if(minnode.first != -999)
                        wating_queue.push(minnode);
                    
                    minnode = make_pair(wating_queue.front().first, wating_queue.front().second);
                    wating_queue.pop();
                }
                else
                {
                    //최소가 아닐경우 큐의 맨 뒤로 이동
                    wating_queue.push(wating_queue.front());
                    wating_queue.pop();
                }
            }

            time_q.push(minnode);
            cur_time = minnode.second;

            pair&amp;lt;int, int&amp;gt; p = time_q.top();
            //MIN NOde 작업(유휴상태일때)
            sum_time += (cur_time - p.second) + p.first;
            cur_time += p.first;
            time_q.pop();
        }

        while (wating_queue.empty() == false)
        {
            time_q.push(wating_queue.front());
            wating_queue.pop();
        }

    }

    answer = sum_time / jobs.size();
    answer = std::floor(answer);
    return answer;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;내 코드의 기본적 원리는 우선순위 큐와 대기 큐를 사용하는 것이다. 먼저 모든 잡을 우선순위 큐에 삽입한다. 그리고 p.second(요청 시간, InputTime)를 current_time과 비교한다. 만약 현재 시간보다 나중에 요청되는 노드라면 이를 대기 큐에 집어넣고, 다음 요청을 검증한다. 현재 시간보다 작거나 같은 노드를 사용하여(즉 요청이 수행 될 노드) cur_time을 업데이트한다(요청이 수행되고 난 뒤의 시간으로)&lt;/p&gt;
&lt;p&gt;이후에, time_q(우선 순위 큐)가 비고 대기 큐만 남았다면, 디스크가 유휴 상태에 들어간 것으로 간주하여 wating_queue에 있는 잡들 중 가장 요청 시간이 작은 잡을 가져와서 적용하고, 나머지 잡을 다시 time_q에 집어 넣는다.&lt;/p&gt;
&lt;p&gt;이 작업에서 주의할 점은,&lt;b&gt; 한 번 잡이 수행되고 나면 남은 작업들을 모두 time_q에 집어넣어서, 다시 우선순위 관계를 재정립해야 한다는 것이다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;만약 0,5 :: 1,2 :: 5,5의 잡이 있을 때, 0,5가 수행되고 나면 1,2와 5,5는 모두 수행될 자격을 갖춘다(요청 시간을 볼 때)&lt;/p&gt;
&lt;p&gt;문제에서 요구하는 바를 따르면 다음 잡은 1,2가 들어가는게 맞으나, 이미 잡들이 PriorityQueue에 들어갔었기 때문에, ProcessTime이 제일 짧은 1,2잡은 이미 wating_queue에 들어가 있다. 그렇게 되면 세 번째 5,5 잡이 수행되어, 0.5 -&amp;gt;5,5 -&amp;gt; 1,2순서대로 잡이 수행되게 되므로 문제가 생긴다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;다른 사람의 풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;
int solution(vector&amp;lt;vector &amp;gt; jobs) {
    int answer = 0;

    std::priority_queue&amp;lt;vector, vector&amp;lt;vector &amp;gt;, CompareProcessTime&amp;gt; PQ;

    std::sort(jobs.begin(), jobs.end(), CompareInputTime());
    int time = jobs[0][0];
    auto iter = jobs.begin();
    while (iter != jobs.end() || !PQ.empty()) {
        while (iter != jobs.end() &amp;amp;&amp;amp; (*iter)[0] &amp;lt;= time) {//작업이 이미 도착해있다면
            PQ.push(*iter++); //도착해 있는 작업들을 모두 Priority Queue에 넣음
        }

        if (!PQ.empty()) {
            time += PQ.top()[1]; //작업을 수행한다.
            answer += (time - PQ.top()[0]); //처음 들어온 시간부터 수행 된 시간 까지의 차이를 뺀다.
            PQ.pop();
        }
        else {
            time = (*iter)[0];
        }
    }

    answer /= jobs.size();
    return answer;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래 코드의 기본적 원리는, 일단 InputTime(요청시간) 순으로 job들을 정렬한 뒤, time(현재 시간)을 기준으로 그보다 작은 요청시간을 가진(큐에 들어올 수 있는) 노드들을 모두 Priority Queue에 넣는 것이다. 그렇게 되면 현재 시간에서 그보다 작거나 같은 시간대의 요청들은 모두 PQ에 순서대로 들어가기 때문에, 프로세스 타임 순서대로(즉, SJF에 맞는 순서대로) 정렬이 가능하게 된다.&lt;/p&gt;
&lt;p&gt;또한 iter++는 무조건 PQ의 push작업 이후 진행되게 만들어서 만약 PQ에 아무것도 없다면 time(현재시간) = iterator가 가리키는 시간&amp;nbsp; &amp;nbsp;으로 만들어 준다.&amp;nbsp; 즉 유휴가 발생했을 때 inputtime이 가장 빠른 노드들을 기준으로 다시 PQ에 넣는 작업을 진행하는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;한 가지 구현으로 여러 기능을 할 수 있고, 쓸데없는 예외등을 만들 필요가 없으며 간결한 코드이다.&lt;/p&gt;
&lt;p&gt;죽었다 깨도 이런 생각은 못 할것 같아서 회의감이 든다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스</category>
      <author>ACA_</author>
      <guid isPermaLink="true">https://acatistory.tistory.com/93</guid>
      <comments>https://acatistory.tistory.com/93#entry93comment</comments>
      <pubDate>Mon, 30 Dec 2019 18:34:48 +0900</pubDate>
    </item>
    <item>
      <title>그래프 - 순위</title>
      <link>https://acatistory.tistory.com/92</link>
      <description>&lt;p&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;n명의 권투선수가 권투 대회에 참여했고 각각 1번부터 n번까지 번호를 받았습니다. 권투 경기는 1대1 방식으로 진행이 되고, 만약 A 선수가 B 선수보다 실력이 좋다면 A 선수는 B 선수를 항상 이깁니다. 심판은 주어진 경기 결과를 가지고 선수들의 순위를 매기려 합니다. 하지만 몇몇 경기 결과를 분실하여 정확하게 순위를 매길 수 없습니다.&lt;/p&gt;
&lt;p&gt;선수의 수 n, 경기 결과를 담은 2차원 배열 results가 매개변수로 주어질 때 정확하게 순위를 매길 수 있는 선수의 수를 return 하도록 solution 함수를 작성해주세요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;제한사항&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;선수의 수는 1명 이상 100명 이하입니다.&lt;/li&gt;
&lt;li&gt;경기 결과는 1개 이상 4,500개 이하입니다.&lt;/li&gt;
&lt;li&gt;results 배열 각 행 [A, B]는 A 선수가 B 선수를 이겼다는 의미입니다.&lt;/li&gt;
&lt;li&gt;모든 경기 결과에는 모순이 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;입출력 예&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;n&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;results&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;return&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;[[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]]&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;입출력 예 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;2번 선수는 [1, 3, 4] 선수에게 패배했고 5번 선수에게 승리했기 때문에 4위입니다.&lt;br /&gt;5번 선수는 4위인 2번 선수에게 패배했기 때문에 5위입니다.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://contest.usaco.org/JAN08.htm&quot;&gt;출처&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1577409369369&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;JAN08 CONTEST Analysis and Data&quot; data-og-description=&quot;&quot; data-og-host=&quot;contest.usaco.org&quot; data-og-source-url=&quot;http://contest.usaco.org/JAN08.htm&quot; data-og-url=&quot;https://contest.usaco.org/JAN08.htm&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://contest.usaco.org/JAN08.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://contest.usaco.org/JAN08.htm&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;&gt;JAN08 CONTEST Analysis and Data&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;contest.usaco.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;나의 풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;cpp&quot; style=&quot;font-size:15px&quot;&gt;

#include 
#include 

using namespace std;

vector&amp;lt;vector&amp;gt; graph;
vector LC; //Lose Count
vector WC; //Win Count
int visit[101][101] = { 0, };

void Trace(int origin, int target)
{
	if (visit[origin][target] == 0)
		visit[origin][target] = 1;
	else
		return;

	WC[origin] += 1;
	LC[target] += 1;

	for (int target_child = 0; target_child &amp;lt; graph[target].size(); target_child++)
	{
		if(visit[origin][graph[target][target_child]] != 1) //중복방문방지
			Trace(origin, graph[target][target_child]);
	}
}

int solution(int n, vector&amp;lt;vector&amp;gt; results) {

	int ret_count = 0;

	graph.resize(n + 1);
	LC.resize(n + 1);
	WC.resize(n + 1);

	for (int ii = 0; ii &amp;lt; results.size(); ii++)
	{
		graph[results[ii][0]].push_back(results[ii][1]);
	}

	for(int j = 1 ; j &amp;lt; graph.size(); j++)
	{
		for (int sub = 0; sub &amp;lt; graph[j].size(); sub++)
		{
			Trace(j, graph[j][sub]);
		}
	}

    //최종결과계산(진 수 + 이긴 수 == 자신을 뺀 노드의 수   이면 순위를 매길 수 있음)
	for (int k = 0; k &amp;lt; LC.size(); k++)
	{
		if (LC[k] + WC[k] == n - 1)
			ret_count++;
	}

	return ret_count;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;풀이원리&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;명백하게 승패를 가릴 수 있는 경우&lt;/p&gt;
&lt;p&gt;N = 5라면, 1,2,3,4,5 중 자신을 제외한 모든 노드들에 대하여 한번씩 승리하거나, 패배했으면 승패를 가릴 수 있다.&lt;/p&gt;
&lt;p&gt;만약 패배 그래프가 1,2,3-&amp;gt;4-&amp;gt;5&amp;nbsp; 즉 1,2,3에게 진 4의 자식이 5라면, 5는 4 뿐만 아니라 1,2,3에게도 졌다고 할 수 있다.&lt;/p&gt;
&lt;p&gt;즉 각 노드의 자식들을 순회하면서, 자식에게 Lose Count를 1 더하고, 더할 때마다 자신에게도 Win Count를 1 더한다.&lt;/p&gt;
&lt;p&gt;WC + LC = N - 1&amp;nbsp; &amp;nbsp;이면 승패를 가릴 수 있는 노드이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;벡터의 index를 노드로 사용하니까 굳이 구조체와 포인터로 그래프를 만들지 않아서 좋긴 한데&lt;/p&gt;
&lt;p&gt;헷갈린다..&amp;nbsp;&lt;/p&gt;
&lt;p&gt;특히 이런 코드 &lt;span&gt;visit&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;graph&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;target_child&lt;/span&gt;&lt;span&gt;]]&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스</category>
      <author>ACA_</author>
      <guid isPermaLink="true">https://acatistory.tistory.com/92</guid>
      <comments>https://acatistory.tistory.com/92#entry92comment</comments>
      <pubDate>Fri, 27 Dec 2019 10:28:30 +0900</pubDate>
    </item>
    <item>
      <title>그래프(BFS) - 가장 먼 노드</title>
      <link>https://acatistory.tistory.com/91</link>
      <description>&lt;p&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;n개의 노드가 있는 그래프가 있습니다. 각 노드는 1부터 n까지 번호가 적혀있습니다. 1번 노드에서 가장 멀리 떨어진 노드의 갯수를 구하려고 합니다. 가장 멀리 떨어진 노드란 최단경로로 이동했을 때 간선의 개수가 가장 많은 노드들을 의미합니다.&lt;/p&gt;
&lt;p&gt;노드의 개수 n, 간선에 대한 정보가 담긴 2차원 배열 vertex가 매개변수로 주어질 때, 1번 노드로부터 가장 멀리 떨어진 노드가 몇 개인지를 return 하도록 solution 함수를 작성해주세요.&lt;/p&gt;
&lt;p&gt;제한사항&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;노드의 개수 n은 2 이상 20,000 이하입니다.&lt;/li&gt;
&lt;li&gt;간선은 양방향이며 총 1개 이상 50,000개 이하의 간선이 있습니다.&lt;/li&gt;
&lt;li&gt;vertex 배열 각 행 [a, b]는 a번 노드와 b번 노드 사이에 간선이 있다는 의미입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;입출력 예&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;n&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;vertex&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;return&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;[[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]]&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;b&gt;입출력 예 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;예제의 그래프를 표현하면 아래 그림과 같고, 1번 노드에서 가장 멀리 떨어진 노드는 4,5,6번 노드입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx577O/btqAGdjIale/1PUMOsKCF8MlOKxIgsxH70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx577O/btqAGdjIale/1PUMOsKCF8MlOKxIgsxH70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx577O/btqAGdjIale/1PUMOsKCF8MlOKxIgsxH70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx577O%2FbtqAGdjIale%2F1PUMOsKCF8MlOKxIgsxH70%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;나의 풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;
struct Node
{
	int num;
	vector list;
	bool is_using;
	int level;
};

std::queue node_queue;
int max_dist = -999;
int ret_sum = 0;

int solution(int n, vector&amp;lt;vector&amp;gt; edge)
{
	vector node;
	node.resize(n + 1); //1부터 시작

	for (int j = 1; j &amp;lt; n + 1; j++)
	{
		node[j].num = j;
		node[j].is_using = false;
		node[j].level = 0;
	}

	for (int ii = 0; ii &amp;lt; edge.size(); ii++)
	{
		node[edge[ii][0]].list.push_back(edge[ii][1]);
		node[edge[ii][1]].list.push_back(edge[ii][0]);
	}

	//node 1 세팅
	node[1].is_using = true;
	for (int ii = 0; ii &amp;lt; node[1].list.size(); ii++)
	{
			node[node[1].list[ii]].is_using = true;
			node[node[1].list[ii]].level = node[1].level + 1;
			node_queue.push(node[1].list[ii]);

			if (node[node[1].list[ii]].level &amp;gt; max_dist)
				max_dist = node[node[1].list[ii]].level;

			if (node[node[1].list[ii]].level == max_dist)
			{
				ret_sum++;
			}
	}

	while (node_queue.size() &amp;gt; 0)
	{
		int cur_node = node_queue.front();
		node[cur_node].is_using = true;
		for (int j = 0; j &amp;lt; node[cur_node].list.size(); j++)
		{
			int cur_nodelist_Nth = node[cur_node].list[j];
			if (node[cur_nodelist_Nth].is_using == false)
			{
				node[cur_nodelist_Nth].is_using = true;
				node[cur_nodelist_Nth].level = node[cur_node].level + 1;
				node_queue.push(node[cur_nodelist_Nth].num);


				if (node[cur_nodelist_Nth].level &amp;gt; max_dist)
				{
					ret_sum = 0;
					max_dist = node[cur_nodelist_Nth].level;
				}
				if (node[cur_nodelist_Nth].level == max_dist)
				{
					ret_sum++;
				}

			}
		}

		node_queue.pop();
	}



		
	return ret_sum;
}


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;처음엔 Node에 해당 노드의 번호(num), bool 사용여부, 연결된 노드의 포인터를 가지려고 했었다.&lt;/p&gt;
&lt;p&gt;양방향 링크드리스트 만들 때 처럼 포인터로 노드를 서로 연결하면 복사본을 만들 필요도 없고, 속도에 유리하고 간편할 것 같았다. 그런 방향으로 풀다가 생각해보니 그냥 노드는 1~n의 숫자를 차례로 가지므로 인덱스 int값으로도 풀 수 있겠다 싶었다.&lt;/p&gt;
&lt;p&gt;문제를 풀고 나니, '가장 먼'노드를 구별할 방법이 없었다. 큐를 사용했지만 레벨별로 나누지 않았기 때문에 구분하려면 다른 장치를 구현해야 했다.&lt;/p&gt;
&lt;p&gt;가장 먼저 떠오른 방법은 n * n 배열을 만들어서 [레벨][방문 수]로 하는 방법이었고, 두 번째는 거리를 dist[]에 기록해 놓은 다음(노드를 pop 할 때마다 자식 노드에 현재 노드 + 1을 주는 식으로), 해당 거리를 max값과 비교하는 방법을 생각해보았다. 둘 다 비슷한 방법이었지만 첫 번째 방법은 공간복잡도가 너무 클 것 같았다(노드가 2만 개)&lt;/p&gt;
&lt;p&gt;그래서 두 번째 방법을 사용하되 Node 구조체에 그냥 level을 집어넣었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다른 사람의 풀이를 보니 좀 더 인덱스를 간략하게 사용하여 풀 수도 있는 것 같다. 내 코드는 node1을 따로 처리하는 부분에서 비효율이 발생한다거나, 노드가 점점 복잡해져서 헷갈려지므로 따로 int로 빼놓는 등 자잘한 개선요소가 많이 보인다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;다른 사람의 풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;

int d[20001][20001];
bool visit[20001];
int dist[20001];
int solution(int n, vector&amp;lt;vector&amp;gt; edge) {
    int max = 0;
    int answer = 0;
    for(int i=0;i&amp;lt;edge.size();i++)
    {
        d[edge[i][0]][edge[i][1]]=1;
        d[edge[i][1]][edge[i][0]]=1;
    }

    queue q;
    visit[1]=true;
    q.push(1);
    dist[1]=0;
    while(!q.empty())
    {
        int first = q.front();
        q.pop();       
        for(int i=2;i&amp;lt;=n;i++)
        {
            if(d[first][i]==1 &amp;amp;&amp;amp; !visit[i])
            {
                q.push(i);
                visit[i]=true;
                dist[i]=dist[first]+1;
                if(max&amp;lt;dist[i])
                {
                    max=dist[i];
                }
            }
        }
    }

    for(int i=1;i&amp;lt;=n;i++)
    {
        if(max==dist[i])
        {
            answer++;
        }
    }
    return answer;
}






&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새로 알게 된 것 : BFS는 가중치가 없는 그래프에서 최단 거리를 찾기 적합하다. 큐를 사용하면 레벨별로 노드를 다룰 수 있으며, 레벨 = 노드의 길이 이기 때문이다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>프로그래머스</category>
      <author>ACA_</author>
      <guid isPermaLink="true">https://acatistory.tistory.com/91</guid>
      <comments>https://acatistory.tistory.com/91#entry91comment</comments>
      <pubDate>Mon, 23 Dec 2019 20:25:40 +0900</pubDate>
    </item>
    <item>
      <title>DP - 도둑질</title>
      <link>https://acatistory.tistory.com/90</link>
      <description>&lt;p&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;도둑이 어느 마을을 털 계획을 하고 있습니다. 이 마을의 모든 집들은 아래 그림과 같이 동그랗게 배치되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5RIss/btqAAtf1IzF/JeAxTR3AwKZKrviWEYxQc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5RIss/btqAAtf1IzF/JeAxTR3AwKZKrviWEYxQc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5RIss/btqAAtf1IzF/JeAxTR3AwKZKrviWEYxQc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5RIss%2FbtqAAtf1IzF%2FJeAxTR3AwKZKrviWEYxQc0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;각 집들은 서로 인접한 집들과 방범장치가 연결되어 있기 때문에 인접한 두 집을 털면 경보가 울립니다.&lt;/p&gt;
&lt;p&gt;각 집에 있는 돈이 담긴 배열 money가 주어질 때, 도둑이 훔칠 수 있는 돈의 최댓값을 return 하도록 solution 함수를 작성하세요.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;제한사항&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;이 마을에 있는 집은 3개 이상 1,000,000개 이하입니다.&lt;/li&gt;
&lt;li&gt;money 배열의 각 원소는 0 이상 1,000 이하인 정수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;입출력 예&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 30px;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;money&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;return&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;[1, 2, 3, 1]&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코드&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;int solution(vector money) {

    vector dp;
    vector dp2;
    dp.resize(money.size() - 1); //1번집부터 터는 경우(마지막을 못 텀)
    dp2.resize(money.size()); //2번집부터 터는 경우(마지막을 털 수 있음)

    dp[0] = money[0];
    dp[1] = money[0];
    dp2[0] = 0;
    dp2[1] = money[1];

    for (int ii = 2; ii &amp;lt; money.size() - 1; ii++)
    {
        dp[ii] = std::max((money[ii] + dp[ii - 2]), dp[ii - 1]);
    }
    for (int ii = 2; ii &amp;lt; money.size(); ii++)
    {
        dp2[ii] = std::max((money[ii] + dp2[ii - 2]), dp2[ii - 1]);
    }

    return std::max(dp[dp.size() - 1], dp2[dp2.size() - 1]);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;접근과정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;문제를 쪼개보려고 노력하였다. 잘 안&amp;nbsp; 쪼개진다.&lt;/p&gt;
&lt;p&gt;처음에는 집에 있는 돈과, 해당 돈을 가진 money[]의 위치 포인터를 가진 노드 배열을 만든 후 그것을 내림차순 정렬하여 큰 것부터 차례로 털어갈 수 있게 만드려 했다. 즉 탐욕 알고리즘과 비슷한 접근법을 시도하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Node&lt;/b&gt;&lt;br /&gt;&lt;b&gt;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;money; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int*&amp;nbsp;ptr; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;};&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;ii&amp;nbsp;=&amp;nbsp;1;&amp;nbsp;ii&amp;nbsp;&amp;lt;&amp;nbsp;&lt;a href=&quot;nv.size();&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;nv.size();&lt;/a&gt;&amp;nbsp;ii++) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(*(nv[ii].ptr&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;!=&amp;nbsp;-9999&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;*(nv[ii].ptr&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;!=&amp;nbsp;-9999) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&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;sum&amp;nbsp;+=&amp;nbsp;nv[ii].money; &lt;/b&gt;&lt;br /&gt;&lt;b&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;*(nv[ii].ptr)&amp;nbsp;=&amp;nbsp;-9999; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그러나 다 짜고 보니 100 101 100 1 1과 같은 반례가 있었다.&lt;/p&gt;
&lt;p&gt;(가장 큰 노드는 101이지만, 101을 고르고 나면 양옆의 100, 100을 고르지 못하므로 절대 최대값이 나오지 않는다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;두번째 접근법은&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;money를 순회하면서, i가 자신의 위치라면 money[i-1] + money[i+1]보다 money[i]가 크면 자신을 sum에 더한 후 세 칸 전진(왜냐하면 자신을 더한 이상 i + 1은 더 이상 비교의 이미가 없고(인접하므로), i + 2 부터 비교해야 하기 때문이다.&lt;/p&gt;
&lt;p&gt;money[i]가 크지 않다면 sum에 money[i-1]을 더한 후 두 칸 전진하는 식으로 구현하였다. 이 식은 나름 합리적으로 보였다. 내가 이 문제가 환형으로 되어있다는 것을 간과하고 있었음을 알기 전까지는...&lt;/p&gt;
&lt;p&gt;환형이므로 m[size() + 1] == m[0]이다. 이렇게 되면 논리가 전혀 맞지 않는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;int&amp;nbsp;solution(vector&amp;nbsp;money)&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vector&amp;amp;&amp;nbsp;m&amp;nbsp;=&amp;nbsp;money; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;sum&amp;nbsp;=&amp;nbsp;0; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;ii&amp;nbsp;=&amp;nbsp;1; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool&amp;nbsp;m0checked&amp;nbsp;=&amp;nbsp;false; &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(m[1]&amp;nbsp;&amp;gt;&amp;nbsp;(m[0]&amp;nbsp;+&amp;nbsp;m[2])) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum&amp;nbsp;+=&amp;nbsp;m[1]; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ii&amp;nbsp;+=&amp;nbsp;3; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m0checked&amp;nbsp;=&amp;nbsp;false; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum&amp;nbsp;+=&amp;nbsp;m[0]; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ii&amp;nbsp;+=&amp;nbsp;2; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m0checked&amp;nbsp;=&amp;nbsp;true; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(ii&amp;nbsp;&amp;lt;&amp;nbsp;m.size()&amp;nbsp;-&amp;nbsp;1) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(m[ii]&amp;nbsp;&amp;gt;&amp;nbsp;(m[ii&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;+&amp;nbsp;m[ii&amp;nbsp;+&amp;nbsp;1])) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&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;sum&amp;nbsp;+=&amp;nbsp;m[ii]; &lt;/b&gt;&lt;br /&gt;&lt;b&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;ii&amp;nbsp;+=&amp;nbsp;3; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&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;sum&amp;nbsp;+=&amp;nbsp;m[ii&amp;nbsp;-&amp;nbsp;1]; &lt;/b&gt;&lt;br /&gt;&lt;b&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;ii&amp;nbsp;+=&amp;nbsp;2; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(ii&amp;nbsp;==&amp;nbsp;m.size()&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;m0checked&amp;nbsp;==&amp;nbsp;false) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum&amp;nbsp;+=&amp;nbsp;m[m.size()&amp;nbsp;-&amp;nbsp;1]; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(ii&amp;nbsp;==&amp;nbsp;m.size()&amp;nbsp;-&amp;nbsp;1&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;m0checked) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum&amp;nbsp;+=&amp;nbsp;m[ii&amp;nbsp;-&amp;nbsp;1]; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(ii&amp;nbsp;==&amp;nbsp;m.size()&amp;nbsp;-&amp;nbsp;1&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;m0checked&amp;nbsp;==&amp;nbsp;false) &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sum&amp;nbsp;+=&amp;nbsp;std::max(m[ii],&amp;nbsp;m[ii&amp;nbsp;-&amp;nbsp;1]); &lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sum; &lt;/b&gt;&lt;br /&gt;&lt;b&gt;}&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3시간동안 머리가 깨질 것 같아서 그냥 답을 봤다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;정답의 핵심원리는,&lt;/b&gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;현재 집까지의 최대값 = MAX(i-2까지의 최대값 + 이번 집을 털면 나오는 돈 , i-1까지의 최대값)&lt;/b&gt;&lt;/span&gt; 이다. 인접하므로 둘 중 큰 값이 결국 현재 집까지의 최대값이 되는 것이다. 전형적인 DP 문제였는데 접근법을 도저히 발상해내지 못했다. dp 배열이 두 개인 이유는 첫 번째 집을 털거나, 털지 않거나의 두 가지 경우 중 큰 값을 답으로 정하기 위해서이다. 첫 번째 집을 터느냐 아니냐에 따라서 진행이 확연하게 달라진다.(환형이므로 마지막 집을 터는지 여부부터, 처음 dp[1]을 정하는 문제 등...)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스</category>
      <author>ACA_</author>
      <guid isPermaLink="true">https://acatistory.tistory.com/90</guid>
      <comments>https://acatistory.tistory.com/90#entry90comment</comments>
      <pubDate>Thu, 19 Dec 2019 18:42:21 +0900</pubDate>
    </item>
    <item>
      <title>DP - 정수 삼각형</title>
      <link>https://acatistory.tistory.com/89</link>
      <description>&lt;p&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUAVeo/btqAwIFsogk/aKL5uwR6mZXSWqlQ16xQTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUAVeo/btqAwIFsogk/aKL5uwR6mZXSWqlQ16xQTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUAVeo/btqAwIFsogk/aKL5uwR6mZXSWqlQ16xQTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUAVeo%2FbtqAwIFsogk%2FaKL5uwR6mZXSWqlQ16xQTK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.&lt;/p&gt;
&lt;p&gt;삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;제한사항&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;삼각형의 높이는 1 이상 500 이하입니다.&lt;/li&gt;
&lt;li&gt;삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;b&gt;입출력 예&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;&lt;b&gt;triangle&lt;/b&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;result&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]]&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;나의 풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;

#include 
#include 
using namespace std;
#define MAX_(a,b) ((a) &amp;gt; (b)) ? (a) : (b)


vector&amp;lt;vector&amp;gt; S;
vector Max;
int tmp_max = -9999999;


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

    S.resize(triangle.size());
    for (int ii = 0; ii &amp;lt; triangle.size(); ii++)
    {
        S[ii].resize(triangle[ii].size());
    }

    Max.resize(triangle.size());

    S[0][0] = triangle[0][0];
    Max[0] = S[0][0];

    for (int ii = 1; ii &amp;lt; triangle.size(); ii++)
    {
        for (int j = 0; j &amp;lt; triangle[ii].size(); j++)
        {
            if (j == 0)
                S[ii][j] = S[ii - 1][j] + triangle[ii][j];
            else if (j == triangle[ii].size() - 1)
                S[ii][j] = S[ii - 1][j - 1] + triangle[ii][j];
            else
                S[ii][j] = MAX_((S[ii - 1][j - 1] + triangle[ii][j]), (S[ii - 1][j] + triangle[ii][j]));

            if (tmp_max &amp;lt; S[ii][j])
                tmp_max = S[ii][j];
        }

        Max[ii] = tmp_max;
        tmp_max = -9999999;
    }

    return Max[triangle.size() - 1];
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;나의 접근법&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;부분합&amp;nbsp;:&amp;nbsp;S &lt;br /&gt;&lt;br /&gt;S(1)&amp;nbsp;=&amp;nbsp;T1(1) &lt;br /&gt;&lt;br /&gt;S(2,1)&amp;nbsp;=&amp;nbsp;S(1)&amp;nbsp;+&amp;nbsp;T2(1) &lt;br /&gt;S(2,2)&amp;nbsp;=&amp;nbsp;S(1)&amp;nbsp;+&amp;nbsp;T2(2) &lt;br /&gt;&lt;br /&gt;S(3,1)&amp;nbsp;=&amp;nbsp;S(2,1)&amp;nbsp;+&amp;nbsp;T3(1) &lt;br /&gt;S(3,2)&amp;nbsp;=&amp;nbsp;MAX(S(2,1)&amp;nbsp;+&amp;nbsp;T3(2)&amp;nbsp;,&amp;nbsp;S(2,2)&amp;nbsp;+&amp;nbsp;T3(2)) &lt;br /&gt;S(3,3)&amp;nbsp;=&amp;nbsp;S(2,2)&amp;nbsp;+&amp;nbsp;T3(3) &lt;br /&gt;&lt;br /&gt;S(4,1)&amp;nbsp;=&amp;nbsp;S(3,1)&amp;nbsp;+&amp;nbsp;T4(1) &lt;br /&gt;S(4,2)&amp;nbsp;=&amp;nbsp;MAX(S(3,1)&amp;nbsp;+&amp;nbsp;T4(2)&amp;nbsp;,&amp;nbsp;S(3,2)&amp;nbsp;+&amp;nbsp;T4(2)) &lt;br /&gt;S(4,3)&amp;nbsp;=&amp;nbsp;MAX(S(3,2)&amp;nbsp;+&amp;nbsp;T4(3)&amp;nbsp;,&amp;nbsp;S(3,3)&amp;nbsp;+&amp;nbsp;T4(3)) &lt;br /&gt;S(4,4)&amp;nbsp;=&amp;nbsp;S(3,3)&amp;nbsp;+&amp;nbsp;T4(4)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일단 점화식을 그릴 패턴이 보이는지 쭉 써보았다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;각 줄의 첫 번째 원소 : S(i,j) = S(i -1, j) + T(j) &lt;br /&gt;나머지 원소 : S(i,j) = MAX(S(i-1, j-1) + T(j) , S(i-1, j) + T(j)) &lt;br /&gt;각 줄의 마지막 원소 : S(i,j) = S(i -1, j-1) + T(j)&lt;/p&gt;
&lt;p&gt;로 풀면 될 것 같았다. 각각의 요소들을 배열로 저장할 수 있으므로 DP에도 적합하다.&lt;/p&gt;
&lt;p&gt;Max는 각 줄의 부분합중 가장 큰 값이다. 즉 Max[2]는 3번째 줄까지의 부분합 중 가장 큰 값이다.&lt;/p&gt;
&lt;p&gt;우리는 Max[N - 1]을 구하면 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;친구가 푼 것을 봤는데, 삼각형의 위에서부터 접근하지 않고, 아래서부터 접근하면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;점화식 하나만으로 모든 경우를 커버할 수 있는 것 같다(첫원소, 마지막원소의 경우를 생각할 필요 없이)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스</category>
      <author>ACA_</author>
      <guid isPermaLink="true">https://acatistory.tistory.com/89</guid>
      <comments>https://acatistory.tistory.com/89#entry89comment</comments>
      <pubDate>Wed, 18 Dec 2019 20:33:47 +0900</pubDate>
    </item>
    <item>
      <title>DP - 타일 장식물</title>
      <link>https://acatistory.tistory.com/88</link>
      <description>&lt;p&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;대구 달성공원에 놀러 온 지수는 최근에 새로 만든 타일 장식물을 보게 되었다. 타일 장식물은 정사각형 타일을 붙여 만든 형태였는데, 한 변이 1인 정사각형 타일부터 시작하여 마치 앵무조개의 나선 모양처럼 점점 큰 타일을 붙인 형태였다. 타일 장식물의 일부를 그리면 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP4AsO/btqAy1jqsjE/YZK7Oazc8LEiKVP6OkPHz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP4AsO/btqAy1jqsjE/YZK7Oazc8LEiKVP6OkPHz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP4AsO/btqAy1jqsjE/YZK7Oazc8LEiKVP6OkPHz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP4AsO%2FbtqAy1jqsjE%2FYZK7Oazc8LEiKVP6OkPHz1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그림에서 타일에 적힌 수는 각 타일의 한 변의 길이를 나타낸다. 타일 장식물을 구성하는 정사각형 타일 한 변의 길이를 안쪽 타일부터 시작하여 차례로 적으면 다음과 같다.&lt;br /&gt;[1, 1, 2, 3, 5, 8, .]&lt;br /&gt;지수는 문득 이러한 타일들로 구성되는 큰 직사각형의 둘레가 궁금해졌다. 예를 들어, 처음 다섯 개의 타일이 구성하는 직사각형(위에서 빨간색으로 표시한 직사각형)의 둘레는 26이다.&lt;/p&gt;
&lt;p&gt;타일의 개수 N이 주어질 때, N개의 타일로 구성된 직사각형의 둘레를 return 하도록 solution 함수를 작성하시오.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;제한 사항&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;N은 1 이상 80 이하인 자연수이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;입출력 예&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span style=&quot;color: #333333;&quot;&gt;N&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;return&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;내 풀이&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;
#include 
#include 

using namespace std;

long long int fib[128];

long long solution(int N) {
    
    fib[1] = 1;
    fib[2] = 1;
    
    for(int ii = 3; ii &amp;lt;= N + 1; ii++)
    {
        fib[ii] = fib[ii - 1] + fib[ii - 2];
    }
    
    return  fib[N] * 2 + fib[N + 1] * 2;
    
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그냥 피보나치.&lt;/p&gt;
&lt;p&gt;하지만 이 피보나치가 모 회사 필기테스트에도 나온 적이 있으니 잊어먹진 말아야겠다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스</category>
      <author>ACA_</author>
      <guid isPermaLink="true">https://acatistory.tistory.com/88</guid>
      <comments>https://acatistory.tistory.com/88#entry88comment</comments>
      <pubDate>Wed, 18 Dec 2019 18:49:19 +0900</pubDate>
    </item>
  </channel>
</rss>