Blog


프로젝트 오일러 41번

  • 2013/09/17
  • Perl

1부터 n까지의 숫자를 하나씩만 써서 만든 n자리 숫자를 팬디지털(pandigital)이라고 부릅니다.
2143은 4자리 팬디지털인데, 이 수는 동시에 소수이기도 합니다.

n자리 팬디지털 소수 중에서 가장 큰 수는 무엇입니까?

1~9까지 합이 45이고, 1~8까지 합이 36이다. 이들의 합은 모두 3의 배수이고, 각 자릿수의 합이 3의 배수이면, 3의 배수이므로 9자리 팬디지털과 8자리 팬디지털은 3의 배수가 된다.
따라서 7자리 팬디지털 까지만 체크하면 된다.
중복없이 팬디지털을 생성하기 위해 Math::Permute::Array 모듈을 사용했다.




프로젝트 오일러 40번

  • 2013/09/17
  • Perl

소수점 뒤에 양의 정수를 차례대로 붙여 나가면 아래와 같은 무리수를 만들 수 있습니다.

0.123456789101112131415161718192021…

이 무리수의 소수점 아래 12번째 자리에는 1이 옵니다 (위에서 붉게 표시된 숫자).

소수점 아래 n번째 숫자를 dn이라고 했을 때, 아래 식의 값은 얼마입니까?

d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000

perl의 주특기인 문자열 처리!




프로젝트 오일러 39번

  • 2013/09/17
  • Perl

세 변의 길이가 모두 자연수 {a, b, c}인 직각삼각형의 둘레를 p 로 둘 때, p = 120 을 만족하는 직각삼각형은 아래와 같이 세 개가 있습니다.

{20, 48, 52}, {24, 45, 51}, {30, 40, 50}

1000 이하의 둘레 p에 대해서, 직각삼각형이 가장 많이 만들어지는 p의 값은 얼마입니까?

30초가 넘게 걸린다.
식을 좀 예쁘게 정리하면 좀 빠르게 구할 수 있겠다.




프로젝트 오일러 38번

  • 2013/09/16
  • Perl

숫자 192에 1, 2, 3을 각각 곱합니다.

192 × 1 = 192
192 × 2 = 384
192 × 3 = 576

곱한 결과를 모두 이어보면 192384576 이고, 이것은 1 ~ 9 팬디지털(pandigital)인 숫자입니다. 이런 과정을 편의상 ‘곱해서 이어붙이기’라고 부르기로 합니다.

같은 식으로 9와 (1, 2, 3, 4, 5)를 곱해서 이어붙이면 918273645 라는 1 ~ 9 팬디지털 숫자를 얻습니다.

어떤 정수와 (1, 2, … , n)을 곱해서 이어붙였을 때 얻을 수 있는 가장 큰 아홉자리의 1 ~ 9 팬디지털 숫자는 무엇입니까? (단 n > 1)




프로젝트 오일러 37번

  • 2013/09/16
  • Perl

소수 3797에는 왼쪽부터 자리수를 하나씩 없애거나 (3797, 797, 97, 7) 오른쪽부터 없애도 (3797, 379, 37, 3) 모두 소수가 되는 성질이 있습니다.
이런 성질을 가진 소수는 단 11개만이 존재합니다. 이것을 모두 찾아서 합을 구하세요.
(참고: 2, 3, 5, 7은 제외합니다)

그냥 하자.
안느리다.




프로젝트 오일러 36번

  • 2013/09/16
  • Perl

대칭수(palindrome)인 585는 2진수로 나타내도 10010010012가 되어 여전히 대칭수입니다.
10진법과 2진법으로 모두 대칭수인 1,000,000 이하 숫자의 합을 구하세요.
(주의: 첫번째 자리가 0이면 대칭수가 아님)

sprintf를 이용해 2진수로 변환한다.




프로젝트 오일러 35번

  • 2013/09/14
  • Perl

소수 중에서 각 자리의 숫자들을 순환시켜도 여전히 소수인 것을 circular prime이라고 합니다. 예를 들어 197은 971, 719가 모두 소수이므로 여기에 해당합니다.

이런 소수는 100 밑으로 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97 처럼 13개가 있습니다.

그러면 1,000,000 밑으로는 모두 몇 개나 있을까요?

뭐 별 수 있겠는가? 그냥 짜야지…
역시 소수를 가져오는데는 모듈을 사용했다.




프로젝트 오일러 34번

  • 2013/09/14
  • Perl

숫자 145에는 신기한 성질이 있습니다. 각 자릿수의 팩토리얼(계승)을 더하면  1! + 4! + 5! = 1 + 24 + 120 = 145 처럼 자기 자신이 됩니다.

이렇게 각 자릿수의 팩토리얼을 더하면 자기 자신이 되는 모든 수의 합을 구하세요.

단, 1! = 1 과 2! = 2 의 경우는 덧셈이 아니므로 제외합니다.

$l 에 한계값 넣고 돌린다.
오래걸린다. 약 28초…




프로젝트 오일러 33번

  • 2013/09/14
  • Perl

분수 49/98에는 재미있는 성질이 있습니다. 수학을 잘 모르는 사람이 분모와 분자에서 9를 각각 지워서 간단히 하려고 49/98 = 4/8 처럼 계산해도 올바른 결과가 됩니다.

이에 비해 30/50 = 3/5 같은 경우는 다소 진부한 예라고 볼 수 있습니다.

위와 같은 성질을 가지면서 ‘진부하지 않은’ 분수는, 값이 1보다 작고 분자와 분모가 2자리 정수인 경우 모두 4개가 있습니다.

이 4개의 분수를 곱해서 약분했을 때 분모는 얼마입니까?

… 그냥 풀자.
사실 손으로 풀어도 된다.




Linux의 time과 Windows의 timethis

프로그래밍을 하다 보면, 자신이 작성한 프로그램을 실행하는데 걸리는 시간을 알고 싶을 때가 있다.

각 언어별로 어찌저찌 함수든 메서드든 추가해서 소요시간을 출력하도록 프로그래밍을 할 수 있겠지만, 배보다 배꼽이 더 커지기도 하고 언어마다 그 방법들을 모두 따로따로 적용한다는 것은 고역이다.

그래서인지, linux에서는 기본적으로 명령의 실행 시간을 출력하는 명령이 내장되어 있다. 바로 time이라고 하는 명령인데, 그냥 “time [원하는 명령]” 만 입력하면 실행시간이 출력된다.

그럼 Windows는 어떨까?

안타깝게도 Windows에서는 기본 명령으로 실행 시간을 출력해주는 명령은 존재하지 않는 듯 하였다. 그러나 Windows 2000 Resource Kit에 포함되어 있는 timethis가 이 역할을 대신할 수 있다.

어째서인지 MS에서 이 프로그램을 다운받을 수 있는 경로를 찾지 못했으나, 어떤 친절한 분께서 거의 완벽히 같은 기능을 하는 프로그램을 만들어 제공하고 있었다(http://blog.topfivesoftware.com/2013/03/timethis-utility-for-windows-get.html).

MS에서 찾을 수 있는 다운로드 링크는 다음과 같다.
(http://support.microsoft.com/kb/927229)

혹은 아래의 링크로 직접 다운받을 수 있다.
(timethis.zip)

압축을 풀어 WindowsSystem32 에 이름을 timethis.exe로 바꾸어 넣어주면 명령 프롬프트에서 바로 실행할 수 있다.