<?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=3N%2B1Problem%2F%ED%99%A9%EC%9E%AC%EC%84%A0</id>
	<title>3N+1Problem/황재선 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=3N%2B1Problem%2F%ED%99%A9%EC%9E%AC%EC%84%A0"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=3N%2B1Problem/%ED%99%A9%EC%9E%AC%EC%84%A0&amp;action=history"/>
	<updated>2026-05-14T11:16:15Z</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=3N%2B1Problem/%ED%99%A9%EC%9E%AC%EC%84%A0&amp;diff=26790&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:22, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=3N%2B1Problem/%ED%99%A9%EC%9E%AC%EC%84%A0&amp;diff=26790&amp;oldid=prev"/>
		<updated>2021-02-07T05:22:16Z</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;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
== C++ ==&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt; &lt;br /&gt;
 using namespace std; &lt;br /&gt;
  &lt;br /&gt;
 void input(); &lt;br /&gt;
 int process(); &lt;br /&gt;
 int findMaxCycle(int aNum, int aCount); &lt;br /&gt;
 void output(int aMaxCycle); &lt;br /&gt;
  &lt;br /&gt;
 int inputNum[2]; &lt;br /&gt;
  &lt;br /&gt;
 int main() &lt;br /&gt;
 { &lt;br /&gt;
         input(); &lt;br /&gt;
         int max = process(); &lt;br /&gt;
         output(max); &lt;br /&gt;
         return 0; &lt;br /&gt;
 } &lt;br /&gt;
  &lt;br /&gt;
 void input() &lt;br /&gt;
 {        &lt;br /&gt;
         cout &amp;amp;lt;&amp;amp;lt; &amp;quot;&amp;amp;lt;&amp;amp;lt; &amp;quot;; &lt;br /&gt;
         cin &amp;amp;gt;&amp;amp;gt; inputNum[0] &amp;amp;gt;&amp;amp;gt; inputNum[1]; &lt;br /&gt;
 } &lt;br /&gt;
  &lt;br /&gt;
 int process() &lt;br /&gt;
 { &lt;br /&gt;
         int interNum = inputNum[0];      &lt;br /&gt;
         int maxCycle; &lt;br /&gt;
         int temp; &lt;br /&gt;
         int count = 1; &lt;br /&gt;
  &lt;br /&gt;
         while (interNum &amp;amp;lt;= inputNum[1]) &lt;br /&gt;
         { &lt;br /&gt;
                 count = 1;               &lt;br /&gt;
                 temp = findMaxCycle(interNum, count); &lt;br /&gt;
                 if (maxCycle &amp;amp;lt; temp) &lt;br /&gt;
                         maxCycle = temp; &lt;br /&gt;
                 interNum++; &lt;br /&gt;
         } &lt;br /&gt;
         return maxCycle; &lt;br /&gt;
 } &lt;br /&gt;
  &lt;br /&gt;
 int findMaxCycle(int aNum, int aCount) &lt;br /&gt;
 { &lt;br /&gt;
         if (aNum == 1) &lt;br /&gt;
                 return aCount; &lt;br /&gt;
         if (aNum % 2)    &lt;br /&gt;
                 aNum = 3 * aNum + 1;     &lt;br /&gt;
         else     &lt;br /&gt;
                 aNum = aNum / 2;         &lt;br /&gt;
         aCount++; &lt;br /&gt;
         findMaxCycle(aNum, aCount); &lt;br /&gt;
 } &lt;br /&gt;
  &lt;br /&gt;
 void output(int aMaxCycle) &lt;br /&gt;
 { &lt;br /&gt;
         cout &amp;amp;lt;&amp;amp;lt; aMaxCycle &amp;amp;lt;&amp;amp;lt; endl; &lt;br /&gt;
 } &lt;br /&gt;
&lt;br /&gt;
== Python ==&lt;br /&gt;
2005.1.9&lt;br /&gt;
 import unittest&lt;br /&gt;
 import psyco&lt;br /&gt;
 &lt;br /&gt;
 class ThreeNPlusOne: &lt;br /&gt;
     def __init__(self): &lt;br /&gt;
         self.cycleLength = 0&lt;br /&gt;
         self.cycleDic = {}&lt;br /&gt;
          &lt;br /&gt;
     def compute(self, num):&lt;br /&gt;
         self.cycleLength = 0&lt;br /&gt;
         while (num != 1):&lt;br /&gt;
             self.cycleLength += 1&lt;br /&gt;
 &lt;br /&gt;
             if num % 2:&lt;br /&gt;
                 num = 3 * num + 1&lt;br /&gt;
             else:&lt;br /&gt;
                 num /= 2&lt;br /&gt;
             if str(num) in self.cycleDic:&lt;br /&gt;
                 return self.cycleLength + self.cycleDic[str(num)]&lt;br /&gt;
 &lt;br /&gt;
         self.cycleLength += 1&lt;br /&gt;
         &lt;br /&gt;
         return self.cycleLength&lt;br /&gt;
         &lt;br /&gt;
     def computeAll(self, num1, num2): &lt;br /&gt;
  &lt;br /&gt;
         maxLength = 0 &lt;br /&gt;
          &lt;br /&gt;
         for n in range(num1, num2+1):&lt;br /&gt;
             length = self.compute(n)&lt;br /&gt;
             self.cycleDic[str(n)] = length&lt;br /&gt;
             &lt;br /&gt;
             if length &amp;amp;gt; maxLength: &lt;br /&gt;
                 maxLength = length&lt;br /&gt;
 &lt;br /&gt;
         return maxLength&lt;br /&gt;
  &lt;br /&gt;
 class ThreeNPlusOneTest(unittest.TestCase): &lt;br /&gt;
     def setUp(self): &lt;br /&gt;
         self.u = ThreeNPlusOne() &lt;br /&gt;
  &lt;br /&gt;
     def testOneCal(self): &lt;br /&gt;
         num = 22 &lt;br /&gt;
         expected = 16 &lt;br /&gt;
         self.assertEquals(expected, self.u.compute(num)) &lt;br /&gt;
          &lt;br /&gt;
     def testTwoCal(self):&lt;br /&gt;
         self.assertEquals(20, self.u.computeAll(1,10))&lt;br /&gt;
         self.assertEquals(125, self.u.computeAll(100, 200))&lt;br /&gt;
         self.assertEquals(89, self.u.computeAll(201, 210))&lt;br /&gt;
         self.assertEquals(174, self.u.computeAll(900, 1000))&lt;br /&gt;
         self.assertEquals(525, self.u.computeAll(1, 999999)) &lt;br /&gt;
 &lt;br /&gt;
 def main():&lt;br /&gt;
     n = raw_input()&lt;br /&gt;
     n1, n2 = n.split()&lt;br /&gt;
     o = ThreeNPlusOne()&lt;br /&gt;
     result = o.computeAll(int(n1), int(n2))&lt;br /&gt;
     print n1, n2, result&lt;br /&gt;
     &lt;br /&gt;
          &lt;br /&gt;
 if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
     psyco.full()&lt;br /&gt;
     unittest.main(argv=(&amp;#039;&amp;#039;,&amp;#039;-v&amp;#039;))&lt;br /&gt;
     #main()&lt;br /&gt;
== Python ==&lt;br /&gt;
2005.1.13&lt;br /&gt;
 import unittest &lt;br /&gt;
 import psyco &lt;br /&gt;
 &lt;br /&gt;
 cycleDic = dict()&lt;br /&gt;
 def compute(num):    &lt;br /&gt;
     cycleLength = 1&lt;br /&gt;
     while (num != 1):&lt;br /&gt;
         num = (num %2 and 3 * num + 1) or num / 2&lt;br /&gt;
         if num in cycleDic:&lt;br /&gt;
             return cycleLength + cycleDic[num]&lt;br /&gt;
         cycleLength += 1&lt;br /&gt;
     return cycleLength&lt;br /&gt;
      &lt;br /&gt;
 def computeAll(num1, num2):&lt;br /&gt;
     maxLength = 0&lt;br /&gt;
     for n in range(num1, num2+1):&lt;br /&gt;
         length = compute(n)&lt;br /&gt;
         cycleDic[n] = length&lt;br /&gt;
         if length &amp;amp;gt; maxLength:  &lt;br /&gt;
             maxLength = length&lt;br /&gt;
     return maxLength &lt;br /&gt;
   &lt;br /&gt;
 class ThreeNPlusOneTest(unittest.TestCase):&lt;br /&gt;
     def testOneCal(self):&lt;br /&gt;
         num = 22  &lt;br /&gt;
         expected = 16  &lt;br /&gt;
         self.assertEquals(expected, compute(num))  &lt;br /&gt;
           &lt;br /&gt;
     def testTwoCal(self): &lt;br /&gt;
         self.assertEquals(20, computeAll(1,10)) &lt;br /&gt;
         self.assertEquals(125, computeAll(100, 200)) &lt;br /&gt;
         self.assertEquals(89, computeAll(201, 210)) &lt;br /&gt;
         self.assertEquals(174, computeAll(900, 1000)) &lt;br /&gt;
         self.assertEquals(525, computeAll(1, 999999))  &lt;br /&gt;
  &lt;br /&gt;
 def main(): &lt;br /&gt;
     n = raw_input() &lt;br /&gt;
     n1, n2 = n.split()&lt;br /&gt;
     result = computeAll(int(n1), int(n2))&lt;br /&gt;
     print n1, n2, result      &lt;br /&gt;
           &lt;br /&gt;
 if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
     psyco.full() &lt;br /&gt;
     unittest.main(argv=(&amp;#039;&amp;#039;,&amp;#039;-v&amp;#039;))&lt;br /&gt;
     #main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 쓰레드 ==&lt;br /&gt;
입력은 0과 1000000 사이의 값을 갖는 한 쌍의 정수이다. 1과 999999를 입력한 경우 몇 초 이내에 답이 나올까. Python으로 4초 이내를 목표로 구현했다. 하지만 만족할 만한 결과가 나오지 않았다. 안타깝게도 더이상 최적화할 묘안이 떠오르지 않는다 -- 재선&lt;br /&gt;
----&lt;br /&gt;
http://bioinfo.sarang.net/wiki/AlgorithmQuiz_2f3Plus1 에서 yong27님의 소스코드를 보았다. 소스가 정말 깔끔했다. 실행속도가 빨라서 그 원인을 분석해가며 지난번 작성했던 코드를 수정했다. 나의 목적은 0.001초라도 빠르게 결과를 출력하는 것이었다. 실행시간을 최소화하기위해 클래스마저 없앴다. 특히 두 부분을 수정하니 실행시간이 현저히 줄었다. 하나는 클래스 멤버변수를 제거하고 지역변수화한 경우인데 왜 그런지 모르겠다. 둘째는 사전형 타입인 cycleDic 에서 key를 문자열에서 숫자로 바꾼 부분이었다. 지난번 구현시 무엇때문에 수치형을 문자열로 변환하여 key로 만들었는지 모르겠다. -- 재선&lt;br /&gt;
&lt;br /&gt;
멋진 코드&lt;br /&gt;
 num = (num %2 and 3 * num + 1) or num / 2&lt;br /&gt;
 i,j = map(int,raw_input().split())&lt;br /&gt;
둘다 무슨 의미인지 정확히 모르겠다. -- 재선&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[3N+1Problem]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>