프로젝트 오일러 80

무리수인 제곱근들의 자릿수 더하기
문제 자세히 보기: [국어] [영어]

이 문제를 푸는 데 Math.sqrt를 사용할 수는 없다. Math.sqrt가 리턴하는 double 형의 유효자리 숫자는 고작 17자리에 불과하다. 제곱근의 자릿수를 원하는 만큼 구할 수 있는 다른 방법이 필요하다. 다행히 Sqrt root by substraction에 정수의 제곱근을 구하는 방법이 자세히 나와 있다.

Read More...

프로젝트 오일러 79

접속 기록으로부터 비밀번호 알아내기
문제 자세히 보기: [국어] [영어]

접속 기록 데이터가 많지 않으므로 코드를 아무렇게나 짜도 답을 빠르게 구할 수 있을 것이다. 먼저 다음과 같이 접속 기록을 읽는 코드를 작성한다.

(def keylog
(-> (slurp "data/keylog.txt")
(clojure.string/split #"\r\n")
distinct
sort))

중복을 제거하면 접속 기록이 서른 세 개밖에 되지 않는다.

Read More...

프로젝트 오일러 78

동전을 여러 더미로 나누는 경우의 수 세기
문제 자세히 보기: [국어] [영어]

동전을 여러 더미로 나누는 방법의 수는 정수를 덧셈으로 표시할 수 있는 방법의 수와 같다. 위키백과를 찾아보면 다음과 같이 공식이 나와 있다.

$$\begin{aligned} p(n) &= \sum_{k \neq 0} (-1)^{k-1}p(n - g_k) \\ g_k &= \frac{k(3k-1)}{2} \end{aligned}$$

$n$을 증가시키면서 $p(n)$을 구해 1백만으로 나누어 떨어지는지 확인하는 방법으로 답을 찾을 수 있다. $p(n)$을 구하는 데 필요한 $g_k$는 다음과 같이 쉽게 구현할 수 있다.

Read More...

Emacs를 이용한 단순 반복 작업

며칠 전 아주 지겨워 보이는 작업을 하게 되었다. 엑셀 파일에 있는 정보를 참고해 설정 파일을 수정하는 일이었다. 설정 파일은 국가별 설정 정보를 담고 있는데 각 국가별 설정에 새로운 필드를 추가해야 하고 필드의 값은 엑셀 파일을 참조해 지정해야 했다.

Read More...

On Call

아마존에 오기 전 아마존이 다닐만한 회사인지 조사하는 데, 온콜에 대한 불만을 토로하는 글이 많이 보였다. 온콜이 뭐길래 그러지? 사전을 찾아보니 다음과 같이 설명되어 있다. 우리 말로 하면 ‘당직’과 비슷한 개념일 것 같다.

Read More...

프로젝트 오일러 77

소수의 합으로 나타내는 방법이 5000가지가 넘는 최초의 숫자는?
문제 자세히 보기: [국어] [영어]

이 문제도 바로 전에 풀었던 문제 76과 마찬가지로 문제 31비슷하다. 여기서는 동전의 종류가 소수라고 생각하면 된다. 따라서 인덱스를 넣으면 소수가 나오는 맵을 만들어 두면 문제 풀이에 활용할 수 있다. 소수는 100개 정도 준비하면 충분할 것 같다.

Read More...

프로젝트 오일러 76

숫자 100을 두 개 이상의 자연수의 합으로 나타내는 방법은 모두 몇 가지?
문제 자세히 보기: [국어] [영어]

이 문제는 영국 화폐 액면가를 조합하는 수를 계산했던 문제 31과 비슷하다. 문제 31에서는 동전의 종류가 여덟가지 였지만, 이 문제에서는 동전의 종류가 1, 2, …, 99까지 99가지가 있다고 생각할 수 있다.

Read More...

설득

동료와 리팩터링하다 다음과 같은 코드를 만났다.

private Map<String, Integer> getCountryCodeCountMap(String customerId) {
List<String> countries = getCountryList(customerId);
Map<String, Integer> countryCodeMap = new HashMap<>();
for (String cc : countries) {
if (StringUtils.isNotBlank(cc)) {
countryCodeMap.put(cc, countryCodeMap.getOrDefault(cc, 0) + 1);
}
}
return countryCodeMap;
}

Read More...

프로젝트 오일러 75

직각삼각형을 만들어내는 방법이 한 가지 뿐인 경우 세기
문제 자세히 보기: [국어] [영어]

합이 $1,500,000$ 이하인 피타고라스 수(Pythagorean Triplet)의 시퀀스를 생성한 다음, 합으로 group-by 해서 값(피타고라스 수 목록)의 길이가 $1$인 키의 개수를 세면 된다. 피타고라스 수를 구하는 방법은 문제 39에서 설명했다.

Read More...

프로젝트 오일러 74

자릿수의 계승값을 더해갈 때, 반복이 일어나기 전의 단계가 60번인 경우 찾기
문제 자세히 보기: [국어] [영어]

각 자릿수의 계승값을 더하는 함수는 다음과 같이 간단히 작성할 수 있다.

(defn- fact-sum [n]
(->> (digits n)
(map factorial)
(apply +)))

Read More...