<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=IsBiggerSmarter%EF%BC%9F%2F%EB%AC%B8%EB%B3%B4%EC%B0%BD</id>
	<title>IsBiggerSmarter？/문보창 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=IsBiggerSmarter%EF%BC%9F%2F%EB%AC%B8%EB%B3%B4%EC%B0%BD"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=IsBiggerSmarter%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;action=history"/>
	<updated>2026-05-15T09:08:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=IsBiggerSmarter%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;diff=87193&amp;oldid=prev</id>
		<title>Maintenance script: Table transclusion repair v1</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=IsBiggerSmarter%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;diff=87193&amp;oldid=prev"/>
		<updated>2026-03-27T12:46:17Z</updated>

		<summary type="html">&lt;p&gt;Table transclusion repair v1&lt;/p&gt;
&lt;a href=&quot;https://mediawiki.zeropage.org/index.php?title=IsBiggerSmarter%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;amp;diff=87193&amp;amp;oldid=32581&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=IsBiggerSmarter%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;diff=32581&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=IsBiggerSmarter%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;diff=32581&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 소감 ==&lt;br /&gt;
단순히 Greedy 알고리즘으로 접근. 실패. Dynamic Programming 이 필요함을 테스트 케이스로써 확인했다. Dynamic Programming 을 실제로 해본 경험이 없기 때문에 감이 잡히지 않았다. Introduction To Algorithm에서 Dynamic Programing 부분을 읽어 공부한 후 문제분석을 다시 시도했다. 이 문제를 쉽게 풀기 위해 Weight를 정렬한 배열과 IQ를 정렬한 배열을 하나의 문자열로 보았다. 그렇다면 문제에서 원하는 &amp;quot;가장 긴 시퀀스&amp;quot; 는 Longest Common Subsequence가 되고, LCS는 Dynamic Algorithm으로 쉽게 풀리는 문제중 하나였다. 무게가 같거나, IQ가 같을수도 있기 때문에 LCS에서 오류가 나는 것을 피하기 위해 소트함수를 처리해 주는 과정에서 약간의 어려움을 겪었다. &lt;br /&gt;
&lt;br /&gt;
{{| 2005/07/09 Accepted 0:00.035 64 |}}&lt;br /&gt;
&lt;br /&gt;
lcs_length함수에서 cost table을 만들어주는 과정의 running time은 O(n*n), memory cost는 O(n*n)이다. 그리고 print_lcs 함수에서 longest path를 거슬러 올라가는 running time은 O(n + n) = O(n)이다. &lt;br /&gt;
&lt;br /&gt;
무엇보다 몇일동안 고생해서 푼 보람이 있어 좋다.&lt;br /&gt;
&lt;br /&gt;
== 코드 ==&lt;br /&gt;
==== ver1 (Greedy Algorithm) ====&lt;br /&gt;
이 알고리즘은 답을 산출해 내지 못한다.&lt;br /&gt;
 //no 10131&lt;br /&gt;
 #include &amp;amp;lt;fstream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;algorithm&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 fstream fin(&amp;quot;input.txt&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 const int MAX_ELEPHANT = 1100;&lt;br /&gt;
 &lt;br /&gt;
 struct Elephant&lt;br /&gt;
 {&lt;br /&gt;
 	int index;&lt;br /&gt;
 	int weight;&lt;br /&gt;
 	int IQ;&lt;br /&gt;
 	bool operator () (const Elephant &amp;amp;amp; a, const Elephant &amp;amp;amp; b)&lt;br /&gt;
 	{&lt;br /&gt;
 		if (a.weight &amp;amp;lt; b.weight)&lt;br /&gt;
 			return true;&lt;br /&gt;
 		else if (a.weight == b.weight)&lt;br /&gt;
 		{&lt;br /&gt;
 			if (a.IQ &amp;amp;gt; b.IQ)&lt;br /&gt;
 				return true;&lt;br /&gt;
 		}&lt;br /&gt;
 		return false;&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 int input_elephant_info(Elephant * e);&lt;br /&gt;
 void count_elephant(Elephant * elephant, int num_elephant);&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	Elephant elephant[MAX_ELEPHANT];&lt;br /&gt;
 	int num_elephant = input_elephant_info(elephant);&lt;br /&gt;
 	sort(&amp;amp;amp;elephant[0], &amp;amp;amp;elephant[num_elephant], Elephant());&lt;br /&gt;
 	count_elephant(elephant, num_elephant);&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int input_elephant_info(Elephant * e)&lt;br /&gt;
 {&lt;br /&gt;
 	int count = 0;&lt;br /&gt;
 	while (fin &amp;amp;gt;&amp;amp;gt; e[count].weight &amp;amp;gt;&amp;amp;gt; e[count].IQ)&lt;br /&gt;
 	{&lt;br /&gt;
 		e[count].index = count + 1;&lt;br /&gt;
 		count++;&lt;br /&gt;
 		fin.get();&lt;br /&gt;
 		if (fin.peek() == EOF)&lt;br /&gt;
 			break;&lt;br /&gt;
 	}&lt;br /&gt;
 	return count;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void count_elephant(Elephant * e, int num)&lt;br /&gt;
 {&lt;br /&gt;
 // test&lt;br /&gt;
 //	for (int t = 0; t &amp;amp;lt; num; t++)&lt;br /&gt;
 //	{&lt;br /&gt;
 //		cout &amp;amp;lt;&amp;amp;lt; e[t].index &amp;amp;lt;&amp;amp;lt; &amp;quot; &amp;quot; &amp;amp;lt;&amp;amp;lt; e[t].weight &amp;amp;lt;&amp;amp;lt; &amp;quot; &amp;quot; &amp;amp;lt;&amp;amp;lt; e[t].IQ &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 //	}&lt;br /&gt;
 // end&lt;br /&gt;
 &lt;br /&gt;
 	int max_count = 0;&lt;br /&gt;
 	int count;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; v_temp;&lt;br /&gt;
 	vector&amp;amp;lt;int&amp;amp;gt; result;&lt;br /&gt;
 	result.reserve(MAX_ELEPHANT);&lt;br /&gt;
 	v_temp.reserve(MAX_ELEPHANT);&lt;br /&gt;
 	Elephant temp;&lt;br /&gt;
 	int i;&lt;br /&gt;
 &lt;br /&gt;
 	for (int k = 0; k &amp;amp;lt; num - 1; k++)&lt;br /&gt;
 	{&lt;br /&gt;
 		temp.weight = e[k].weight;&lt;br /&gt;
 		temp.IQ = e[k].IQ;&lt;br /&gt;
 		v_temp.push_back(e[k].index);&lt;br /&gt;
 		count = 1;&lt;br /&gt;
 &lt;br /&gt;
 		for (i = k + 1; i &amp;amp;lt; num; i++)&lt;br /&gt;
 		{		&lt;br /&gt;
 			if (temp.weight &amp;amp;gt;= e[i].weight || temp.IQ &amp;amp;lt;= e[i].IQ)&lt;br /&gt;
 				continue;&lt;br /&gt;
 			temp.weight = e[i].weight;&lt;br /&gt;
 			temp.IQ = e[i].IQ;&lt;br /&gt;
 			count++;&lt;br /&gt;
 			v_temp.push_back(e[i].index);&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		if (count &amp;amp;gt; max_count)&lt;br /&gt;
 		{&lt;br /&gt;
 			max_count = count;&lt;br /&gt;
 			result = v_temp;&lt;br /&gt;
 		}&lt;br /&gt;
 		v_temp.clear();&lt;br /&gt;
 	}&lt;br /&gt;
 	&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; max_count &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 &lt;br /&gt;
 	for (i = 0; i &amp;amp;lt; max_count; i++)&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; result[i] &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== ver2. Dynamic Algorithm ====&lt;br /&gt;
 //no 10131  &lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;  &lt;br /&gt;
 #include &amp;amp;lt;algorithm&amp;amp;gt;  &lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;  &lt;br /&gt;
 using namespace std;  &lt;br /&gt;
 &lt;br /&gt;
 const int MAX_ELEPHANT = 1010;  &lt;br /&gt;
 const int WEIGHT = 1;&lt;br /&gt;
 const int IQ = 2;&lt;br /&gt;
 int TYPE_SORT;&lt;br /&gt;
 &lt;br /&gt;
 struct Elephant  &lt;br /&gt;
 {  &lt;br /&gt;
 	short index;  &lt;br /&gt;
 	short weight;  &lt;br /&gt;
 	short IQ;  &lt;br /&gt;
 	bool operator () (const Elephant &amp;amp;amp; a, const Elephant &amp;amp;amp; b)  &lt;br /&gt;
 	{  &lt;br /&gt;
 		if (TYPE_SORT == WEIGHT)&lt;br /&gt;
 		{&lt;br /&gt;
 			if (a.weight &amp;amp;lt; b.weight)  &lt;br /&gt;
 				return true;  &lt;br /&gt;
 			else if (a.weight == b.weight &amp;amp;amp;&amp;amp;amp; a.IQ &amp;amp;lt;= b.IQ)  &lt;br /&gt;
 					return true;  &lt;br /&gt;
 			return false;  &lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			if (a.IQ &amp;amp;gt; b.IQ)&lt;br /&gt;
 				return true;&lt;br /&gt;
 			else if (a.IQ == b.IQ &amp;amp;amp;&amp;amp;amp; a.weight &amp;amp;gt; b.weight)&lt;br /&gt;
 				return true;&lt;br /&gt;
 			return false;&lt;br /&gt;
 		}&lt;br /&gt;
 	}  &lt;br /&gt;
 };  &lt;br /&gt;
 &lt;br /&gt;
 Elephant elephant_weight[MAX_ELEPHANT]; &lt;br /&gt;
 Elephant elephant_IQ[MAX_ELEPHANT];&lt;br /&gt;
 int num_elephant; &lt;br /&gt;
 vector &amp;amp;lt;int&amp;amp;gt; result;&lt;br /&gt;
 &lt;br /&gt;
 int input_elephant_info();  &lt;br /&gt;
 void sort_elephant();&lt;br /&gt;
 int lcs_length(unsigned char t[][MAX_ELEPHANT]);&lt;br /&gt;
 void print_lcs(int i, int j, unsigned char t[][MAX_ELEPHANT]);&lt;br /&gt;
 void print_route(int len);&lt;br /&gt;
 &lt;br /&gt;
 int main()  &lt;br /&gt;
 {  &lt;br /&gt;
 	unsigned char table[MAX_ELEPHANT][MAX_ELEPHANT];&lt;br /&gt;
 	num_elephant = input_elephant_info();  &lt;br /&gt;
 	sort_elephant();&lt;br /&gt;
 &lt;br /&gt;
 	int len = lcs_length(table);&lt;br /&gt;
 	&lt;br /&gt;
 	print_lcs(num_elephant, num_elephant, table);&lt;br /&gt;
 &lt;br /&gt;
 	print_route(len);&lt;br /&gt;
 	return 0;  &lt;br /&gt;
 }  &lt;br /&gt;
 &lt;br /&gt;
 int input_elephant_info()  &lt;br /&gt;
 {  &lt;br /&gt;
 	int count = 0;  &lt;br /&gt;
 	while (cin.peek() != EOF)&lt;br /&gt;
 	{&lt;br /&gt;
 		count++;&lt;br /&gt;
 		cin &amp;amp;gt;&amp;amp;gt; elephant_weight[count].weight &amp;amp;gt;&amp;amp;gt; elephant_weight[count].IQ;&lt;br /&gt;
 		elephant_weight[count].index = count;  &lt;br /&gt;
 		elephant_IQ[count] = elephant_weight[count];&lt;br /&gt;
 		cin.get();  &lt;br /&gt;
 	}  &lt;br /&gt;
 	return count;  &lt;br /&gt;
 }  &lt;br /&gt;
 &lt;br /&gt;
 void sort_elephant()&lt;br /&gt;
 {&lt;br /&gt;
 	TYPE_SORT = WEIGHT;&lt;br /&gt;
 	sort(&amp;amp;amp;elephant_weight[1], &amp;amp;amp;elephant_weight[num_elephant+1], Elephant());&lt;br /&gt;
 	TYPE_SORT = IQ;&lt;br /&gt;
 	sort(&amp;amp;amp;elephant_IQ[1], &amp;amp;amp;elephant_IQ[num_elephant+1], Elephant());&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int lcs_length(unsigned char t[][MAX_ELEPHANT])  &lt;br /&gt;
 {  &lt;br /&gt;
 	int i, j;&lt;br /&gt;
 	for (i = 0; i &amp;amp;lt;= num_elephant; i++)&lt;br /&gt;
 		t[0][i] = t[i][0] = 0;&lt;br /&gt;
 	for (i = 1; i &amp;amp;lt;= num_elephant; i++)&lt;br /&gt;
 	{&lt;br /&gt;
 		for (j = 1; j &amp;amp;lt;= num_elephant; j++)&lt;br /&gt;
 		{&lt;br /&gt;
 			if (elephant_weight[i].index == elephant_IQ[j].index)&lt;br /&gt;
 				t[i][j] = t[i-1][j-1] + 1;&lt;br /&gt;
 			else if (t[i-1][j] &amp;amp;gt;= t[i][j-1])&lt;br /&gt;
 				t[i][j] = t[i-1][j];&lt;br /&gt;
 			else &lt;br /&gt;
 				t[i][j] = t[i][j-1];&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	return t[i-1][j-1];&lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 void print_lcs(int i, int j, unsigned char t[][MAX_ELEPHANT])&lt;br /&gt;
 {&lt;br /&gt;
 	if (i == 0 || j == 0)&lt;br /&gt;
 		return;&lt;br /&gt;
 	if (elephant_weight[i].index == elephant_IQ[j].index)&lt;br /&gt;
 	{&lt;br /&gt;
 		print_lcs(i-1, j-1, t);&lt;br /&gt;
 		result.push_back(elephant_weight[i].index);&lt;br /&gt;
 	}&lt;br /&gt;
 	else if (t[i-1][j] &amp;amp;gt;= t[i][j-1])&lt;br /&gt;
 		print_lcs(i-1, j, t);&lt;br /&gt;
 	else &lt;br /&gt;
 		print_lcs(i, j-1, t);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void print_route(int len)&lt;br /&gt;
 {&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; len &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	for (int i = 0; i &amp;amp;lt; len; i++)&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; result[i] &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 }&lt;br /&gt;
== 나한테 할 말 ==&lt;br /&gt;
----&lt;br /&gt;
[[IsBiggerSmarter？]] [[AOI]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>