n¹øÂ° ÇǺ¸³ªÄ¡ ¼ö Ãâ·ÂÇϱâ(Àç±Í)(¸Þ¸ðÀÌÁ¦À̼Ç)(¼³¸í) [1899 / 076B] Time Limit(Test case) : (ms) Number of users who solved : 0 Total Tried : 0 The Champion of this Problem (C++) : N/A My Best Submission (C++) : N/A [koistudy.net (T. HS Jeon 2017)] Background *ÁÖÀÇ»çÇ× : ÀÌ ¹®Á¦´Â Àç±Í ¼³°è ¹®Á¦·Î¼­ ¹Ýº¹¹®À» »ç¿ëÇÑ ÄÚµå´Â äÁ¡ÀÌ µÇÁö ¾Ê½À´Ï´Ù. ------ n¹øÂ° ÇǺ¸³ªÄ¡ ¼ö¸¦ 1000000007(10¾ï7)·Î ³ª´« ³ª¸ÓÁö¸¦ Ãâ·ÂÇϽÿÀ. (´Ü, ¹Ýº¹¹®Àº »ç¿ëÇÒ ¼ö ¾ø´Ù.) Âü°í ´ÙÁß Àç±Í´Â ÇϳªÀÇ ÇÔ¼ö°¡ ÀÚ±â ÀڽŰú °°Àº ÇüÅÂÀÇ º¸´Ù ÀÛÀº ÇÔ¼ö¸¦ ¿©·¯ °³ È£ÃâÇÏ°Ô µÇ¹Ç·Î, Áߺ¹ È£ÃâÀÌ ¹ß»ýÇÏ°Ô µÈ´Ù. ¿¹¸¦ µé¾î ÇǺ¸³ªÄ¡ ¼ö¸¦ °è»êÇÏ´Â ´ÙÀ½°ú °°Àº Á¡È­ °ü°è½ÄÀ» ¸¸µé°í, f(5)ÀÇ °ªÀ» ¾ò¾î³»±â À§Çؼ­´Â, f(5) = f(4) + f(3) = (f(3)+f(2)) + f(3) <-- f(3) Áߺ¹ È£Ãâ¹ß»ý = ((f(2)+f(1)) + f(2)) + f(3) = ((f(2)+f(1)) + f(2)) + (f(2)+f(1)) °ú °°ÀÌ Àç±Í ÇÔ¼ö°¡ ¿©·¯ ¹ø Áߺ¹ È£Ã⠵ȴÙ. f(99)¸¦ °è»êÇϱâ À§Çؼ­´Â ¾ó¸¶³ª ¸¹Àº Áߺ¹ È£ÃâÀÌ ÀÌ·ç¾îÁú±î? ÀÌ·± ÇüÅ·Π´ÙÁß Àç±Í¿¡ ÀÇÇØ Àç±ÍÇÔ¼ö°¡ È£ÃâµÇ´Â ±íÀ̰¡ Áõ°¡ÇÏ°Ô µÇ¸é, ÀÌÀü¿¡ È£ÃâÇß´ø ¶È°°Àº Àç±Í ÇÔ¼öÀÇ Áߺ¹ È£ÃâÀÌ ±âÇϱ޼öÀûÀ¸·Î Áõ°¡ÇÏ°Ô µÇ¾î, Àç±ÍÈ£Ãâ »óŸ¦ ÀúÀåÇØ µÎ´Â °ø°£ÀÌ ºÎÁ·ÇØ ÇÁ·Î±×·¥ ½ÇÇà Áß ¿À·ù·Î Áߴܵǰųª, Á¦ÇÑ ½Ã°£ ³»¿¡ ¿øÇÏ´Â °á°ú¸¦ ¾ò¾î³¾ ¼ö ¾ø°Ô µÈ´Ù. Àç±Í ÇÔ¼ö ¼³°è´Â ÁÖ¾îÁø ¹®Á¦ »óȲÀ» ÀÚ±â À¯»çÀûÀÎ º¸´Ù ÀÛÀº ¹®Á¦·Î ³ª´©¾î ÇØ°áÇÒ ¼ö ÀÖ´Â °æ¿ì, º¸´Ù ÀÛÀº ¹®Á¦ »óȲ°úÀÇ °ü°è¸¸À» ÀÌ¿ëÇØ ¸Å¿ì °£´ÜÈ÷ ¼³°èÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖÁö¸¸, À§¿Í °°Àº Áߺ¹ È£Ãâ »óȲÀÌ ¸Å¿ì ¸¹ÀÌ ¹ß»ýÇÒ ¼ö Àֱ⠶§¹®¿¡ ºñÈ¿À²ÀûÀ̶ó°í »ý°¢ÇÒ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸, ¸Å¿ì °£´ÜÇÑ ¾ÆÀ̵ð¾î ÇÑ °¡Áö¸¦ Àû¿ëÇϸé Àç±Í ÇÔ¼ö¸¦ ÀÌ¿ëÇØ º¹ÀâÇÑ ¹®Á¦ »óȲÀ» °£´ÜÈ÷ °ü°è½ÄÀ¸·Î Âɰ³¾î Ç¥ÇöÇϰí, Áߺ¹ È£ÃâµÇ´Â Ƚ¼ö¸¦ ÃÖ¼ÒÇÑÀ¸·Î ¸¸µé¾î ¸Å¿ì È¿°úÀûÀÎ ¹®Á¦Çذá ÇÁ·Î±×·¡¹Ö Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ±×·¸°Ô ¸¸µå´Â °¡Àå ÇÙ½ÉÀûÀÎ ¾ÆÀ̵ð¾î´Â? - ¡°°è»êÇÑ ÀûÀÌ ¾ø´Â °ÍÀº ±× °ªÀ» °è»êÇÑ ÈÄ ±× ±â·ÏÇØ µÐ´Ù.¡± - ¡°°è»êÇÑ ÀûÀÌ ÀÖ´Ù¸é, ±â·ÏÇØ µÎ¾ú´ø °ªÀ» ¹Ù·Î »ç¿ëÇÏ°í ´Ù½Ã °è»êÇÒ Çʿ䰡 ¾ø´Ù.¡± ·Î ¼³¸íÇÒ ¼ö ÀÖ´Ù. ÀϹÝÀûÀÎ ´ÙÁß Àç±Í ÇÔ¼ö·Î n¹øÂ° ÇǺ¸³ªÄ¡ ¼ö¸¦ °è»êÇÏ´Â ¹®Á¦¿¡ ´ëÇØ¼­ ÇÏÇâ½Ä Àç±Í ¼³°è ¹æ¹ýÀ» Àû¿ëÇϸé, ´ÙÀ½°ú °°ÀÌ ¼³°è°¡ µÇÁö¸¸, k°ªÀÌ Ä¿Áö¸é Áߺ¹ È£ÃâÀÌ ¾ÆÁÖ ¸¹ÀÌ ¹ß»ýÇÏ°Ô µÈ´Ù. long long f(int k) { if(k <= 2) return 1; return f(k-2)+f(k-1); } ÀÌ »óÅ¿¡¼­ ¾î¶² f(k)¸¦ °è»ê ÇÒ ¶§, °è»ê ¿©ºÎ¸¦ ±â·ÏÇØ µÎ±â À§ÇÑ Ã¼Å© ¹è¿­À» Ãß°¡Çϰí, int chk[100]; //f(k)°¡ È£ÃâµÇ¸é, È£Ãâ Çß´Ù´Â °ÍÀ» 1·Î ±â·ÏÇØ µÎ±â À§ÇÑ ¹è¿­ long long f(int k) { if(k <= 2) return 1; return f(k-2)+f(k-1); } °è»êÇÑ °á°ú °ªÀ» ±â·ÏÇØ µÎ±â À§ÇÑ °á°ú °ª ¹è¿­À» Ãß°¡Çϰí, int chk[100]; //f(k)°¡ È£ÃâµÇ¸é, È£Ãâ Çß´Ù´Â °ÍÀ» 1·Î ±â·ÏÇØ µÎ±â À§ÇÑ ¹è¿­ long long d[100]; //f(k)ÀÇ °ªÀ» ±â·ÏÇØ µÎ±â À§ÇÑ ¹è¿­ long long f(int k) { if(k <= 2) return 1; return f(k-2)+f(k-1); } ±â·ÏÇØ µÐ °á°ú¸¦ ¹Ù·Î »ç¿ëÇÏ´Â ¾ÆÀ̵ð¾î¸¦ Àû¿ëÇϸé, int chk[100]; //f(k)ÀÇ È£Ãâ ¿©ºÎ¸¦ ±â·Ï/È®ÀÎÇϱâ À§ÇÑ ¹è¿­ long long d[100]; //f(k)ÀÇ °ªÀ» ±â·ÏÇØ µÎ±â À§ÇÑ ¹è¿­ long long f(int k) { if(chk[k] == 1) return d[k]; //°è»êÇÑ ÀûÀÌ ÀÖ¾ú´Ù¸é, ±× °á°ú °ªÀ» ¸®ÅÏÇÑ´Ù. chk[k]=1; //°è»êÇÑ ÀûÀÌ ¾ø¾úÀ¸´Ï, °è»êÇß´Ù°í üũÇÑ´Ù. if(k <= 2) return d[k]=1; //d[k]¿¡ °ªÀ» ÀúÀåÇϰí, ÀúÀåµÈ °ªÀ» ¸®ÅÏÇÑ´Ù. return d[k]=f(k-2)+f(k-1); //°è»êÇÑ °á°ú °ªÀ» d[k]¿¡ ÀúÀåÇϰí, ÀúÀåµÈ °ªÀ» ¸®ÅÏÇÑ´Ù. } ¿Í °°ÀÌ ¹Ù²Ü ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀ» ¸Þ¸ðÀÌÁ¦À̼Ç(memoization)À̶ó°í ÇÑ´Ù. À§¿Í °°Àº ¾ÆÀ̵ð¾î¸¦ ÀÌ¿ëÇØ f(n)À» È£ÃâÇÏ¿© n ¹øÂ° ÇǺ¸³ªÄ¡ ¼ö¸¦ ¸Å¿ì ºü¸£°Ô °è»êÇØ Ãâ·ÂÇÏ´Â ¸Þ¸ðÀÌÁ¦ÀÌ¼Ç ¿¹½ÃÄÚµå´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. #include int n; int chk[110]; //f(k)°¡ È£ÃâµÇ¸é, È£Ãâ Çß´Ù´Â °ÍÀ» 1·Î ±â·ÏÇØ µÎ±â À§ÇÑ ¹è¿­ long long d[110]; //f(k)ÀÇ °ªÀ» ±â·ÏÇØ µÎ±â À§ÇÑ ¹è¿­ long long f(int k) { if(chk[k] == 1) return d[k]; chk[k]=1; if(k <= 2) return d[k]=1; return d[k]=f(k-2)+f(k-1); } int main() { scanf("%d", &n); printf("%lld\n", f(n)); } Input int Çü Á¤¼ö(n) 1°³°¡ ÀԷµȴÙ. (1 <= n <= 100) Output n ¹øÂ° ÇǺ¸³ªÄ¡ ¼ö¸¦ Ãâ·ÂÇÑ´Ù. (´Ü, ¼ö°¡ ¸Å¿ì Å©±â ¶§¹®¿¡ 1000000007(10¾ï7)·Î ³ª´« °ªÀ» Ãâ·ÂÇϵµ·Ï ÇÑ´Ù.) IO Example ÀÔ·Â 6 Ãâ·Â 8