¿ÀÇÁ¼ÂÀ¸·ÎºÎÅÍ ÁÙ¹øÈ£¿Í ¿¹øÈ£¸¦ ã¾ÆÁÖ´Â GetRCFromOff ÇÔ¼ö´Â À¯Æ¿¸®Æ¼ ÇÔ¼öµé Áß¿¡ °¡Àå ÀÚÁÖ È£ÃâµÇ´Â ÇÔ¼öÀÌ´Ù. ¾ÕÀ¸·Î ´õ ´Ã¾î³ª°ÚÁö¸¸ ApiEdit9´Â 22 °÷¿¡¼ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ÁÙ¹øÈ£¸¦ ±¸ÇÏ°í ÀÖ´Ù. ÀÌ·¸°Ô ÀÚÁÖ È£ÃâµÇ´Â ÇÔ¼öÀε¥µµ °Ë»ö ¹æ¹ýÀÌ ´Ù¼Ò ºÒÇÕ¸®ÇÏ°Ô ÀÛ¼ºµÇ¾î ÀÖ¾î ¹®¼°¡ Ä¿Áö¸é °Ë»ö ¼Óµµ°¡ ´À·ÁÁø´Ù. µû¶ó¼ ÀÌ ÇÔ¼ö¸¦ ÃÖÀûÈÇÏ¿© °Ë»ö ¼Óµµ¸¦ °³¼±Çϸé Àü¹ÝÀûÀÎ ¼Óµµ Çâ»óÀ» ±â´ëÇÒ ¼ö ÀÖ´Ù.
ÀÌ ÇÔ¼ö°¡ ÁÙ¹øÈ£¸¦ ã´Â ¹æ¹ýÀº °Ë»ö ¹æ¹ý Áß °¡Àå ´Ü¼øÇÑ ¼øÂ÷ °Ë»ö(Sequential Search)ÀÌ´Ù. ¹®¼ÀÇ Ã¹ ÁÙºÎÅÍ °Ë»öÀ» ½ÃÀÛÇÏ¿© ¿øÇÏ´Â ÁÙÀ» ãÀ» ¶§±îÁö ÁÙ¹øÈ£¸¦ °è¼Ó Áõ°¡½ÃÄÑ °¡¸ç °Ë»öÇØ ³ª°£´Ù. 0¹ø ÁÙºÎÅÍ ¡®³Ê ÀÌ ¿ÀÇÁ¼Â °¡Áö°í ÀÖ¾î?¡¯¶ó´Â Áú¹®À» ´øÁö±â ½ÃÀÛÇؼ 1¹ø ÁÙ, 2¹ø ÁÙ, 3¹ø ÁÙ ½ÄÀ¸·Î °è¼Ó Áú¹®À» ÇØ ³ª°¡´Ù°¡ Yes¶ó´Â ´ë´äÀ» µéÀ» ¶§±îÁö °Ë»öÀ» ÇÏ´Â °ÍÀÌ´Ù. ¹®¼°¡ ªÀ¸¸é ÀÌ ¹æ¹ýµµ È¿À²ÀûÀÌÁö¸¸ ¹®¼ ±æÀÌ°¡ Ä¿Áö¸é ÀÚ¿¬È÷ °Ë»ö ¼Óµµ°¡ ´À·ÁÁú ¼ö¹Û¿¡ ¾ø´Ù.
ÀÌ ÇÔ¼ö°¡ °Ë»öÇÏ´Â ´ë»óÀÎ pLine ¹è¿Àº ¿ÀÇÁ¼Â ¼ø¼´ë·Î Á¤·Ä(Sort. Align°ú´Â ´Ù¸§)µÇ¾î Àִٴ Ư¡ÀÌ ÀÖÀ¸¸ç ÀÌ Æ¯Â¡À» ½ÊºÐ È°¿ëÇÏ¿© À̺Р°Ë»ö(Binary Search)À¸·Î ¾Ë°í¸®ÁòÀ» ¹Ù²Ù¸é ÈξÀ ´õ »¡¸® ¿øÇÏ´Â ÁÙÀ» ã´Â´Ù. À̺Р°Ë»öÀ̶õ Àüü ±¸°£À» ¹Ý¾¿ ³ª´©¾î °¡¸ç ã´Â °ªÀÌ ÀÖ´Â ±¸°£À» ¼±ÅÃÇØ ³ª°¡´Â °Ë»ö ¹æ¹ýÀÌ¸ç ¹®¼°¡ Ä¿Á®µµ ºñ±³ Ƚ¼ö°¡ ±×¸® ¸¹Áö ¾Ê´Ù.
¿¹¸¦ µé¾î ¹®¼°¡ ÃÑ 1000ÁÙÀ̶ó°í ÇÒ ¶§ 200¹ø° ÁÙÀ» °Ë»öÇØ¾ß ÇÑ´Ù°í Çغ¸ÀÚ. Àüü 1000ÁÙÀ» Àý¹ÝÀ¸·Î ³ª´©¸é 0~500, 500~1000 µÎ ±¸°£À¸·Î ³ª´©¾îÁø´Ù. ÀÌ ±¸°£ÀÇ °æ°èÀÎ 500ÀÇ °ªÀ» º¸°í ÀÌ °ªº¸´Ù ã´Â °ªÀÌ ´õ Å©´Ù¸é µÚÂÊ ±¸°£À» ¼±ÅÃÇÏ°í ÀÛ´Ù¸é ¾ÕÂÊ ±¸°£À» ¼±ÅÃÇÑ´Ù. ¹°·Ð 500ÀÌ Ã£´Â °ªÀÌ¸é ´õ ÀÌ»ó °Ë»öÇÒ ÇÊ¿äµµ ¾ø´Ù. ±×·¯¸é 0~499°¡ ¸ÕÀú ¼±ÅÃµÇ°í ´Ù½Ã ÀÌ ±¸°£À» ³ª´©¸é 0~250ÀÌ ¼±Åõǰí 125~250±¸°£ÀÌ ¼±Åõǰí ÀÌ·± ½ÄÀ¸·Î °è¼Ó ¹üÀ§¸¦ Á¼Çô ³ª°¡´Ù º¸¸é ¿øÇÏ´Â 200ÁÙÀ» ±Ý¹æ °Ë»öÇØ ³¾ ¼ö ÀÖ´Ù.
GetRCFromOff ÇÔ¼ö¸¦ ÀÌ ¹æ½Ä´ë·Î °Ë»öÇϵµ·Ï ¹Ù²Ù¾î º¸ÀÚ. ¿Ï¼ºµÈ ÄÚµå´Â ´ÙÀ½°ú °°´Ù. À̺Р°Ë»ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ¾Ë°í¸®Áò ¼ÀûÀ» º¸¸é ¾î·ÆÁö ¾Ê°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ¸¹Ç·Î »ó¼¼ÇÑ ÄÚµå ºÐ¼®Àº »ý·«ÇÑ´Ù.
void GetRCFromOff(int nPos, int &r, int &c)
{
int Upper,Lower;
Lower=0;
Upper=TotalLine-1;
for (;;) {
r=(Upper+Lower)/2;
if (nPos > pLine[r].Start && nPos < pLine[r].End)
break;
if (nPos == pLine[r].Start) {
if (pLine[r].nLine != 0 && bLineEnd==TRUE) {
r--;
}
break;
}
if (nPos == pLine[r].End) {
if (buf[pLine[r].End] == 0 || buf[pLine[r].End] == ¡®\r¡¯ || bLineEnd == TRUE) {
break;
}
}
if (pLine[r].Start > nPos) {
Upper=r-1;
} else {
Lower=r+1;
}
}
c=nPos-pLine[r].Start;
}
¼øÂ÷ °Ë»öÀ» ÇÒ ¶§¿Í ºñ±³Çغ¸¸é ¾Ë°í¸®Áò ¿Ü¿¡µµ ¸î °¡Áö ´Þ¶óÁø °ÍÀÌ Àִµ¥ ¿ÀÇÁ¼ÂÀÌ ÀÌ ÁÙ¿¡ ¼ÓÇß´ÂÁö ¹üÀ§¸¦ °Ë»çÇÒ ¶§ StartÀ§Ä¡´Â Á¦¿ÜµÈ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. nPos¿Í pLine[r].Start¸¦ ºñ±³ÇÏ´Â ¿¬»êÀÚ°¡ >=¿¡¼ >·Î ¹Ù²î¾ú´Ù. ¿ÀÇÁ¼ÂÀÌ ÁÙÀÇ Ã³À½°ú °°´õ¶óµµ ÀÌ ÁÙÀÌ ÀÚµ¿°³ÇàµÈ ÁÙÀÌ°í bLineEnd°¡ TRUEÀ̸é ÀÌ ¿ÀÇÁ¼ÂÀº ÀÌÀü ÁÙÀÇ ³¡¿¡ ÀÖ´Â °ÍÀ̹ǷΠº°µµ·Î Á¶°Ç Á¡°ËÀ» ÇØ¾ß ÇÑ´Ù.
¼øÂ÷ °Ë»öÀ» ÇÒ ¶§´Â Start¸¦ ¹üÀ§¿¡ Æ÷ÇÔ½ÃÄѵµ »ó°ü¾ø´Âµ¥ ¿Ö³ÄÇϸé Ç×»ó ÀÁÙÀÌ ¸ÕÀú °Ë»çµÇ°í ÀÁÙ¿¡¼ nPos°¡ End¿Í °°°í bLineEnd°¡ TRUEÀ̸é ÀÌ ¿ÀÇÁ¼ÂÀ» ¸ÕÀú ÀÚ½ÅÀÇ ÁÙ¿¡ Æ÷ÇÔ½ÃÅ°±â ¶§¹®ÀÌ´Ù. nPos°¡ Start¿Í °°¾ÆÁø Á¶°ÇÀº ÀÌ¹Ì ÀÁÙÀº ¾Æ´Ï¶ó´Â °¡Á¤ÀÌ ÀÖÀ¸¹Ç·Î nPos°¡ Start¿Í °°À» ¶§ ¹«Á¶°Ç ÀÌ ÁÙ¿¡ ¼ÓÇÑ ¿ÀÇÁ¼ÂÀ̶ó°í º¼ ¼ö ÀÖ¾ú´Ù.
±×·¯³ª À̺Р°Ë»öÀº ÁÙ¹øÈ£ ¼øÀ¸·Î Å×½ºÆ®¸¦ ÇÏ´Â °ÍÀÌ ¾Æ´Ï°í ±¸°£ÀÇ Áß°£Áß°£À» ÄîÄî Âñ·¯ º¸¸é¼ ¡®ÀÌ ¿ÀÇÁ¼ÂÀÌ ´Ï ²¨¾ß? ¾Æ´Ï¸é ³Êº¸´Ù Ä¿, ÀÛ¾Æ?¡¯¸¦ Áú¹®Çϱ⠶§¹®¿¡ ¾î¶² ÁÙÀÌ ¸ÕÀú Å×½ºÆ®µÉÁö ¾Ë ¼ö°¡ ¾ø´Â °ÍÀÌ´Ù. ±×·¡¼ nPos°¡ StartÀÎ °æ¿ì´Â ¹«Á¶°Ç ÁÙ ¹üÀ§¾È¿¡ ÀÖ´Ù°í È®½ÅÇÒ ¼ö ¾øÀ¸¸ç º°µµÀÇ Å×½ºÆ®°¡ ´õ ÇÊ¿äÇÏ´Ù. nLineÀÌ 0ÀÌ ¾Æ´Ï¶ó´Â Á¶°ÇÀº ÀÚµ¿°³ÇàµÈ ÁÙÀÇ ¼±µÎ¶ó´Â ¶æÀ̸ç ÀÌ »óÅ¿¡¼ bLineEnd°¡ TRUEÀ̸é ÀÌ ÁÙ ¹Ù·Î ¾Õ ÁÙÀÇ ³¡ ¿ÀÇÁ¼ÂÀ̶ó°í ÆÇ´ÜÇÏ°Ô µÈ´Ù.
¾Ë°í¸®ÁòÀ» ¹Ù²Û ÈÄ ¿¹Á¦¸¦ ½ÇÇàÇغ¸¸é È¿°ú´Â °¡È÷ ³î¶ö¸¸ÇÏ´Ù. ¹®¼ÀÇ ¾î´À ºÎºÐ¿¡¼³ª ij·µÀ̵¿À̳ª ¼±Åÿ¡ Áö¿¬ÀÌ °ÅÀÇ ¾ø´Ù´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. 96000ÁÙÀ» ã´Âµ¥ 96000¹øÀ» ºñ±³Çß´ø °ÍÀ» 17¹ø Á¤µµ¸¸ ºñ±³Çϸé ãÀ» ¼ö ÀÖ°Ô µÇ¾ú±â ¶§¹®ÀÌ´Ù. ´õ±¸³ª ¼±ÅÃÇÒ ¶§´Â ÀÌ ÇÔ¼ö°¡ ÇÑ ¹ø È£ÃâµÇ´Â °Íµµ ¾Æ´Ï°í ¿©·¯ ¹ø ¹Ýº¹ÀûÀ¸·Î È£ÃâµÇ±â ¶§¹®¿¡ ¼Óµµ Çâ»ó È¿°ú°¡ ´õ¿í Å©´Ù.