다섯 자리 숫자인 16807은 75으로 5제곱수입니다. 또, 아홉 자리 숫자인 134217728은 89으로 9제곱수입니다.

n자리 숫자이면서 n제곱수도 되는 양의 정수는 모두 몇 개나 있습니까?



길이만 비교하면 되는거였는데..

문제를 잘못이해해서 .. 실제 값이 맞는지까지 비교하고 있었네...

숫자의 자리수는 log를 사용하면 구할 수 있다함.. 이 코드에서는 그냥 len 사용.



Python


Posted by 용식


세제곱수인 41063625 (=3453) 로 순열을 만들어보면, 그 중에서 56623104 (=3843)와 66430125 (=4053)가 또 세제곱수입니다.
실제 41063625은, 자릿수로 만든 순열 중에서 3개가 세제곱수인 가장 작은 수입니다.

그러면 자릿수로 만든 순열 중에서 5개가 세제곱수인 가장 작은 숫자는 무엇입니까?



처음에 순열이라는 단어에 혹해서
n**3인 dict를 생성하고, 각 n**3의 순열 리스트를 구해서 5개가 되는지

하나하나 찾아가는 로직으로 구현했는데 속도가 너무 떨어졌다. 생각해보니 순열이라는것이

결국은 sort하면 같은 수가 되는 애들이라..


57623의 다른 순열 23675가 있을 때 이 두 수를 정렬시키면

23567로 같은 수를 가지게 되는 것... 이것을 사용해서 n**3의 값을 정렬하여 같은 값을 갖는

애들끼리(순열) 모았음....



Python
순열=itertools라는 이 공식이 머리속에 박혀버린듯..-.-


Posted by 용식

삼각수, 사각수, 오각수 같은 다각수들은 아래의 공식으로 만들 수 있습니다.

삼각수P3,n = n(n+1)/21, 3, 6, 10, 15, ...
사각수P4,n = n21, 4, 9, 16, 25, ...
오각수P5,n = n(3n−1)/21, 5, 12, 22, 35, ...
육각수P6,n = n(2n−1)1, 6, 15, 28, 45, ...
칠각수P7,n = n(5n−3)/21, 7, 18, 34, 55, ...
팔각수P8,n = n(3n−2)1, 8, 21, 40, 65, ...

그런데 4자리 숫자 8128, 2882, 8281 (순서대로) 에는 세 가지의 재미있는 성질이 있습니다.

  1. 각 숫자들은 서로 꼬리를 물고 순환됩니다. 각 숫자의 뒤쪽 두 자리는 다음 숫자의 앞쪽 두 자리가 되는 식입니다.
  2. 각 숫자는 서로 다른 다각수인데, 여기서는 삼각수 (P3,127=8128), 사각수 (P4,91=8281), 오각수 (P5,44=2882)가 대응됩니다.
  3. 이런 성질을 갖는 4자리의 숫자 세 개는 이 숫자들이 유일합니다.

위와 같이 순환되면서 서로 다른 다각수(삼각수 ~ 팔각수)이기도 한 4자리 숫자 여섯 개의 유일한 순서쌍을 찾고, 그 합을 구하세요.



튜플을 사용해서 N각수의 N을 키로, 해당되는 번호를 리스트로 하는 map을 생성하고

이 map을 통해서 각 N각수에서의 순환수가 되는지를 판단한다.



Python
내가 푼 방식은 코드가 너무 난잡해서.. 다른 사람의 풀이된 코드를 참고 및 공부할겸 올려둠.파이썬이 참.. 유용하구나..하는생각이 절로드는 코드..ㅋ


Posted by 용식


네 개의 소수 3, 7, 109, 673은 상당히 특이한 성질이 있습니다. 넷 중에 아무것이나 두 개를 골라서 어떤 쪽으로 이어붙이던지 그 결과도 소수가 됩니다. 예를 들어 7과 109를 고르면 7109와 1097 또한 소수입니다.
3, 7, 109, 673는 이런 성질을 가진 네 소수 중에서 그 합이 792로 가장 작습니다,

다섯 소수 중에 어떤 두 개를 골라 이어붙여도 소수가 되는 수들을 찾아서, 그 합의 최소값을 구하세요.



드디어 60번문제..

처음에는 5개 소수 리스트를 하나씩 뽑아내서 순열 조합을 생성하고 (5C2)

이 조합들이 모두 소수인지 확인하는 형태로 구현했는데 2시간이 넘어도 답이 안나와 -_-;


그래서 앞쪽부터 보초를 많이 세우는 방식으로....




Python

보통 오일러프로젝트 풀면서 전체를 먼저 구해놓고 거기서 뽑아내는게 빨랐기 때문에

그 방법을 먼저 썼는데.. 그것도 case by case였네요.. 특히 brute force 방식에서는

보초를 많이 세워서 걸러주는게 가장 좋은 방법인듯 합니다..

그놈의 LOL과 디아 때문에 너무 텀이 길었네요 --;;;


Posted by 용식


숫자 1부터 시작해서 우측으로부터 시계방향으로 감아 5×5 행렬을 만들면 아래와 같이 됩니다.

21 22 23 24 25
20  7  8  9 10
19  6  1  2 11
18  5  4  3 12
17 16 15 14 13

여기서 대각선상의 숫자를 모두 더한 값은 101 입니다.

같은 방식으로 1001×1001 행렬을 만들었을 때, 대각선상의 숫자를 더하면 얼마가 됩니까?



예전에 28번문제 풀었던 풀이를 재사용...

막간을 이용한 한문제 풀이 ㅋㅋ



Python


Posted by 용식


제곱근 2는 다음과 같은 연분수의 형태로 나타낼 수 있습니다.

 2 = 1 + 1/(2 + 1/(2 + 1/(2 + ... ))) = 1.414213...

위 식을 처음부터 한 단계씩 확장해 보면 아래와 같습니다.

1 + 1/2 = 3/2 = 1.5
1 + 1/(2 + 1/2) = 7/5 = 1.4
1 + 1/(2 + 1/(2 + 1/2)) = 17/12 = 1.41666...
1 + 1/(2 + 1/(2 + 1/(2 + 1/2))) = 41/29 = 1.41379...

그 다음은 99/70, 239/169, 577/408 로 확장이 되다가, 여덟번째인 1393/985 에 이르면 처음으로 분자의 자릿수가 분모의 자릿수를 넘어섭니다.

처음부터 1천번째 단계까지 확장하는 중에, 분자의 자릿수가 분모보다 많아지는 경우는 몇 번이나 됩니까?


예제에 있는 숫자를보고

공식을 만들어봄...

근데 맞네..헐





Posted by 용식


구골(googol)은 10100을 일컫는 말로, 1 뒤에 0이 백 개나 붙는 어마어마한 수입니다.
100100은 1 뒤에 0이 2백 개가 붙으니 상상을 초월할만큼 크다 하겠습니다.
하지만 이 숫자들이 얼마나 크건간에, 각 자릿수를 모두 합하면 둘 다 겨우 1밖에 되지 않습니다.

a, b < 100 인 자연수 ab 에 대해서, 자릿수의 합이 최대인 경우 그 값은 얼마입니까?



심플한문제..

심플하게 loop.


요즘 그냥 파이썬으로만 풀고있음..;;;



Python


Posted by 용식


47이란 숫자를 골라서 뒤집은 다음 다시 원래 수에 더하면, 47 + 74 = 121 과 같이 대칭수(palindrome)가 됩니다.
물론 모든 숫자가 이토록 쉽게 대칭수를 만들어내지는 않습니다. 예를 들어 349의 경우,

349 + 943 = 1292
1292 + 2921 = 4213
4213 + 3124 = 7337

위에서 보는 것처럼 3번의 반복과정을 거쳐야 대칭수가 됩니다.

196과 같은 몇몇 숫자들은 이와 같은 과정을 아무리 반복해도 대칭수가 되지 않을 것이라고 추측되는데, 이런 수를 라이크렐 수 (Lychrel number) 라고 부릅니다. 아직 증명되지는 않았지만, 문제 풀이를 위해서 일단 라이크렐 수가 존재한다고 가정을 하겠습니다.

또한 1만 이하의 숫자들은, 50번 미만의 반복으로 대칭수가 되든지 라이크렐 수이든지 둘 중 하나라고 합니다.
1만을 넘어서면 10677에 이르렀을 때 비로소 53번의 반복으로 4668731596684224866951378664 라는 28자리의 대칭수가 만들어집니다.

그러면 1만 이하에는 몇 개의 라이크렐 수가 존재합니까?


다소 평이한 문제...


계산하면서 대칭수를 구하고 10000에서 뺐음




Posted by 용식


포커라는 카드게임은 다섯 장으로 된 패의 높고 낮음에 따라 승부를 냅니다. (포커 규칙을 이미 아는 분이라면 규칙 설명 부분은 건너뛰셔도 좋습니다)

카드 한 장은 아래와 같은 순서대로 값이 높아집니다.

2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A

다섯 장으로 이루어진 패의 계급(세칭 "족보")은, 낮은 것부터 높은 순서로 아래와 같습니다.

  • High Card : 가장 높은 카드의 값으로 비교.
  • One Pair : 한 쌍이 같은 카드.
  • Two Pairs : 서로 다른 두 쌍이 같은 카드.
  • Three of a Kind : 세 장이 같은 카드.
  • Straight : 모든 카드가 연속된 숫자.
  • Flush : 모든 카드의 무늬가 같음.
  • Full House : 세 장이 같고, 또 한 쌍이 같음 (Three of a Kind + One Pair).
  • Four of a Kind : 네 장이 같은 카드.
  • Straight Flush : 모든 카드가 연속된 숫자이면서 무늬도 같음.
  • Royal Flush : 10, J, Q, K, A가 무늬도 같음.

두 사람의 패가 같은 종류의 계급이라면, 계급을 구성하는 카드 중 높은 쪽을 쥔 사람이 이깁니다. 예를 들면 8 원페어는 5 원페어를 이깁니다. 
계급을 이루는 카드 숫자까지 같으면 (예: 둘 다 Q 원페어), 다른 카드를 높은 순서대로 비교해서 승부를 정합니다.

텍스트파일 poker.txt 에는 두 선수가 벌인 1,000회의 승부가 저장되어 있습니다. (우클릭해서 다운로드 받으세요)
한 줄에는 10장의 카드가 공백으로 분리되어 들어있는데, 앞의 다섯 장은 1번 선수 것이고 뒤의 다섯 장은 2번 선수의 패입니다. 잘못되거나 중복된 데이터는 없으며, 무승부도 없습니다.

카드 숫자는 2, 3, ... , 9, T, J, Q, K, A 로 (숫자 10은 T로 표시),
무늬는 C (Club - ♣), D (Diamond - ♦), H (Heart - ♥), S (Spade - ♠) 로 표시되어 있습니다.
예를 들면 3C 3D 3S 9S 9D 의 경우 3 풀하우스가 됩니다.

이 데이터를 분석하고, 1번 선수가 이긴 횟수를 구하세요.



새벽내내 이거 가지고 씨름.. 풀긴했는데 어찌 풀었나..--;

이건 루비랑 펄로 안 풀꺼임.



Python


Posted by 용식


1,2,3,4,5 다섯 숫자 중에서 세 개를 고르는 것에는 다음과 같은 10가지 경우가 있습니다.

123, 124, 125, 134, 135, 145, 234, 235, 245, 345

조합론이라는 분야에서는 이것을 5C3 = 10 이라고 표시하며, 일반적인 식은 아래와 같습니다.

nCr =
n!
r!(n−r)!
,   단 r ≤ n 이고, n! = n×(n−1)×...×3×2×1 이며 0! = 1.

이 값은 n = 23 에 이르러서야 23C10 = 1144066 으로 처음 1백만을 넘게 됩니다.

1 ≤ n ≤ 100 일때 nCr의 값이 1백만을 넘는 경우는 모두 몇 번입니까? (단, 중복된 값은 각각 계산합니다)



문제는 길지만 어렵지않은 문제..
그냥 구하면됨..



Ruby
Perl
Posted by 용식