Algorithms
by Kwang-Soo Hahn, [email protected]
Dept. of Computer Science, Kookmin University
910-4794, http://kshahn.kookmin.ac.kr
Objectives
- ´ëÇ¥ÀûÀÎ ¾Ë°í¸®Áò ¿¹¸¦ ÅëÇÏ¿© ¾Ë°í¸®Áò °³¹ß ÀýÂ÷¸¦
°øºÎÇÑ´Ù.
- ´ëºÎºÐÀÇ ¹®Á¦µéÀº ¿©·¯ ´Ù¸¥ ¾Ë°í¸®ÁòÀ¸·Î ÇØ°á
°¡´ÉÇÔÀ» ÀνÄÇÑ´Ù.
- ¾Ë°í¸®ÁòÀÇ È¿À²¼º¿¡ °üÇÑ °³³äÀ» ÀÌÇØÇÑ´Ù.
- ¾Ë°í¸®ÁòÀÇ ¿À·ù °Ë»ç¿¡ ´ëÇØ °øºÎÇÑ´Ù.
Algorithm: ¹®Á¦ ÇØ°áÀ» À§ÇÑ Ã¼°èÀûÀÎ ÀýÂ÷·Î ´ÙÀ½ Ư¼ºÀ» Áö³à¾ß ÇÑ´Ù.
- µÑ ÀÌ»óÀÇ Àǹ̷ΠÇؼ® °¡´ÉÇÏÁö ¾Êµµ·Ï ¸íÈ®ÇÏ°Ô Á¤ÀǵǾî¾ß
ÇÑ´Ù. (clear and unambiguous)
- ½ÇÇà °¡´ÉÇÑ À¯ÇÑ °³ÀÇ ´Ü°èµé·Î ±¸¼ºµÇ¾î¾ß ÇÑ´Ù. (finite executable
steps)
- À¯ÇÑ °³ÀÇ ½ÇÇà ´Ü°è¸¦ °ÅÄ¡¸é ±Ã±ØÀûÀ¸·Î ¹®Á¦ÀÇ ÇØ¿¡ µµ´ÞÇؾß
ÇÑ´Ù. (correct)
¿¹ 1) ¾î¶² ¼ö nÀÌ prime number (¼Ò¼ö: 1°ú ±× ÀÚ½ÅÀ¸·Î¸¸ ³ª´©¾îÁö´Â
¾çÀÇ Á¤¼ö) ÀÎÁö ¾Æ´ÑÁö °Ë»çÇÏ´Â ¾Ë°í¸®Áò
¾Ë°í¸®Áò 1)
- 1°ú n »çÀÌÀÇ ¸ðµç ¼ö¸¦ ¼±ÅÃÇÏ¿© ±× ¼ö°¡ nÀ» ³ª¸ÓÁö ¾øÀÌ ³ª´
¼ö ÀÖ³ª °Ë»çÇÑ´Ù.
- nÀ» ³ª´ ¼ö ÀÖ´Â ¼ö°¡ ¹ß°ßµÉ ¶§¸¶´Ù count¸¦ 1 Áõ°¡½ÃŲ´Ù.
- ¸ðµç ¼ö °Ë»ç °á°ú count°¡ 2À̸é nÀº prime number
bool IsPrime(int n)
{
int divisors, i;
divisors = 0;
for (i = 1; i <= n; i++) {
if (n % i == 0) divisors++;
}
return (divisors == 2);
}
À§ ¾Ë°í¸®ÁòÀº ¸íÈ®ÇÏ°í, Á¤È®ÇÏ°í, È¿À²ÀûÀΰ¡?
¸íÈ®¼º: Àΰ£ÀÌ »ç¿ëÇÏ´Â ¾ð¾î´Â ¸¹Àº °æ¿ì µÑ ÀÌ»óÀÇ Àǹ̷Î
Çؼ®µÉ ¿©Áö°¡ ÀÖÀ¸¹Ç·Î ¾Ë°í¸®Áò Ç¥Çö ¼ö´ÜÀ¸·Î´Â ºÎÀûÇÕÇÏ´Ù. ÇÁ·Î±×·¡¹Ö
¾ð¾î´Â ¸íÈ®ÇÑ Ç¥Çö ¼ö´ÜÀÌ¸ç µÑ ÀÌ»óÀÇ Àǹ̷ΠÇؼ®µÉ ¿©Áö°¡ ¾ø´Ù.
Á¤È®¼º: ÇÁ·Î±×·¥ÀÇ Á¤È®¼º°Ë»ç´Â ÀϹÝÀûÀ¸·Î ´ÙÀ½ µÎ ¹æ¹ýÀ»
¸¹ÀÌ »ç¿ëÇÑ´Ù.
- ÇÁ·Î±×·¥ Äڵ带 ÇÑ ÁÙ ÇÑ Á٠öÀúÈ÷ »ìÆì°¡¸ç ¿À·ù°¡ ÀÖ´ÂÁö
°Ë»çÇÑ´Ù. (Desk-checking)
- ÇÁ·Î±×·¥¿¡ ƯÁ¤ ÀÚ·áµéÀ» ÀÔ·ÂÇÏ¿© ±× ÀÚ·áµé¿¡ ´ëÇÑ Ã³¸® °á°ú°¡
Á¤È®ÇÑÁö °Ë»çÇÑ´Ù. (Testing)
À§ÀÇ µÎ ¹æ¹ýµµ ÇÁ·Î±×·¥ÀÇ Á¤È®¼º¿¡ ´ëÇÑ ½Å·Úµµ¸¦ ³ô¿©ÁÙ »Ó ¿Ïº®ÇÑ
ÇÁ·Î±×·¥ ¿À·ù °Ë»ç ¹æ¹ýÀº ¾ø´Ù.
À§ ¾Ë°í¸®ÁòÀ» 1¿¡¼ 1000 ±îÁöÀÇ µ¥ÀÌŸ·Î ½ÃÇèÇÑ °á°ú´Â Á¤È®ÇÔÀ»
¾Ë ¼ö ÀÖ´Ù.
È¿À²¼º: À§ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿© 1000ÀÌ prime number ÀÎÁö
°Ë»çÇÏ·Á¸é 1 ºÎÅÍ 1000 »çÀÌÀÇ ¼ö¸¦ ¸ðµÎ °Ë»çÇÏ¿© 1000À» ³ª´ ¼ö
ÀÖ´ÂÁö °Ë»çÇÏ¿©¾ß ÇÑ´Ù. (1000000ÀÌ prime numberÀÎÁö °Ë»çÇÒ °æ¿ì´Â?)
±×·¯³ª 2·Î 1000À» ³ª´©¾î ¶³¾îÁüÀ» ¾Ë ¶§ 1000ÀÌ prime number°¡
¾Æ´ÔÀ» ¹Ù·Î ¾Ë ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î À§ ¾Ë°í¸®Áò º¸´Ù ´õ È¿À²ÀûÀÎ
¾Ë°í¸®ÁòÀÌ Á¸ÀçÇÔÀ» ¾Ë ¼ö ÀÖ´Ù.
À§ ¾Ë°í¸®ÁòÀÇ °³¼± ¹æ¾È
- nÀÌ prime numberÀÎÁö °Ë»çÇϱâ À§ÇØ 1¿¡¼ n »çÀÌÀÇ ¸ðµç ¼ö·Î
nÀ» ³ª´©¾îº¼ ÇÊ¿ä´Â ¾ø´Ù. 1°ú n ÀÌ¿ÜÀÇ ¼ö·Î nÀÌ ³ª´©¾î Áö¸é nÀº
prime number°¡ ¾Æ´Ï´Ù.
- ¸¸ÀÏ nÀÌ 2·Î ³ª´©¾îÁöÁö ¾ÊÀ¸¸é 2ÀÇ ¹è¼ö·Îµµ ³ª´©¾îÁöÁö ¾Ê´Â´Ù.
ÀÌ °æ¿ì Ȧ¼ö¸¸ °Ë»çÇÏ¸é µÈ´Ù.
- nÀº n/2 º¸´Ù Å« ¼ö·Î´Â ³ª´©¾îÁöÁö ¾Ê´Â´Ù. ±×·¯¹Ç·Î n/2 º¸´Ù
ÀÛÀº ¼ö¸¸ °Ë»çÇÑ´Ù. (Á» ´õ »ý°¢Çϸé nÀÇ Á¦°ö±Ù º¸´Ù Å« ¼ö·Î´Â ³ª´©¾îÁöÁö
¾ÊÀ½À» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.)
À§ÀÇ °³¼± ¹æ¾ÈÀ» °í·ÁÇÑ »õ·Î¿î ¾Ë°í¸®Áò
bool IsPrime(int n)
{
int i;
if (n % 2 == 0) return (FALSE); // nÀÌ 2·Î ³ª´©¾îÁö¸é nÀº prime number°¡ ¾Æ´Ô
for (i = 3; i <= sqrt(n); i += 2) { // 3 ºÎÅÍ nÀÇ Á¦°ö±Ù±îÁö Ȧ¼ö¸¸ °Ë»ç
if (n % i == 0) return (FALSE);
}
return (TRUE); // À§ÀÇ °æ¿ì·Î ³ª´©¾îÁöÁö ¾ÊÀ¸¸é nÀº prime number?
}
À§ ÇÁ·Î±×·¥Àº Á¤È®ÇÏ°í È¿À²ÀûÀΰ¡?
- 2´Â Á¤ÀÇ¿¡ ÀÇÇØ prime number. ±×·¯³ª
À§ ÇÁ·Î±×·¥Àº nÀÌ 2ÀÏ °æ¿ì FALSE¸¦ return.
- 1Àº prime number°¡ ¾Æ´Ô.
- sqrt(n)Àº Çѹø¸¸ °è»êÇÏ¸é µÇ³ª À§ ÇÁ·Î±×·¥Àº for-loop ³»¿¡¼
¹Ýº¹ °è»êÇÑ´Ù.
- sqrt(n) °°Àº ½Ç¼ö ¿¬»êÀº ¿ÀÂ÷°¡ ÀÖÀ» ¼ö ÀÖ´Ù. (49ÀÇ Á¦°ö±ÙÀº
°è»ê °á°ú 7ÀÌ ¾Æ´Ò ¼ö ÀÖ´Ù)
ÃÖÁ¾ ÇÁ·Î±×·¥
bool IsPrime(int n)
{
int i, limit;
if (n <= 1) return (FALSE);
if (n == 2) return (TRUE);
if (n % 2 == 0) return (FALSE);
limit = sqrt(n) + 1;
for (i = 3; i <= limit; i += 2) {
if (n % i == 0) return (FALSE);
}
return (TRUE);
}
À§ ¾Ë°í¸®Áò°ú ù¹ø° ¾Ë°í¸®ÁòÀÇ Â÷ÀÌ´Â? (¾Ë°í¸®Áò ºÐ¼®)
µÎ ¾Ë°í¸®ÁòÀÇ Àå´ÜÁ¡Àº? (¾Ë°í¸®ÁòÀÇ ºñ±³, Tradeoffs)
¾î¶² ¾Ë°í¸®ÁòÀ» ¼±ÅÃÇÒ °ÍÀΰ¡? (¾Ë°í¸®Áò ¼±Åà ±âÁØ)
¿¹ 2) µÎ ¾çÀÇ Á¤¼ö x, y »çÀÌÀÇ ÃÖ´ë°ø¾à¼ö (Greatest Common Divisor;
GCD)¸¦ ±¸ÇÏ´Â ¾Ë°í¸®Áò
¾Ë°í¸®Áò 1) Brute-force algorithm
¾Ë°í¸®Áò 2) Euclid's algorithm
Á¦°ö±Ù, »ï°¢ÇÔ¼ö, Áö¼öÇÔ¼ö, logÇÔ¼ö, ¹ÌÀûºÐ ¹æÁ¤½Ä, ¿¬¸³¹æÁ¤½Ä
µîÀ» °è»êÇÏ´Â ¾Ë°í¸®ÁòÀÌ Á¸ÀçÇϰųª library functionÀ¸·Î Á¦°øµÈ´Ù.
(¼öÄ¡ Çؼ®; Numerical analysis)
Searching and Sorting
Searching: Array¿¡¼ ƯÁ¤ ¿ä¼Ò¸¦ ã´Â ÀÛ¾÷
Sorting: Array¿¡ ÀúÀåµÈ °ªÀ» ƯÁ¤ ¼ø¼¿¡ µû¶ó Á¤·Ä½ÃÅ°´Â ÀÛ¾÷
Searching
ƯÁ¤ °ª(key)À» °®´Â array element¸¦ ã´Â ¹®Á¦
¿¹) ƯÁ¤ °ª¿¡ ÇØ´çÇÏ´Â ¹Ì±¹ µ¿Àü À̸§ ã±â (findcoin.c)
°ª (cent) | µ¿Àü À̸§ |
1 | penny |
5 | nickel |
10 | dime |
25 | quarter |
50 | half-dollar |
Searching algorithm
- Linear search: Array element °ªÀ» óÀ½ºÎÅÍ ³¡±îÁö key °ªÀÌ
¹ß°ßµÉ ¶§±îÁö ºñ±³. Æò±ÕÀûÀ¸·Î N/2¹øÀÇ ºñ±³°¡ ÇÊ¿äÇÏ´Ù.
- Binary search: Array¿¡ ÀúÀåµÈ °ªµéÀÇ Áß°£ °ª°ú key °ªÀ» ºñ±³ÇÏ¿©
±× °á°ú¿¡ µû¶ó arrayÀÇ Àü¹ÝºÎ ȤÀº ÈĹݺηΠã´Â ¹üÀ§¸¦ Á¼Çô°¡´Â
¾Ë°í¸®Áò. Array°¡ Á¤·ÄµÇ¾î ÀÖ¾î¾ß Àû¿ë °¡´ÉÇϸç Æò±Õ log2N
¹øÀÇ ºñ±³°¡ ÇÊ¿äÇÏ´Ù.
Sorting
Array¿¡ ÀúÀåµÈ °ªÀ» ƯÁ¤ ¼ø¼(º¸Åë ÀÛÀº °ª¿¡¼ Å« °ª, ¶Ç´Â Å«
°ª¿¡¼ ÀÛÀº °ª)¿¡ µû¶ó Á¤·Ä
Sorting algorithm (ÀÛÀº °ª¿¡¼ Å« °ª
¼øÀ¸·Î; ascending order)
Selection sort (sort.h, sort.c)
- Àüü array¿¡¼ Á¦ÀÏ ÀÛÀº °ªÀ» ã¾Æ ù¹ø°¿¡ ÀúÀå
- µÎ¹ø°¿¡¼ ¸¶Áö¸·±îÁöÀÇ ¹è¿ °ªÁß Á¦ÀÏ ÀÛÀº °ªÀ» ã¾Æ µÎ¹ø°¿¡
ÀúÀå
- ...
- N-1¹ø°¿¡¼ ¸¶Áö¸·±îÁöÀÇ ¹è¿ °ªÁß Á¦ÀÏ ÀÛÀº °ªÀ» ã¾Æ N-1¹ø°¿¡
ÀúÀå
Bubble sort
- ¹è¿ óÀ½ºÎÅÍ ³¡±îÁö ÀÎÁ¢ÇÑ ¿ä¼Ò °ªµéÀ» ºñ±³ÇÏ¿© ¾ÕÀÇ °ªÀÌ
µÚÀÇ °ªº¸´Ù Å©¸é ¼·Î ±³È¯ (swap)
- ¹è¿ óÀ½ºÎÅÍ N-1±îÁö ÀÎÁ¢ÇÑ ¿ä¼Ò °ªµéÀ» ºñ±³ÇÏ¿© ¾ÕÀÇ °ªÀÌ
µÚÀÇ °ªº¸´Ù Å©¸é ¼·Î ±³È¯
- ...
- ¹è¿ ù¹ø° °ª°ú µÎ¹ø° °ªÀ» ºñ±³ÇÏ¿© ù¹ø° °ªÀÌ µÎ¹ø° °ªº¸´Ù
Å©¸é ¼·Î ±³È¯
Quick sort, shell sort, heap sort, ...
½Ç½À 1) Prime number, GCD algorithm ±¸Çö
½Ç½À 2) ¹è¿¿¡ ÀúÀåµÈ °ªÀ» Å©±â¼øÀ¸·Î Á¤·ÄÇÏ´Â ÇÁ·Î±×·¥ ÀÛ¼º
Insertion sort ¹æ¹ý »ç¿ë: (isort.c,
tabins.c)