프로젝트 오일러 23
두 초과수의 합으로 나타낼 수 없는 모든 양의 정수의 합은?
초과수인지 판단하려면 진약수의 합을 알아야 한다. 문제 21에서 구현한 진약수의 합을 구하는 함수를 이용하면 다음과 같이 주어진 수가 초과수인지 판단하는 함수를 간단히 구현할 수 있다.
내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.
두 초과수의 합으로 나타낼 수 없는 모든 양의 정수의 합은?
초과수인지 판단하려면 진약수의 합을 알아야 한다. 문제 21에서 구현한 진약수의 합을 구하는 함수를 이용하면 다음과 같이 주어진 수가 초과수인지 판단하는 함수를 간단히 구현할 수 있다.
복잡한 소프트웨어를 만들 때 여러 번의 갈림길에 서게 된다. 나중에는 쉽게 알 수 있는 사실이라도 선택할 당시에는 명확하지 않아 어느 쪽이 옳은지 판단하기가 쉽지 않은 경우가 많다. 에디터에서 문서 모델을 설계할 때도 마찬가지다. 문서 모델은 편집하는 문서를 어떤 구조로 저장하고 조작할지를 결정하는 에디터의 핵심 데이터 구조다. 문서 모델의 구조에 따라 이후 개발할 편집 기능의 구현 방향이 갈릴 것이다. 문서 모델이 잘못되어 있다면 기능 구현은 매우 피곤하고 힘든 과정이 될 수 있다.
영문 이름 점수 합계 구하기
수학적 사고나 특별한 기교가 필요한 문제는 아니다. 그냥 문제에서 설명한 대로 처리하면 답을 얻을 수 있다. names.txt
파일을 열어보면 다음과 같이 이름이 따옴표로 묶여 있고 각 이름 사이에는 쉼표가 있다.
10000 이하 모든 친화수(우애수)의 합은?
어떤 수가 친화수인지 판단하는 함수가 있다면 1부터 10,000까지의 수 중에서 친화수만 filter
해 더하면 된다. 어떤 수가 친화수인지 판단하는 함수를 구현하려면 몇 가지 보조 함수가 필요하다. 자신을 제외한 약수를 진약수(proper divisor)라 하는데, 진약수의 합 을 구하는 방법에 따라 풀이가 갈린다.
프로그래머 중에는 자기가 사용하는 에디터가 최고라 주장하는 사람들이 꽤 있다. 배우기 어려운 에디터일수록 그런 경향이 큰 것 같다. 막강한 기능을 자랑하지만 배우기 힘든 에디터의 대표를 꼽는다면 단연 Emacs와 Vim일 것이다.
흔히 접하는 프로그래밍 언어에는 if
~else if
가 연달아 나온다고 해서 코드 모양이 이상해지지는 않는다. 다음 Java 코드와 같이 그냥 순서대로 쓰면 되고 코드를 읽는 것도 어렵지 않다.
Google Guava Cache는 캐시를 쉽게 사용할 수 있도록 다양한 기능을 제공한다. 간단한 코드로 캐시 크기, 캐시 시간, 데이터 로딩 방법, 데이터 리프레시 방법 등을 제어할 수 있다. 회사에서도 성능 향상을 위해 Guava 캐시가 널리 사용하고 있는데, 최근 캐시 관련 코드를 보다가 이상한 점을 발견했다.
의 자릿수를 모두 더하면?
100!은 150자리가 넘는 매우 큰 수라 기본 데이터 타입으로는 이 문제를 해결할 수 없다. 물론 BigInt
를 사용하면 아주 쉽게 문제를 풀 수 있다. 문제 16, 문제 13에서 썼던 방법을 응용하면 BigInt
를 사용하지 않고 문제를 풀 수 있다.
20세기에서, 매월 1일이 일요일인 경우는 몇 번?
Java에서 제공하는 Calendar
를 사용하면 쉽게 답을 구할 수 있다. 그러나 Calender
는 가변객체(mutable object)인데다 클래스도 잘못 설계되어 있어 코드 모양이 어그러진다. Java 8부터는 거지 같은 Calendar
대신 LocalDate
를 사용할 수 있다. LocalDate
는 값 객체로 Clojure에서 사용해도 코드가 어그러지지 않는다. 조금 더 생각하면 라이브러리의 도움을 받지 않고도 풀 수 있다.
삼각형을 따라 내려가면서 합이 최대가 되는 경로 찾기
문제를 언듯 보면 합이 최대가 되는 경로를 찾아야 할 것 같지만, 명시적으로 경로를 구하지 않더라도 경로의 합이 최대가 되는 값을 찾을 수 있다.