Posts

Mac OS X에서 Eclipse 종료 단축키 변경

Eclipse에서 개발할 때 Quick Fix 기능을 자주 사용한다. 입력하던 코드에 빨간색 물결 모양의 밑줄이 표시되면 바로 Cmd+1(윈도우에서는 Ctrl+1)을 누른다. 대부분의 경우 Quick Fix가 제안하는 대로만 해도 문제가 해결된다. 그런데 맥북에어에서 작업할 때는 Cmd+1을 누르려다 Cmd+Q를 누르는 실수를 자주 한다. Cmd+Q는 Mac OS X의 거의 모든 애플리케이션에서 종료 단축키로 사용된다. Q1이 가까이 있는 데다 맥북에어는 키보드가 일반 키보드에 비해 조밀하기 때문에 1을 누르려다 실수로 Q를 눌러 의도치 않게 Eclipse가 종료되어 여간 짜증나는 게 아니었다.

Read more...

프로젝트 오일러 3

600851475143의 가장 큰 소인수는?

문제 자세히 보기: [국어] [영어]

백만 정도에 대해서는 루프를 돌려도 비교적 빠르게 답을 얻을 수 있지만, 천만이 넘는 경우에는 무식하게 루프를 돌리는 방법이 통하지 않는다.

Read more...

SQL에서 행을 열로 바꾸는 방법

쿼리를 작성하다 보면 행을 열로 또는 열을 행으로 바꾸고 싶은 경우가 생긴다. 데이터 모델을 만들 때 같은 종류의 데이터는 행으로 저장하는 것이 좋지만, 고객은 열로 표현된 형태의 보고서를 보고 싶을 수 있다. 쿼리 결과를 행에서 열로 또는 열에서 행으로 바꾸는 작업은 원리를 이해하면 어렵지 않지만 약간의 기교가 필요하다. 그래서인지 쿼리 결과의 행/열 전환은 SQL 관련 단골 질문이기도 하다.

Read more...

프로젝트 오일러 2

피보나치 수열에서 4백만 이하이면서 짝수인 항의 합은?

문제 자세히 보기: [국어] [영어]

피보나치 수열의 정의는 다음과 같다.

%math \begin{aligned} F_n &= F_{n-1} + F_{n-2}, \newline F_2 &= F_1 = 1 \end{aligned}

구현하기 쉬워 보인다.

Read more...

담배 컷터

담배값이 크게 인상되어 흡연자의 부담이 늘었지만, 주변에 담배를 끊겠다는 사람은 많아 보이지 않는다. 점심을 먹으러 가는 중 회사 동료가 담배를 피우다 장초를 버리는 모습을 보고 아깝다는 생각이 들었다. 저렇게 태우지 않은 부분이 많이 남았을 때는 피운 부분까지만 잘라내 보관했다가 나중에 다시 피우면 좋지 않을까 해서 떠올린 것이 담배 컷터다. 시가(cigar)의 경우는 시가 컷터가 있어 태운 부분만 잘라내는 것을 어디선가 본 것 같다.

Read more...

프로젝트 오일러 1

1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면?

문제 자세히 보기: [국어] [영어]

프로젝트 오일러 문제 중 가장 쉬운 문제일 것이다. 처음에는 문제가 이렇게 쉽지만 뒤로 갈수록 조금씩 어려워져 나중에는 문제가 무슨 뜻인지 이해하기도 힘들어진다. 이 문제는 너무 단순해 아무렇게나 풀어도 답을 구할 수 있다.

Read more...

MacOS X에서 JDK 버전 전환

보통 JDK 최신 버전을 설치해 사용한다. 운영환경에 여전히 JDK7을 쓰고 있지만 개발환경에서는 JDK8을 쓰되 -target 1.7 옵션을 주어 컴파일하면 문제가 없지 않을까 생각했다. 그런데 서버를 올릴때 계속 에러가 발생해 인터넷에서 찾아보니 Spring 3.2.8 버그란다. 이 문제는 Spring 3.2.9에서 해결되었다고 하지만 운영환경은 여전히 Spring 3.2.8을 사용하고 있고, 내가 Spring 버전을 올릴 권한도 없다. 어쩔 수 없이 노트북에 JDK7을 설치할 수밖에 없다.

Read more...

정규 표현식을 이용한 찾기/바꾸기 시 카운터 사용

반복된 패턴을 찾아 다른 문자열로 치환하고 싶을 때 정규 표현식을 사용하면 편리하다. 지금까지는 정규 표현식을 사용해 문자를 치환할 때 고정된 패턴만 지정할 수 있다고 생각했다. 그래서 스택오어플로우에서 정규 표현식으로 문자열을 치환할 때 카운터(counter)를 사용할 수 있냐는 질문을 봤을 때 '되지도 않는 질문'이라 속단했다.

Read more...

MySQL Row Generator

Oracle에서는 connect by를 사용해 필요한 만큼 행(row)을 생성할 수 있다.

select level from dual connect by level <= 100;

PostgreSQL에서도 generate_series를 사용해 쉽게 행을 만들 수 있다.

select * from generate_series(1, 100);

재귀적 CTE(Common Table Expressions)를 사용하면 특정 DBMS에서만 제공하는 기능을 사용하지 않고 표준 SQL만 사용해 행 생성기(row generator)를 만들 수 있다. PostgreSQL에서는 다음과 같은 식으로 원하는 만큼 행을 생성할 수 있다.

Read more...

함수형 언어로 구현한 퀵정렬

언어의 한계가 사고의 한계다.
- 비트겐슈타인

아주 오래 전에, 그러니까 C/C++, Java 외 다른 언어는 공부할 필요가 없다고 생각했던 때에, 잡지에서 다음과 같은 코드를 본 적이 있다.

qsort [] = []
qsort (p:xs) = qsort [y | y <- xs, y < p] ++ [p] ++ qsort [y | y <- xs, y >= p]

Read more...