프로젝트 오일러 77
소수의 합으로 나타내는 방법이 5000가지가 넘는 최초의 숫자는?
이 문제도 바로 전에 풀었던 문제 76과 마찬가지로 문제 31비슷하다. 여기서는 동전의 종류가 소수라고 생각하면 된다. 따라서 인덱스를 넣으면 소수가 나오는 맵을 만들어 두면 문제 풀이에 활용할 수 있다. 소수는 100개 정도 준비하면 충분할 것 같다.
내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.
소수의 합으로 나타내는 방법이 5000가지가 넘는 최초의 숫자는?
이 문제도 바로 전에 풀었던 문제 76과 마찬가지로 문제 31비슷하다. 여기서는 동전의 종류가 소수라고 생각하면 된다. 따라서 인덱스를 넣으면 소수가 나오는 맵을 만들어 두면 문제 풀이에 활용할 수 있다. 소수는 100개 정도 준비하면 충분할 것 같다.
숫자 100을 두 개 이상의 자연수의 합으로 나타내는 방법은 모두 몇 가지?
이 문제는 영국 화폐 액면가를 조합하는 수를 계산했던 문제 31과 비슷하다. 문제 31에서는 동전의 종류가 여덟가지 였지만, 이 문제에서는 동전의 종류가 1, 2, ..., 99까지 99가지가 있다고 생각할 수 있다.
동료와 리팩터링하다 다음과 같은 코드를 만났다.
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;
}
직각삼각형을 만들어내는 방법이 한 가지 뿐인 경우 세기
합이 이하인 피타고라스 수(Pythagorean Triplet)의 시퀀스를 생성한 다음, 합으로 group-by
해서 값(피타고라스 수 목록)의 길이가 인 키의 개수를 세면 된다. 피타고라스 수를 구하는 방법은 문제 39에서 설명했다.
자릿수의 계승값을 더해갈 때, 반복이 일어나기 전의 단계가 60번인 경우 찾기
각 자릿수의 계승값을 더하는 함수는 다음과 같이 간단히 작성할 수 있다.
(defn- fact-sum [n]
(->> (digits n)
(map factorial)
(apply +)))
한국의 인터넷 뱅킹이 개떡 같은 것은 더 말할 필요도 없다. 영국에서는 별도 보안 프로그램 설치 없이 인터넷 브라우저만으로 쾌적하게 은행 업무를 볼 수 있다. 아마 한국을 제외한 다른 나라도 마찬가지일 것 같다. 영국 은행에서 보안 프로그램 없이 어떻게 안전한 뱅킹 서비스를 제공하는지 살펴보자. 영국의 모든 은행에 계좌를 만들어 인터넷 뱅킹을 해본 것은 아니고, 내 주 거래 은행의 인터넷 뱅킹 경험을 바탕으로 설명하는 것임에 유의하기 바란다.
그 여정이 바로 보상이다.
- 스티브 잡스
초등학교 때 사촌 동생 집에서 Apple II 컴퓨터를 처음 본 순간 컴퓨터 세계로 빠져들었다. 그러나 사촌 동생 집은 멀어서 매일 갈 수가 없었다. 다행히 친한 친구 집에서 SPC1000 이란 컴퓨터가 있었다. 나는 매일 친구 집에 놀러가서 친구와 함께 컴퓨터를 가지고 놀았다. 친구가 귀찮에 생각했을 지도 모르겠다. 나중에 나도 부모님을 졸라 컴퓨터를 장만했다.
분모가 12,000 이하일 때 1/3과 1/2 사이에 위치한 기약 진분수의 개수
분모가 12,000 이하인 경우만 조사하면 되므로 분자와 분모에 12,000 이하의 수를 대입해가며 분수를 만들어 1/3과 1/2 사이의 기약 진부수를 세는 방법으로 답을 구할 수 있을 것 같다. 분모는 3부터 12,000까지, 분자는 분모/3 ~ 분모/2 사이의 정수를 대입해보면 된다.
분모가 1백만 이하인 기약 진분수의 개수
분모가 인 경우 기약 진분수의 개수는 와 서로 소인 정수의 개수와 같다. 이는 Euler’s totient function의 정의와 동일하다. 따라서 분모가 1백만 이하인 기약 진분수의 개수를 라 하면 는 다음과 같이 구할 수 있다.
기약 진분수를 커지는 순으로 늘어놓기
분모가 보다 작거나 같은 0과 1 사이의 기약 진분수의 수열을 Farey sequence라 한다. 이 수열에서 와 가 이웃이고 면, 두 수의 차는 가 되어야 한다.