1. C++ ¶
~cpp
#include <iostream>
using namespace std;
void input();
int process();
int findMaxCycle(int aNum, int aCount);
void output(int aMaxCycle);
int inputNum[2];
int main()
{
input();
int max = process();
output(max);
return 0;
}
void input()
{
cout << "<< ";
cin >> inputNum[0] >> inputNum[1];
}
int process()
{
int interNum = inputNum[0];
int maxCycle;
int temp;
int count = 1;
while (interNum <= inputNum[1])
{
count = 1;
temp = findMaxCycle(interNum, count);
if (maxCycle < temp)
maxCycle = temp;
interNum++;
}
return maxCycle;
}
int findMaxCycle(int aNum, int aCount)
{
if (aNum == 1)
return aCount;
if (aNum % 2)
aNum = 3 * aNum + 1;
else
aNum = aNum / 2;
aCount++;
findMaxCycle(aNum, aCount);
}
void output(int aMaxCycle)
{
cout << aMaxCycle << endl;
}
2. Python ¶
2005.1.9
~cpp
import unittest
import psyco
class ThreeNPlusOne:
def __init__(self):
self.cycleLength = 0
self.cycleDic = {}
def compute(self, num):
self.cycleLength = 0
while (num != 1):
self.cycleLength += 1
if num % 2:
num = 3 * num + 1
else:
num /= 2
if str(num) in self.cycleDic:
return self.cycleLength + self.cycleDic[str(num)]
self.cycleLength += 1
return self.cycleLength
def computeAll(self, num1, num2):
maxLength = 0
for n in range(num1, num2+1):
length = self.compute(n)
self.cycleDic[str(n)] = length
if length > maxLength:
maxLength = length
return maxLength
class ThreeNPlusOneTest(unittest.TestCase):
def setUp(self):
self.u = ThreeNPlusOne()
def testOneCal(self):
num = 22
expected = 16
self.assertEquals(expected, self.u.compute(num))
def testTwoCal(self):
self.assertEquals(20, self.u.computeAll(1,10))
self.assertEquals(125, self.u.computeAll(100, 200))
self.assertEquals(89, self.u.computeAll(201, 210))
self.assertEquals(174, self.u.computeAll(900, 1000))
self.assertEquals(525, self.u.computeAll(1, 999999))
def main():
n = raw_input()
n1, n2 = n.split()
o = ThreeNPlusOne()
result = o.computeAll(int(n1), int(n2))
print n1, n2, result
if __name__ == '__main__':
psyco.full()
unittest.main(argv=('','-v'))
#main()
3. Python ¶
2005.1.13
~cpp
import unittest
import psyco
cycleDic = dict()
def compute(num):
cycleLength = 1
while (num != 1):
num = (num %2 and 3 * num + 1) or num / 2
if num in cycleDic:
return cycleLength + cycleDic[num]
cycleLength += 1
return cycleLength
def computeAll(num1, num2):
maxLength = 0
for n in range(num1, num2+1):
length = compute(n)
cycleDic[n] = length
if length > maxLength:
maxLength = length
return maxLength
class ThreeNPlusOneTest(unittest.TestCase):
def testOneCal(self):
num = 22
expected = 16
self.assertEquals(expected, compute(num))
def testTwoCal(self):
self.assertEquals(20, computeAll(1,10))
self.assertEquals(125, computeAll(100, 200))
self.assertEquals(89, computeAll(201, 210))
self.assertEquals(174, computeAll(900, 1000))
self.assertEquals(525, computeAll(1, 999999))
def main():
n = raw_input()
n1, n2 = n.split()
result = computeAll(int(n1), int(n2))
print n1, n2, result
if __name__ == '__main__':
psyco.full()
unittest.main(argv=('','-v'))
#main()
4. ì“°ë ˆë“œ ¶
ìž…ë ¥ì�€ 0ê³¼ 1000000 사ì�´ì�˜ ê°’ì�„ 갖는 한 ìŒ�ì�˜ ì •ìˆ˜ì�´ë‹¤. 1ê³¼ 999999를 ìž…ë ¥í•œ 경우 몇 ì´ˆ ì�´ë‚´ì—� 답ì�´ 나올까. Python으로 4ì´ˆ ì�´ë‚´ë¥¼ 목표로 구현했다. 하지만 ë§Œì¡±í• ë§Œí•œ 결과가 나오지 않았다. 안타ê¹�게ë�„ ë�”ì�´ìƒ� 최ì �í™”í• ë¬˜ì•ˆì�´ ë– ì˜¤ë¥´ì§€ 않는다 -- 재ì„
http://bioinfo.sarang.net/wiki/AlgorithmQuiz_2f3Plus1 ì—�서 yong27님ì�˜ 소스코드를 보았다. 소스가 ì •ë§� ê¹”ë�”했다. 실행ì†�ë�„ê°€ 빨ë�¼ì„œ ê·¸ ì›�ì�¸ì�„ ë¶„ì„�해가며 지난번 작성했ë�˜ 코드를 ìˆ˜ì •í–ˆë‹¤. 나ì�˜ 목ì �ì�€ 0.001ì´ˆë�¼ë�„ ë¹ ë¥´ê²Œ 결과를 ì¶œë ¥í•˜ëŠ” 것ì�´ì—ˆë‹¤. 실행시간ì�„ 최소화하기위해 í�´ëž˜ìŠ¤ë§ˆì € 없앴다. 특히 ë‘� 부분ì�„ ìˆ˜ì •í•˜ë‹ˆ 실행시간ì�´ í˜„ì €ížˆ 줄었다. 하나는 í�´ëž˜ìФ 멤버변수를 ì œê±°í•˜ê³ ì§€ì—변수화한 경우ì�¸ë�° 왜 그런지 ëª¨ë¥´ê² ë‹¤. 둘째는 ì‚¬ì „í˜• 타입ì�¸ cycleDic ì—�서 key를 문ìž�ì—´ì—�서 숫ìž�로 바꾼 부분ì�´ì—ˆë‹¤. 지난번 구현시 무엇때문ì—� 수치형ì�„ 문ìž�열로 변환하여 key로 만들었는지 ëª¨ë¥´ê² ë‹¤. -- 재ì„
멋진 코드
~cpp num = (num %2 and 3 * num + 1) or num / 2
~cpp i,j = map(int,raw_input().split())둘다 무슨 ì�˜ë¯¸ì�¸ì§€ ì •í™•ížˆ ëª¨ë¥´ê² ë‹¤. -- 재ì„










