숫자 안에 포함된 3, 6 또는 9의 개수만큼 박수를 치거나, 만약 3,6,9가 없을 경우 해당 숫자를 리턴하면 됩니다.
예를 들어, 307은 박수 한번, 9936은 박수 네번, 400은 "400"이라고 말하면 됩니다.
이걸 구현할 알고리즘을 연구하다가 다음과 같은 코드를 생각해봤습니다.
여기서 n이 주어진 숫자입니다. 숫자를 문자열로 바꾼 후, tr 명령을 사용해서 '3', '6', 그리고 '9'를 제외한 다른 문자를 지운 후, 남은 문자열의 길이를 구하는 겁니다. 이 길이가 바로 필요한 박수 횟수입니다.
그 다음, "clap "이라는 문자열을 방금 구해낸 박수 횟수만큼 복사합니다. 1이면 "clap ", 2이면 "clap clap ", 3이면 "clap clap clap ", 0이면 "" 이 되겠죠.
그 다음 max 함수를 사용하여 마지막으로 n을 문자열로 바꾼 스트링(num_s)과 비교하여 더 우선순위가 높은 문자열을 리턴하도록 합니다. 만약 박수 횟수가 0이면 왼쪽의 스트링은 ""이 되고, 빈 문자열은 무엇이든 들어있는 문자열보다 무조건 우선순위가 낮습니다. 따라서 우측의 숫자가 리턴됩니다. 만약 박수 횟수가 1 이상이면, 왼쪽의 스트링은 "clap clap ..."이 되는데, 문자열 끼리의 비교 과정에서 왼쪽 스트링의 첫번째 문자는 무조건 'c'가 되고, 오른쪽 스트링의 첫번째 문자는 무조건 숫자입니다. 'c'가 '1'~'9'보다 더 아스키코드 값이 크기 때문에 max 함수를 통하여 왼쪽의 스트링이 리턴됩니다.
루비 언어를 쓰고 있기 때문에 이런 복잡해보이는 알고리즘을 간단한 코드로 구현할 수 있었습니다. 만약 C나 C++을 쓰고 있었더라면 코드가 굉장히 길어지겠죠. ㅎㅎ
이외에도 사용자의 입력에 대한 예외처리, 채팅방에서 369게임을 하는 것처럼 보이기 위한 꾸미기, 컴퓨터와 같이 하기, 어설픈 OOP(-_-;) 등 여러 자질구레한 사항들을 추가하다보니 코드가 좀 길어졌습니다. 간단한 게임도 생각보다 만만치 않네요. -.-;
소스코드는 아래와 같이 생겼습니다. 좀 눈아프게 생기긴 했지만 그래도 저 나름대로 예쁜 코드, 버그 없는 코드를 만들어보려고 노력해봤습니다. -.-;
아래는 소스코드 파일이고, 혹시 루비 인터프리터가 설치되어있지 않은 분들을 위해서 exe버전(rubyscript2exe 사용)도 같이 첨부합니다. ㅎㅎ
qt-mac-opensource-src-4.3.3.tar.gz : Qt 라이브러리가 있어야 합니다. 그런데 최근에 나온 4.3.4나 4.4.0beta1 로는 QtRuby 1.4.9가 빌드되지 않더군요. Qt를 컴파일 할 때 -no-framework 플래그도 넣어보고 여러가지 조합을 시도해봤지만 실패했습니다. QtRuby 포럼에서 보니 버그 비슷한거라더군요. -_-; Qt 4.3.3 버전으로는 플래그를 따로 지정을 하지 않아도 빌드가 잘 됐습니다. 사실 이걸 알아내느라 고생을 한겁니다. Qt가 빌드 한번 하는데 시간이 오래걸리니까 한번 시행착오 할때마다 시간낭비가 심하죠..
cmake-2.4.8-Darwin-universal.dmg : cross-platform make 라고 하는 프로그램인데 윈도우, 맥, 리눅스에서 모두 동작하는 소프트웨어인 것 같습니다. QtRuby 1.4.9를 컴파일 하려면 이게 있어야 한다네요.
이 파일들을 ~/Desktop 에 받았다고 가정하고 계속 진행합니다.
먼저, cmake를 설치합니다. dmg파일을 열고 패키지를 열면 알아서 다 해줍니다.
다음으로 Qt 4.3.3을 설치해야 하는데, C++ 컴파일러가 있어야합니다. 뭐 다들 있으시겠지만, 전 설치 당시에 그게 없어서 -_-; 맥에서 제공해주는 Xcode 유틸리티를 설치했습니다. 터미널을 켜고 다음 명령들을 순서대로 실행합니다.
빌드 되는데 오랜 시간이 걸릴 것이므로 잠시 다른일을 하고 계시다가 Qt 설치가 끝나면 다음 명령을 해줍니다.
그리고 위 두줄을 ~/.profile 파일에 넣어줍니다.
echo $PATH 를 해서 나오는 주소 중에 /usr/local/Trolltech/Qt-4.3.3/bin 이 있는지 체크해봅시다. 없으면 좀 있다가 QtRuby를 설치 할 때 Qt가 있는 폴더를 찾을 수 없어서 설치 할 수가 없습니다.