프로젝트 오일러 83

상하좌우로 움직여서 좌상단→우하단으로 가는 경로의 합이 최소인 경우는?
문제 자세히 보기: [국어] [영어]

이 문제에는 두 가지 복병이 기다리고 있었다. 하나는 A* Search Algorithm 알고리즘이었다. 여러 가지 방법을 생각해 보았지만 A* 알고리즘을 사용하지 않고는 풀 수 없었다. 구글로 검색해보면 A* 알고리즘에 대한 설명을 찾을 수 있지만 이해하기가 쉽지 않았다. 얼마 전 Couresra에서 Algorithms, Part I을 수강한 후에야 A* 알고리즘을 이해할 수 있었다.

Read More...

프로젝트 오일러 82

맨 왼쪽 열에서 맨 오른쪽 열까지 가는 경로의 합이 최소인 경우는?
문제 자세히 보기: [국어] [영어]

시작 위치와 종료 위치가 고정되어 있지 않다. 맨 왼쪽 열의 아무 곳에서 시작해 맨 오른쪽 열의 아무 곳에나 도착하기만 하면 된다. 위/아래/오른쪽 세 방향으로 이동할 수 있다. 왼쪽으로는 이동할 수 없다.

Read More...

프로젝트 오일러 81

오른쪽과 아래로만 움직이면서 좌상단→우하단으로 가는 경로의 합이 최소인 경우는?
문제 자세히 보기: [국어] [영어]

이 문제는 앞에서 풀었던 문제 18과 매우 비슷하다. 행렬을 시계 방향으로 45° 돌려놓고 생각하면 편하다. 문제 18에서는 삼각형 바닥부터 위로 올라가면서 계산하면 됐다. 여기서는 삼각형뿐 아니라 역삼각형도 고려해야 한다는 차이가 있을 뿐이다.

Read More...

Sandbox의 뜻

프로그래밍 또는 보안 관련 책을 읽다 보면 종종 ‘모래상자’란 용어가 나온다. ‘sandbox’를 ‘모래상자’로 번역한 것이다. ‘모래상자’란 단어를 보면 어떤 그림이 떠오르는가? ‘sandbox’를 직역하면 ‘모래상자’가 맞긴 하지만, 나는 이렇게 번역하는 게 마음에 들지 않는다.

Read More...

출퇴근 시간

출퇴근 시간이 적을 수록 좋다고 생각했다. 회사와 집이 멀리 떨어져 있으면 출퇴근에 많은 에너지를 쓰게 된다. 몸도 힘들고 시간도 아깝다. 1시간이 넘으면 계속 다니기가 힘들게 느껴졌다. 그래서 가급적 회사 근처에 집을 얻곤 했다.

Read More...

영국에서의 1년

개요

가족과 함께 외국에 와서 적응하는 것은 생각했던 것보다 어려웠다. 내 한 몸 챙기기도 버거운데 가족 일까지 신경을 써야 하니 힘에 부칠 수밖에 없다. 한국에서 회사를 옮긴 경우에는 새 회사에 적응하는 데 집중할 수 있었지만, 가족과 함께 외국으로 나온 경우에는 다른 식구들도 새로운 환경에 적응할 수 있도록 도와야 한다. 나만 적응한다고 되는 게 아니다.

Read More...

프로젝트 오일러 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...