Last active
August 29, 2015 14:27
-
-
Save sooop/27eeb2cf9943a7a6daae to your computer and use it in GitHub Desktop.
Project Euler on Python(3) #001 (011~020)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| 아래와 같은 20×20 격자가 있습니다. | |
| 08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 | |
| 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 | |
| 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 | |
| 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 | |
| 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 | |
| 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 | |
| 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 | |
| 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 | |
| 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 | |
| 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 | |
| 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 | |
| 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 | |
| 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 | |
| 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 | |
| 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 | |
| 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 | |
| 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 | |
| 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 | |
| 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 | |
| 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 | |
| 위에서 대각선 방향으로 연속된 붉은 숫자 네 개의 곱은 26 × 63 × 78 × 14 = 1788696 입니다. | |
| 그러면 수평, 수직, 또는 대각선 방향으로 연속된 숫자 네 개의 곱 중 최대값은 얼마입니까?""" | |
| #### | |
| """ | |
| (x, y) 좌표의 값은 1차원 배열에서 [y*EDGE+x]의 인덱스를 갖는다. | |
| """ | |
| s = "08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48" | |
| def p11(): | |
| numbers = [int(x) for x in s.split(' ')] | |
| from functools import reduce | |
| def pr(x, y): | |
| return reduce(lambda x,y:x*y, [numbers[y*20+x+i] for i in range(4)]) | |
| def pd(x, y): | |
| return reduce(lambda x,y:x*y, [numbers[(y+i)*20+x] for i in range(4)]) | |
| def pdr(x, y): | |
| return reduce(lambda x,y:x*y, [numbers[(y+i)*20+x+i] for i in range(4)]) | |
| def pdl(x, y): | |
| return reduce(lambda x,y:x*y, [numbers[(y+i)*20+x-i] for i in range(4)]) | |
| p1 = max([pr(x, y) for x in range(20-3) for y in range(20)]) | |
| p2 = max([pd(x, y) for x in range(20) for y in range(20-3)]) | |
| p3 = max([pdr(x, y) for x in range(20-3) for y in range(20-3)]) | |
| p4 = max([pdl(x, y) for x in range(3, 20) for y in range(20-3)]) | |
| print(max(p1, p2, p3, p4)) | |
| %time p11() | |
| # 70600674 | |
| # Wall time: 6 ms |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| 1부터 n까지의 자연수를 차례로 더하여 구해진 값을 삼각수라고 합니다. | |
| 예를 들어 7번째 삼각수는 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28이 됩니다. | |
| 이런 식으로 삼각수를 구해 나가면 다음과 같습니다. | |
| 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ... | |
| 이 삼각수들의 약수를 구해봅시다. | |
| 1: 1 | |
| 3: 1, 3 | |
| 6: 1, 2, 3, 6 | |
| 10: 1, 2, 5, 10 | |
| 15: 1, 3, 5, 15 | |
| 21: 1, 3, 7, 21 | |
| 28: 1, 2, 4, 7, 14, 28 | |
| 위에서 보듯이, 5개 이상의 약수를 갖는 첫번째 삼각수는 28입니다. | |
| 그러면 500개 이상의 약수를 갖는 가장 작은 삼각수는 얼마입니까?""" | |
| #### | |
| """ | |
| """ | |
| def number_of_factors(n): | |
| s = 2 | |
| k = 2 | |
| l = n ** 0.5 | |
| while k <= l: | |
| if n % k is 0: | |
| s += 2 | |
| k += 1 | |
| if l == int(l): | |
| s -= 1 | |
| return s | |
| def p12(): | |
| n = 1 | |
| while True: | |
| x = n * (n + 1) // 2 | |
| if number_of_factors(x) >= 500: | |
| print(x) | |
| return | |
| n += 1 | |
| %time p12() | |
| # 76576500 | |
| # Wall time: 20.2 s | |
| """소인수분해를 통해 약수의 개수를 구하는 경우""" | |
| from functools import reduce | |
| def factorize(n): | |
| result = [] | |
| while n > 1: | |
| p = divide_helper(n) | |
| e = 0 | |
| while n % p is 0: | |
| n = n // p | |
| e += 1 | |
| result.append((p, e)) | |
| return result | |
| def divide_helper(n): | |
| for k in (2, 3): | |
| if n % k is 0: | |
| return k | |
| k = 5 | |
| l = n ** 0.5 | |
| while k <= l: | |
| if n % k is 0: | |
| return k | |
| if n % (k+2) is 0: | |
| return k+2 | |
| k += 6 | |
| return n | |
| def number_of_divisors(n): | |
| s = [x[1] + 1 for x in factorize(n)] | |
| return reduce(lambda x, y: x*y, s, 1) | |
| def p12(): | |
| n = 1 | |
| while True: | |
| x = n * (n + 1) // 2 | |
| if number_of_divisors(x) >= 500: | |
| print(x) | |
| return | |
| n += 1 | |
| %time p12() | |
| # 76576500 | |
| # Wall time: 517 ms |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| 아래에 50자리 숫자가 100개 있습니다. 이것을 모두 더한 값의 첫 10자리는 얼마입니까? | |
| 37107287533902102798797998220837590246510135740250 | |
| 46376937677490009712648124896970078050417018260538 | |
| 74324986199524741059474233309513058123726617309629 | |
| 91942213363574161572522430563301811072406154908250 | |
| 23067588207539346171171980310421047513778063246676 | |
| ... | |
| 53503534226472524250874054075591789781264330331690 | |
| """ | |
| s = """37107287533902102798797998220837590246510135740250 | |
| 46376937677490009712648124896970078050417018260538 | |
| 74324986199524741059474233309513058123726617309629 | |
| 91942213363574161572522430563301811072406154908250 | |
| 23067588207539346171171980310421047513778063246676 | |
| 89261670696623633820136378418383684178734361726757 | |
| 28112879812849979408065481931592621691275889832738 | |
| 44274228917432520321923589422876796487670272189318 | |
| 47451445736001306439091167216856844588711603153276 | |
| 70386486105843025439939619828917593665686757934951 | |
| 62176457141856560629502157223196586755079324193331 | |
| 64906352462741904929101432445813822663347944758178 | |
| 92575867718337217661963751590579239728245598838407 | |
| 58203565325359399008402633568948830189458628227828 | |
| 80181199384826282014278194139940567587151170094390 | |
| 35398664372827112653829987240784473053190104293586 | |
| 86515506006295864861532075273371959191420517255829 | |
| 71693888707715466499115593487603532921714970056938 | |
| 54370070576826684624621495650076471787294438377604 | |
| 53282654108756828443191190634694037855217779295145 | |
| 36123272525000296071075082563815656710885258350721 | |
| 45876576172410976447339110607218265236877223636045 | |
| 17423706905851860660448207621209813287860733969412 | |
| 81142660418086830619328460811191061556940512689692 | |
| 51934325451728388641918047049293215058642563049483 | |
| 62467221648435076201727918039944693004732956340691 | |
| 15732444386908125794514089057706229429197107928209 | |
| 55037687525678773091862540744969844508330393682126 | |
| 18336384825330154686196124348767681297534375946515 | |
| 80386287592878490201521685554828717201219257766954 | |
| 78182833757993103614740356856449095527097864797581 | |
| 16726320100436897842553539920931837441497806860984 | |
| 48403098129077791799088218795327364475675590848030 | |
| 87086987551392711854517078544161852424320693150332 | |
| 59959406895756536782107074926966537676326235447210 | |
| 69793950679652694742597709739166693763042633987085 | |
| 41052684708299085211399427365734116182760315001271 | |
| 65378607361501080857009149939512557028198746004375 | |
| 35829035317434717326932123578154982629742552737307 | |
| 94953759765105305946966067683156574377167401875275 | |
| 88902802571733229619176668713819931811048770190271 | |
| 25267680276078003013678680992525463401061632866526 | |
| 36270218540497705585629946580636237993140746255962 | |
| 24074486908231174977792365466257246923322810917141 | |
| 91430288197103288597806669760892938638285025333403 | |
| 34413065578016127815921815005561868836468420090470 | |
| 23053081172816430487623791969842487255036638784583 | |
| 11487696932154902810424020138335124462181441773470 | |
| 63783299490636259666498587618221225225512486764533 | |
| 67720186971698544312419572409913959008952310058822 | |
| 95548255300263520781532296796249481641953868218774 | |
| 76085327132285723110424803456124867697064507995236 | |
| 37774242535411291684276865538926205024910326572967 | |
| 23701913275725675285653248258265463092207058596522 | |
| 29798860272258331913126375147341994889534765745501 | |
| 18495701454879288984856827726077713721403798879715 | |
| 38298203783031473527721580348144513491373226651381 | |
| 34829543829199918180278916522431027392251122869539 | |
| 40957953066405232632538044100059654939159879593635 | |
| 29746152185502371307642255121183693803580388584903 | |
| 41698116222072977186158236678424689157993532961922 | |
| 62467957194401269043877107275048102390895523597457 | |
| 23189706772547915061505504953922979530901129967519 | |
| 86188088225875314529584099251203829009407770775672 | |
| 11306739708304724483816533873502340845647058077308 | |
| 82959174767140363198008187129011875491310547126581 | |
| 97623331044818386269515456334926366572897563400500 | |
| 42846280183517070527831839425882145521227251250327 | |
| 55121603546981200581762165212827652751691296897789 | |
| 32238195734329339946437501907836945765883352399886 | |
| 75506164965184775180738168837861091527357929701337 | |
| 62177842752192623401942399639168044983993173312731 | |
| 32924185707147349566916674687634660915035914677504 | |
| 99518671430235219628894890102423325116913619626622 | |
| 73267460800591547471830798392868535206946944540724 | |
| 76841822524674417161514036427982273348055556214818 | |
| 97142617910342598647204516893989422179826088076852 | |
| 87783646182799346313767754307809363333018982642090 | |
| 10848802521674670883215120185883543223812876952786 | |
| 71329612474782464538636993009049310363619763878039 | |
| 62184073572399794223406235393808339651327408011116 | |
| 66627891981488087797941876876144230030984490851411 | |
| 60661826293682836764744779239180335110989069790714 | |
| 85786944089552990653640447425576083659976645795096 | |
| 66024396409905389607120198219976047599490197230297 | |
| 64913982680032973156037120041377903785566085089252 | |
| 16730939319872750275468906903707539413042652315011 | |
| 94809377245048795150954100921645863754710598436791 | |
| 78639167021187492431995700641917969777599028300699 | |
| 15368713711936614952811305876380278410754449733078 | |
| 40789923115535562561142322423255033685442488917353 | |
| 44889911501440648020369068063960672322193204149535 | |
| 41503128880339536053299340368006977710650566631954 | |
| 81234880673210146739058568557934581403627822703280 | |
| 82616570773948327592232845941706525094512325230608 | |
| 22918802058777319719839450180888072429661980811197 | |
| 77158542502016545090413245809786882778948721859617 | |
| 72107838435069186155435662884062257473692284509516 | |
| 20849603980134001723930671666823555245252804609722 | |
| 53503534226472524250874054075591789781264330331690""" | |
| def p13(): | |
| numbers = [int(x) for x in s.split('\n') if x] | |
| print(str(sum(numbers))[:10]) | |
| %time p13() | |
| # 5537376230 | |
| # Wall time: 0 ns |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| 양의 정수 n에 대하여, 다음과 같은 계산 과정을 반복하기로 합니다. | |
| n → n / 2 (n이 짝수일 때) | |
| n → 3 n + 1 (n이 홀수일 때) | |
| 13에 대하여 위의 규칙을 적용해보면 아래처럼 10번의 과정을 통해 1이 됩니다. | |
| 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 | |
| 아직 증명은 되지 않았지만, 이런 과정을 거치면 어떤 수로 시작해도 마지막에는 1로 끝나리라 생각됩니다. | |
| (역주: 이것은 콜라츠 추측 Collatz Conjecture이라고 하며, 이런 수들을 우박수 hailstone sequence라 부르기도 합니다) | |
| 그러면, 백만(1,000,000) 이하의 수로 시작했을 때 1까지 도달하는데 가장 긴 과정을 거치는 숫자는 얼마입니까? | |
| 참고: 계산 과정 도중에는 숫자가 백만을 넘어가도 괜찮습니다.""" | |
| ######################### | |
| """ | |
| 계산한 값은 캐싱한다. | |
| n에 대한 값이 구해지면 2n, 4n, 8n... 등 2의 거듭제곱배에 대해서는 그 값에 1씩 더해서 | |
| 미리 구할 수 있으므로 이를 메모이제이션 과정에서 캐시에 추가하여 | |
| 계산 횟수를 비약적으로 줄일 수 있다. | |
| """ | |
| def memoize(f): | |
| c = {} | |
| def i(a): | |
| if a in c: | |
| return c[a] | |
| r = f(a) | |
| q = r | |
| while a <= 1000000: | |
| c[a] = q | |
| a *= 2 | |
| q += 1 | |
| return r | |
| return i | |
| @memoize | |
| def h(n): | |
| if n is 1: | |
| return 1 | |
| if n % 2 == 0: | |
| return h(n//2) + 1 | |
| return h(3*n+1) + 1 | |
| def p14(): | |
| limit = 1000000 | |
| ways = ((x, h(x)) for x in range(1, limit+1)) | |
| print(max(ways, key=lambda x:x[1])) | |
| %time p14() | |
| # (837799, 525) | |
| # Wall time: 3.34 s |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| 아래와 같은 2 × 2 격자의 왼쪽 위 모서리에서 출발하여 오른쪽 아래 모서리까지 도달하는 길은 모두 6가지가 있습니다 (거슬러 가지는 않기로 합니다). | |
| 그러면 20 × 20 격자에는 모두 몇 개의 경로가 있습니까?""" | |
| #### | |
| """ | |
| 가로로 가는 길을 a, 세로로 가는 길을 b 라 하면 | |
| 2 x 2 격자의 경로는 | |
| aabb | |
| abba | |
| abab | |
| ... | |
| 등과 같이 표시할 수 있다. 이는 2개의 a와 2개의 b를 나열한 경우의 수인데, | |
| 총 4! 에서 a끼리, b끼리는 순서가 없으므로 4! / 2! / 2! 이 된다. | |
| 20x20 격자에서는 동일하게 40!/(20!*20!) 이다. 파이썬은 큰 수를 지원하므로 | |
| 바로 계산하면 되고, 그렇지 않은 경우에는 각 숫자들을 약분하면서 계산한다. | |
| """ | |
| from functools import reduce | |
| def factorial(n): | |
| if n < 2: | |
| return 1 | |
| return reduce(lambda x, y:x*y, range(1, n+1), 1) | |
| def p15(): | |
| print(factorial(40)//factorial(20)//factorial(20)) | |
| %time p15() | |
| # 137846528820 | |
| # Wall time: 0 ns |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| 215 = 32768 의 각 자리수를 더하면 3 + 2 + 7 + 6 + 8 = 26 입니다. | |
| 21000의 각 자리수를 모두 더하면 얼마입니까?""" | |
| def p16(): | |
| print(sum([int(x) for x in str(2**1000)])) | |
| %time p16() | |
| # 1366 | |
| # Wall time: 0 ns |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| 1부터 5까지의 숫자를 영어로 쓰면 one, two, three, four, five 이고, | |
| 각 단어의 길이를 더하면 3 + 3 + 5 + 4 + 4 = 19 이므로 사용된 글자는 모두 19개입니다. | |
| 1부터 1,000까지 영어로 썼을 때는 모두 몇 개의 글자를 사용해야 할까요? | |
| 참고: 빈 칸이나 하이픈('-')은 셈에서 제외하며, 단어 사이의 and 는 셈에 넣습니다. | |
| 예를 들어 342를 영어로 쓰면 three hundred and forty-two 가 되어서 23 글자, | |
| 115 = one hundred and fifteen 의 경우에는 20 글자가 됩니다.""" | |
| """ | |
| 간단... | |
| """ | |
| words1000 = 'thousand' | |
| words100 = 'hundred' | |
| words20 = ('', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', | |
| 'seventy', 'eighty', 'ninety') | |
| words1 = ('', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', | |
| 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', | |
| 'sixteen', 'seventeen', 'eighteen', 'nineteen') | |
| def words(n): | |
| s = "" | |
| if n == 1000: | |
| s += words1[n // 1000] + words1000 | |
| n = n % 1000 | |
| if n > 99: | |
| s += words1[n // 100] + words100 | |
| n = n % 100 | |
| if n > 0: | |
| s += "and" | |
| if n >= 20: | |
| s += words20[n // 10] | |
| n = n % 10 | |
| s += words1[n] | |
| return s | |
| def p17(): | |
| print(sum((len(words(n)) for n in range(1, 1001)))) | |
| %time p17() | |
| # 21124 | |
| # Wall time: 3 ms |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| 다음과 같이 삼각형 모양으로 숫자를 배열했습니다. | |
| 3 | |
| 7 4 | |
| 2 4 6 | |
| 8 5 9 3 | |
| 삼각형의 꼭대기부터 아래쪽으로 인접한 숫자를 찾아 내려가면서 합을 구하면, 위의 그림처럼 3 + 7 + 4 + 9 = 23 이 가장 큰 합을 갖는 경로가 됩니다. | |
| 다음 삼각형에서 합이 최대가 되는 경로를 찾아서 그 합을 구하세요. | |
| 75 | |
| 95 64 | |
| 17 47 82 | |
| 18 35 87 10 | |
| 20 04 82 47 65 | |
| 19 01 23 75 03 34 | |
| 88 02 77 73 07 63 67 | |
| 99 65 04 28 06 16 70 92 | |
| 41 41 26 56 83 40 80 70 33 | |
| 41 48 72 33 47 32 37 16 94 29 | |
| 53 71 44 65 25 43 91 52 97 51 14 | |
| 70 11 33 28 77 73 17 78 39 68 17 57 | |
| 91 71 52 38 17 14 91 43 58 50 27 29 48 | |
| 63 66 04 68 89 53 67 30 73 16 69 87 40 31 | |
| 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 | |
| 참고: 여기서는 경로가 16384개밖에 안되기 때문에, 모든 경로의 합을 일일이 계산해서 답을 구하는 것이 가능합니다. | |
| 하지만 67번 문제에는 100층짜리 삼각형 배열이 나옵니다. 그런 경우에는 좀 더 현명한 풀이 방법을 찾아야겠지요.""" | |
| #### | |
| """ | |
| 맨 아래에서부터 두 줄씩 | |
| 좌,우 원소끼리 더한 것 중 큰 것을 뽑아서 누적한다. | |
| """ | |
| m = """75 | |
| 95 64 | |
| 17 47 82 | |
| 18 35 87 10 | |
| 20 04 82 47 65 | |
| 19 01 23 75 03 34 | |
| 88 02 77 73 07 63 67 | |
| 99 65 04 28 06 16 70 92 | |
| 41 41 26 56 83 40 80 70 33 | |
| 41 48 72 33 47 32 37 16 94 29 | |
| 53 71 44 65 25 43 91 52 97 51 14 | |
| 70 11 33 28 77 73 17 78 39 68 17 57 | |
| 91 71 52 38 17 14 91 43 58 50 27 29 48 | |
| 63 66 04 68 89 53 67 30 73 16 69 87 40 31 | |
| 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 """ | |
| def p18(): | |
| def make_line(line): | |
| return [int(x) for x in line.split(' ') if x] | |
| lines = m.split('\n') | |
| n = [make_line(line) for line in lines] | |
| l = len(n) | |
| f = n[-1] | |
| for i in range(l-2, -1, -1): | |
| z1 = map(lambda x:x[0] + x[1], zip(f, n[i])) | |
| z2 = map(lambda x:x[0] + x[1], zip(f[1:], n[i])) | |
| f = list(map(max, zip(z1, z2))) | |
| print(f[0]) | |
| %time p18() | |
| # 1074 | |
| # Wall time: 1 ms |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| 다음은 달력에 관한 몇 가지 일반적인 정보입니다 (필요한 경우 좀 더 연구를 해 보셔도 좋습니다). | |
| 1900년 1월 1일은 월요일이다. | |
| 4월, 6월, 9월, 11월은 30일까지 있고, 1월, 3월, 5월, 7월, 8월, 10월, 12월은 31일까지 있다. | |
| 2월은 28일이지만, 윤년에는 29일까지 있다. | |
| 윤년은 연도를 4로 나누어 떨어지는 해를 말한다. 하지만 400으로 나누어 떨어지지 않는 매 100년째는 윤년이 아니며, 400으로 나누어 떨어지면 윤년이다 | |
| 20세기 (1901년 1월 1일 ~ 2000년 12월 31일) 에서, 매월 1일이 일요일인 경우는 총 몇 번입니까?""" | |
| #### | |
| """ | |
| datetime 모듈을 이용한 간단한 풀이 | |
| weekday는 월요일이 0이다. | |
| """ | |
| import datetime | |
| def p19(): | |
| c = 0 | |
| n = datetime.datetime(1901, 1, 1) | |
| while n.year <= 2000: | |
| if n.day == 1 and n.weekday() == 6: | |
| c += 1 | |
| n = n + datetime.timedelta(days=1) | |
| print(c) | |
| %time p19() | |
| # 171 | |
| # Wall time: 99 ms | |
| """ 이 문제는 윤년을 확인할 수만 있으면 쉽게 풀어낼 수 있다. 날짜 제공 모듈 없이 일일이 계산하는 로직""" | |
| def is_leap(y): | |
| if y % 4 is 0: | |
| if y % 400 is 0: | |
| return True | |
| if y % 100 is 0: | |
| return False | |
| return True | |
| return False | |
| def p19(): | |
| days1 = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) | |
| days2 = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) | |
| year = 1900 | |
| month = 1 | |
| day = 1 | |
| weekday = 0 # Sunday is 6 | |
| c = 0 | |
| while year < 2001: | |
| days = days2 if is_leap(year) else days1 | |
| day += 1 | |
| weekday = (weekday + 1) % 7 | |
| if day > days[month-1]: | |
| day = 1 | |
| month += 1 | |
| if month > 12: | |
| month = 1 | |
| year += 1 | |
| if year > 1900 and day is 1 and weekday == 6: | |
| c += 1 | |
| print(c) | |
| %time p19() | |
| # 171 | |
| # Wall time: 25 ms |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| n! 이라는 표기법은 n × (n − 1) × ... × 3 × 2 × 1을 뜻합니다. | |
| 예를 들자면 10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800 이 되는데, | |
| 여기서 10!의 각 자리수를 더해 보면 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 입니다. | |
| 100! 의 자리수를 모두 더하면 얼마입니까?""" | |
| from functools import reduce | |
| def factorial(n): | |
| if n < 2: | |
| return 1 | |
| return reduce(lambda x, y:x*y, range(1, n+1), 1) | |
| def p20(): | |
| print(sum((int(x) for x in str(factorial(100))))) | |
| %time p20() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment