°³Á¤ÆÇÀÇ °³¼± ³»¿ë
ÀÌ Ã¥Àº ÀڷᱸÁ¶¿¡ ´ëÇÑ ±âº» °³³äÀ» °®Ãá ÇкΠ3, 4Çгâ ÇлýµéÀ» À§ÇÏ¿© ÁýÇʵǾúÀ¸³ª, ±â¼ú°í½Ã, ¿Ã¸²ÇǾƵå¿Í °°Àº °æ½Ã´ëȸ¸¦ ÁغñÇÏ´Â Çлýµé¿¡°Ôµµ µµ¿òÀÌ µÉ °ÍÀÌ´Ù. ¶ÇÇÑ µ¥ÀÌÅÍ »çÀ̾ð½º, ÀüÀÚ°øÇÐ, ¼öÇÐ, °æ¿µÇÐÀ» Àü°øÇÏ´Â Çлýµé¿¡°Ô´Â ¾Ë°í¸®ÁòÀ» ½º½º·Î ¹è¿ì°í ÀÍÈú ¼ö ÀÖ´Â ÁÁÀº ÀÔ¹®¼°¡ µÇ¸®¶ó »ý°¢ÇÑ´Ù. µ¶ÀÚµéÀÌ ¾Ë°í¸®ÁòÀÇ ±âº» °³³äÀ» ÀÌÇØÇÔÀ¸·Î½á ±Ã±ØÀûÀ¸·Î´Â ½Ç¼¼°èÀÇ ¾î¶² ¹®Á¦°¡ ÁÖ¾îÁö´õ¶óµµ ±× ¹®Á¦¸¦ ºÐ¼®ÇÏ°í ÇØ°áÇÒ ¼ö ÀÖ´Â ´É·ÂÀ» °¡Áú ¼ö ÀÖ°Ô µÇ±â¸¦ ¹Ù¶ó´Â ¸¶À½ÀÌ´Ù.
°³Á¤ÆÇ¿¡´Â ºñ±³Àû ÃֽŠÁ¤·Ä ¾Ë°í¸®ÁòÀÎ ÀÌÁß ÇǺ¿ Äü Á¤·Ä°ú Tim Sort¸¦ ºÎ·Ï V¿¡ Ãß°¡ÇÏ¿´À¸¸ç, Á¤·Ä ¾Ë°í¸®ÁòµéÀÇ ¼º´É ºñ±³¸¦ Ç¥·Î ¸¸µé¾î ¾Æ¿ï·¯ Ãß°¡ÇÏ¿´´Ù. ÀÌÁß ÇǺ¿ Äü Á¤·ÄÀº Äü Á¤·Ä ´ë½Å¿¡ ÃֽŠ¹öÀüÀÇ Java ¾ð¾îÀÇ ¿ø½Ã ŸÀÔ Á¤·Ä ¶óÀ̺귯¸®·Î »ç¿ëµÇ°í ÀÖÀ¸¸ç, Tim Sort´Â ÀϹÝÀûÀ¸·Î ¼º´ÉÀÌ ´Ù¸¥ Á¤·Ä ¾Ë°í¸®Áòº¸´Ù ¿ì¼öÇÏ¿© ÆÄÀ̼±, ¾Èµå·ÎÀ̵å, Java ¾ð¾îÀÇ °´Ã¼ ŸÀÔ Á¤·Ä ¶óÀ̺귯¸®·Î »ç¿ëµÇ°í ÀÖ´Ù.
¶ÇÇÑ °³Á¤ÆÇ¿¡´Â 200°³°¡ ³Ñ´Â »õ ¿¬½À ¹®Á¦°¡ Ãß°¡µÇ¾ú´Ù. ±×Áß¿¡ °¢ ÀåÀÇ ¿¬½À ¹®Á¦ÀÇ ¾ÕºÎºÐ¿¡´Â ±âº» °³³ä ÆľÇÀ» À§ÇÑ °´°ü½Ä ¹®Á¦µé°ú ÀÔ»ç ¸éÁ¢½ÃÇè¿¡ ÀÚÁÖ µîÀåÇÏ´Â ¹®Á¦µé·ÎºÎÅÍ ³À̵µ°¡ ºñ±³Àû ³ôÀº ÁÖ°ü½Ä ¹®Á¦µé±îÁö Ãß°¡µÇ¾ú´Ù.
ÀÌ Ã¥ÀÇ ³»¿ë
Á¦1Àå ¾Ë°í¸®ÁòÀÇ Ã¹°ÉÀ½
ÀÌ¹Ì ¿ì¸®°¡ ¾Ë°í ÀÖ´Â ¾Ë°í¸®ÁòµéºÎÅÍ ¼ö¼ö²²³¢°°ÀÌ Àç¹ÌÀÖ´Â ¹®Á¦¿¡ ´ëÇÑ ¾Ë°í¸®ÁòµéÀ» »ìÆ캻´Ù.
Á¦2Àå ¾Ë°í¸®ÁòÀ» ¹è¿ì±â À§ÇÑ Áغñ
¾Ë°í¸®ÁòÀ̶õ ¹«¾ùÀΰ¡¸¦ ¾Ë¾Æº¸°í, ÃÖÃÊÀÇ ¾Ë°í¸®ÁòÀÎ À¯Å¬¸®µåÀÇ ÃÖ´ë°ø¾à¼ö ¾Ë°í¸®ÁòÀ» ¼Ò°³Çϸç, 3ÀåºÎÅÍ ´Ù·ç´Â ¾Ë°í¸®ÁòµéÀ» ¹è¿ï Áغñ¸¦ À§ÇÑ ¾Ë°í¸®ÁòÀÇ Ç¥Çö¹æ¹ý, ¾Ë°í¸®ÁòÀÇ ºÐ·ù, ¾Ë°í¸®ÁòÀÇ È¿À²¼º Ç¥Çö ¹æ¹ý, º¹ÀâµµÀÇ Á¡±ÙÀû Ç¥±â¸¦ ¼Ò°³ÇÏ°í, ¸¶Áö¸·À¸·Î ¿Ö È¿À²ÀûÀÎ ¾Ë°í¸®ÁòÀÌ ÇÊ¿äÇÑ°¡¸¦ ¼³¸íÇÑ´Ù.
Á¦3Àå ºÐÇÒ Á¤º¹ ¾Ë°í¸®Áò
ºÐÇÒ Á¤º¹(Divide-and-Conquer) ¾Ë°í¸®ÁòÀ¸·Î ÇØ°áµÇ´Â ¹®Á¦µéÀ» ¼Ò°³ÇÏ°í, ±×¿¡ ´ëÇÑ ¾Ë°í¸®ÁòµéÀ» ¼³¸íÇÑ´Ù. ÇÕº´ Á¤·Ä(Merge sort), Äü Á¤·Ä(Quick sort), ¼±ÅÃ(Selection) ¹®Á¦, ÃÖ±ÙÁ¢ Á¡ÀÇ ½Ö(Closest Pair) ã±â ¹®Á¦¸¦ ´Ù·é´Ù.
Á¦4Àå ±×¸®µð ¾Ë°í¸®Áò
±×¸®µð(Greedy) ¾Ë°í¸®ÁòÀº top-down ¹æ½ÄÀ¸·Î ÃÖÀûÈ ¹®Á¦¸¦ ÇØ°áÇÏ´Â ¾Ë°í¸®ÁòÀÌ´Ù. µ¿Àü °Å½º¸§µ·(Coin Change), ÃÖ¼Ò ½ÅÀå Æ®¸®(Minimum Spanning Tree), ÃÖ´Ü °æ·Î(Shortest Path), ºÎºÐ ¹è³¶(Fractional Knapsack) ¹®Á¦, ÁýÇÕ Ä¿¹ö(Set Cover), ÀÛ¾÷ ½ºÄÉÁÙ¸µ(Task Scheduling), ÇãÇÁ¸¸ ¾ÐÃà(Huffman Encoding)¿¡ ´ëÇÑ ±×¸®µð ¾Ë°í¸®ÁòÀ» °¢°¢ ¼Ò°³ÇÑ´Ù.
Á¦5Àå µ¿Àû °èȹ ¾Ë°í¸®Áò
µ¿Àû °èȹ(Dynamic Programming) ¾Ë°í¸®ÁòÀº ÃÖÀûÈ ¹®Á¦¸¦ ÇØ°áÇÏ´Â bottom-up ¹æ½ÄÀÇ ¾Ë°í¸®ÁòÀÌ´Ù. ¸ðµç ½Ö ÃÖ´Ü °æ·Î(All Pairs Shortest Paths), ¿¬¼Ó Çà·Ä °ö¼À(Chained Matrix Multiplication), ÆíÁý °Å¸®(Edit Distance) ¹®Á¦, ¹è³¶(Knapsack) ¹®Á¦, µ¿Àü °Å½º¸§µ·(Coin Change) ¹®Á¦ÀÇ µ¿Àû °èȹ ¾Ë°í¸®ÁòÀ» ¼Ò°³ÇÑ´Ù.
Á¦6Àå Á¤·Ä ¾Ë°í¸®Áò
±âº»ÀûÀÎ Á¤·Ä ¾Ë°í¸®ÁòÀÎ ¹öºí Á¤·Ä(Bubble sort), ¼±Åà Á¤·Ä(Selection sort), »ðÀÔ Á¤·Ä(Insertion sort)À» ´Ù·ç°í, À̺¸´Ù È¿À²ÀûÀÎ ½© Á¤·Ä(Shell sort)°ú Èü Á¤·Ä(Heap sort)À» »ìÆ캸¸ç, ƯÁ¤ ȯ°æ¿¡¼ »ç¿ëµÇ´Â ±â¼ö Á¤·Ä(Radix sort)°ú ¿ÜºÎÁ¤·Ä(External sort)À» ¼Ò°³ÇÑ´Ù.
Á¦7Àå NP-¿ÏÀü ¹®Á¦
¾ÕÀå¿¡¼ ¼Ò°³µÈ ´ëºÎºÐÀÇ ¹®Á¦µéÀº ´ÙÇ×½Ä ½Ã°£º¹ÀâµµÀÇ ¾Ë°í¸®ÁòÀ¸·Î ÇØ°áµÇ³ª, ½Ç¼¼°è¿¡¼ ¸¹ÀÌ ÀÀ¿ëµÇ´Â Áß¿äÇÑ ¹®Á¦µéÀº ±×·¯ÇÏÁö ¸øÇÏ´Ù. ÀÌ·¯ÇÑ ¹®Á¦µé Áß¿¡¼ ´ëÇ¥ÀûÀÎ NP-¿ÏÀü ¹®Á¦µéÀ» ÀÌÇØÇÏ°í, ±× ¹®Á¦µé °£ÀÇ °ü°è¸¦ »ìÆ캻´Ù.
Á¦8Àå ±Ù»ç ¾Ë°í¸®Áò
Áö¼ö ½Ã°£º¹Àâµµ¸¦ °¡Áø NP-¿ÏÀü ¹®Á¦µé¿¡ ´ëÇÑ Á¤È®ÇÑ Çغ¸´Ù´Â ±Ù»ç ÇØ
(approximation solution)¸¦ ã´Â ¾Ë°í¸®ÁòµéÀ» ¼Ò°³ÇÑ´Ù. À̸¦ À§ÇØ ¿©ÇàÀÚ ¹®Á¦(Traveling Salesman Problem), Á¤Á¡ Ä¿¹ö(Vertex Cover) ¹®Á¦, Åë ä¿ì±â(Bin Packing) ¹®Á¦, ÀÛ¾÷ ½ºÄÉÁÙ¸µ(Job Scheduling) ¹®Á¦, Ŭ·¯½ºÅ͸µ(Clustering) ¹®Á¦ÀÇ ±Ù»ç ¾Ë°í¸®ÁòÀ» °¢°¢ ¾Ë¾Æº»´Ù.
Á¦9Àå ÇØ Å½»ö ¾Ë°í¸®Áò
NP-¿ÏÀü ¹®Á¦ÀÇ Çظ¦ Ž»öÇϱâ À§ÇÑ ´Ù¾çÇÑ ¾Ë°í¸®ÁòÀ» ¼Ò°³ÇÑ´Ù. ¹éÆ®·¡Å·(Backtracking) ±â¹ý, ºÐ±â ÇÑÁ¤(Branch-and-Bound) ±â¹ý, À¯ÀüÀÚ ¾Ë°í¸®Áò
(Genetic Algorithm), ¸ðÀÇ ´ã±ÝÁú(Simulated Annealing) ±â¹ýÀ» ¼Ò°³ÇÑ´Ù. |