Emacs에서 £ 기호 입력하기
최근 영국과 메일을 주고 받다 보니 영국 화폐 단위인 파운드 기호(£)를 입력하는 일이 잦아졌다. 처음에는 Mac OS X에서 제공하는 특수문자 입력 기능을 사용했지만 너무 불편했다. 영국 키보드로는 파운드 기호를 쉽게 입력할 수 있겠다 생각되어 시스템 설정에서 입력 소스를 British로 바꾸니 Shift+3
으로 파운드 기호를 쉽게 입력할 수 있었다.
내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.
합과 차도 모두 오각수인 두 오각수 차의 최소값은?
어떤 수가 오각수인지 빠르게 판단할 수 있다면 와 를 계속 늘려가며 와 를 구하고 그 합과 차 역시 오각수인 경우를 찾을 수 있다. 로 놓고 근의 공식을 이용해 에 대한 이차방정식을 풀면 다음과 같은 결과를 얻는다.
최근 영국과 메일을 주고 받다 보니 영국 화폐 단위인 파운드 기호(£)를 입력하는 일이 잦아졌다. 처음에는 Mac OS X에서 제공하는 특수문자 입력 기능을 사용했지만 너무 불편했다. 영국 키보드로는 파운드 기호를 쉽게 입력할 수 있겠다 생각되어 시스템 설정에서 입력 소스를 British로 바꾸니 Shift+3
으로 파운드 기호를 쉽게 입력할 수 있었다.
부분열에 관련된 특이한 성질을 가진 모든 팬디지털 숫자의 합
언듯 보면 복잡해 보이지만 조건만 많을 뿐 아주 단순한 문제다. 문제 32, 문제 41에서 clojure.contrib.combinatorics
의 permutations
를 사용해 팬디지털 수를 만드는 방법을 살펴봤다. 이 문제에서도 0-9 팬디지털 수를 구해 문제에서 설명한 조건을 만족하는 수만 걸러낸 다음 그 합을 구하면 된다.
주어진 텍스트 파일에 들어있는 '삼각단어'의 개수는?
쉬운 문제다. 파일에 들어있는 단어 목록에서 단어값이 삼각수인 삼각단어의 수를 세기만 하면 된다.
자리 팬디지털 소수 중에서 가장 큰 수
두 가지 방법이 떠오른다. 하나는 clojure.contrib.lazy-seqs
의 primes
를 이용하는 방법이다. 가장 큰 팬디지털 수는 987654321이므로 이걸 상한으로 소수를 하나씩 조사해가며 팬디지털 수인지 확인해 가장 큰 수를 구하면 된다. 그러나 이 방법은 987654321보다 작은 수 중 가장 큰 소수에 도달할 때까지 확인을 해야 하므로 답을 빠르게 구하기는 어려워 보인다.
어떤 무리수에서 소수점 번째 자리 숫자 알아내기
이 문제를 푸는 데는 특별히 복잡한 알고리즘이 필요하지 않다. 그냥 문제에서 설명한 대로 소수점 아래 수에 대한 시퀀스를 만들고, 1번째, 10번째, ... , 1,000,000번째 요소를 구해 모두 곱하면 그만이다. Clojure로는 특히 이런 문제를 쉽게 풀 수 있는 것 같다.
가장 많은 직각삼각형이 만들어지는 둘레(≤ 1000)의 길이는?
세 변의 길이가 자연수인 직삼각형을 가장 많이 만들 수 있는 둘레 길이를 찾는 문제다. Pythagorean triple > Generating a triple에 유클리드 공식을 사용해 피타고라스 수를 구하는 방법이 나와있다.
어떤 수에 (1, 2, ... )를 곱해서 이어붙여 얻을 수 있는 가장 큰 1 ~ 9 팬디지털 숫자
(1, 2, ...)를 곱해서 이어붙일 어떤 수는 네 자리 이하의 수여야 한다. n이 1보다 커야 하므로, 어떤 수가 다섯 자리라면 (1, 2)를 곱해 이어붙일 경우 아홉 자리를 넘어버리기 때문이다. 따라서 네 자리 수 중 가장 큰 9999부터 숫자를 줄여가며 답을 찾으면 문제를 쉽게 풀 수 있다.
왼쪽이나 오른쪽에서 한 자리씩 없애가도 여전히 소수인 수의 합은?
어떤 수를 왼쪽이나 오른쪽에서 한 자리 없앤 수를 구하는 함수가 있다면 이 문제를 풀 때 도움이 될 것이다. 문제 35에서 순환수를 만들 때 사용했던 방법을 활용하면 이 함수를 쉽게 구현할 수 있다. 순환수를 구할 때는 숫자를 잘라 다시 붙여야 했지만 여기서는 그냥 잘라내기만 하면 되므로 오히려 더 간단하다고 할 수 있다.
10진법과 2진법으로 모두 대칭수인 1,000,000 이하 숫자의 합
어떤 수가 대칭인지 확인하는 방법은 이미 문제 4에서 설명했다. 이진수는 어차피 문자열로 표현해야 하므로 여기서는 다음과 같이 문자열을 인자로 받아 대칭인지 확인하는 함수를 만들어 두는 것이 좋겠다.