오랜만의 블로그 포스트가 알고리즘 대회 후기가 될 것이라고 예상하지 못했는데, 마지막 글이 올라온지도 꽤 됐고 이번 대회에서 하고 싶은 얘기도 있어서 포스팅을 하기로 했다. 현재 나는 작년 ICPC 이후로 공식적으로는 경쟁 프로그래밍을 은퇴한 상태다. 평소에 공부하고 시간 쓰는건 완전히 멈췄고, 대신 거기 쓰던 시간을 워게임 등 해킹 문제를 풀거나 졸업 후 진로 준비에 쓰고 있다. 이렇게 말하니까 알고리즘 공부에 계속 시간을 많이 쓰고 노력했던 것 같지만 은퇴 선언 이전에도 실질적으로 손을 놓은지는 꽤 됐다. 지금은 티셔츠나 상금 등 부상 주는 대회를 가끔 부담 없이 나가는 걸 목표로 하고 있다.

원래 이번 코드잼은 Rust로 알고리즘 라이브러리를 짜고 그걸 써서 대회를 치고, 대회와 대회 사이에 라이브러리를 보강한 뒤 대회 이후 프로젝트를 다듬어서 공개한다는 원대한 계획과 함께하고 있었다. 하지만 코드잼 플랫폼이 바뀌고 Rust가 지원 언어 목록에 없어서 라이브러리 작성에 대한 관심이 급격하게 식었고, 다익스트라 알고리즘 정도만 겨우 구현된 Rust 알고리즘 라이브러리는 지금까지 존재했던 나만 알고 있다가 비트의 저편으로 사라졌던 많은 개인 프로젝트와 마찬가지로 GitHub 개인 저장소에 조금 더 머무르다 영영 사라질 예정이다. Cargo 배포용으로 이름도 지어줬는데 불쌍한 친구…

올해 코드잼 연습 세션을 치고 나서 느꼈던 건 생각하는 능력 자체는 예상보다 덜 줄었고, 전통적인 테크닉을 떠올리거나 코드를 빠르게 짜는 능력은 예상보다 많이 줄었다는 거였다. 여기서 “생각하는 능력”은 연습 세션 3번 Steed 2 Cruise Control에서 여러 속도로 달리는 말들 사이의 불변조건을 구하는 능력을 말하고 “전통적인 테크닉”은 R1A 3번 Edgy Baking을 보고 냅색이니까 DP로 풀면 뚝딱 할 수 있겠다는 걸 떠올리는 능력을 말한다. 연습 세션부터 이번 R1A까지 예전에 비해 같은 코드를 짜는데 시간이 훨씬 오래 걸린다는게 느껴졌다.

이번 대회를 치면서 좀 놀랐던 점은 대회 중 오랜만에 초심을 되찾은 기분을 느꼈던 것이다. 내 풀이에서 놓친 점을 찾았을 때 예전 같았으면 쉬운 문제에서 실수했다고 자책했겠지만 이번 대회에서는 웬일로 풀이의 빠진 구멍을 채워 나가는 느낌이 즐겁게 느껴졌다. 알고리즘 대회에서 어려운 문제에 도전하는 지적 만족감을 느낀 적은 많았지만, 문제를 푸는 것이 아니라 시간 제한을 두고 대회를 치는 것을 즐겁다고 생각해 본지는 꽤 오래됐다. 평소에 연습을 많이 안 하니 예전만큼 잘하지 못하는 건 당연하다고 생각하면서도 무의식 속에서는 그래도 내가 경력이 얼마인데 못해도 어느 정도는 해야 한다는 부담을 느끼고 있었다고 생각한다. 나도 내가 무의식에서 어떤 생각을 하는지 완전히 모르지만, 공식적으로 은퇴했다고 선언했던게 그런 부담을 낮춰준 게 아닌가 추측하고 있다. 바뀐 플랫폼에서 스코어보드가 문제 페이지에 보이지 않는 것도 도움이 됐다.

원래 대회 후기는 문제 풀이도 함께 올리는게 전통이므로 간단한 풀이도 함께 첨부한다.

  • A: 전체 초콜릿 개수를 세고, \text{(number of H piece)}\times \text{(number of V piece)}로 나누어 떨어지는지 확인한다. 가로 분할선과 세로 분할선의 위치는 초콜릿 개수를 통해 독립적으로 판단 가능하며, 분할선들의 위치가 정해지면 분할된 각 칸에 초콜릿이 균등하게 들어가 있는지 확인한다.
  • B: 계산이 특정 시간 안에 끝날 수 있는지를 판단하는 판별 함수를 작성하고 파라메트릭 바이너리 서치를 수행한다. 판별 함수는 각 계산원이 그 시간까지 처리 가능한 비트의 수를 계산한 뒤 정렬해 큰 순서대로 R개를 뽑아 B 이상이면 처리 가능한 것이다.
  • C: 0-1 냅색. 2 \cdot w_i h_i를 미리 P에서 빼고, 물건의 크기가 min(w, h) 점수는 \sqrt{w^2 + h^2}인 냅색을 수행한다.

창의IT설계는 우리 학과의 간판 과목으로 한 학기 동안 자유 주제로 자신이 “창의IT스럽다”고 생각하는 프로젝트를 진행하는 과목이다. 총 네 단계로 이루어져 있으며 1, 2는 팀으로, 3, 4는 개인으로 진행하며 1, 2에서는 학기별로 주제를 변경하고 3, 4는 한 주제를 1년동안 진행하는 경우가 많다. 나는 자신이 원하는 프로젝트를 마음대로 진행할 수 있다는 자율성과, 학점을 통한 압박으로 마냥 놀지 못하게 하는 강제성이 절묘하게 시너지를 내는 훌륭한 과목이라고 생각한다. 창의IT융합공학과 진학을 선택하면서 고려했던 것도, 어차피 어느 학교에 가든 관심 있는 기술들을 바탕으로 개인 프로젝트를 진행할텐데 창의IT설계 과목 덕분에 주마다 프로젝트 진행 시간도 보장해주고 학점까지 챙겨갈 수 있으니 훨씬 집중하기 쉬운 환경이라고 생각했었다. 장학금 덕분에 신경 쓸 부분이 적어진다는 점도 마음에 들었었다.

사실 앞 문단은 은근슬쩍 끼워 넣은 학과 홍보였고, 본론으로 들어가면 학기 시작이 다가오면서 창의IT설계 3, 4 주제 선정 때문에 고민하고 있다. 교수님들께서는 방학 때 프로젝트를 시작하는 것을 추천하시지만 대부분의 학생들이 학기가 시작하고 프로젝트를 시작한다. 동아리에서 해킹을 하면서 기존 디버거들에 느꼈던 불만을 바탕으로 창의IT설계 3, 4에서는 바이너리 분석 및 디버깅 플랫폼을 주제로 하려고 생각하고 있었다. 시각적으로 좋은 프로젝트와 일상생활과 연관이 있는 프로젝트가 점수를 잘 받는 경향이 있기 때문에 학점 측면에서는 도박성이 있는 주제 선정이지만, 내가 즐겁게 할 수 있으면서 배우는 게 많고, 커리어에도 도움이 될 거라 생각해 이 주제를 일순위로 고려중이었다.

내가 해결하고 싶었던 문제들은 다음과 같다.

  • 디버깅 도구들의 높은 러닝 커브 낮추기
  • 바이너리 분석과 페이로드 제작 환경 통합
  • 중간 언어를 이용한 멀티 아키텍처 디컴파일링
  • codemap, qira, angr 등에 대한 쓰기 쉬운 프론트엔드 제공, 혹은 유사 기능 구현해 통합

주요 고려 대상이었던 건 gdbIDA 두 가지였다. gdb는 CUI에서 기반하는 명령어 암기 및 높은 러닝 커브가 문제라 생각했고, IDA는 높은 가격과 강력한 기능에 비해 아쉬운 UX(Undo 미지원 등)를 개선하고 싶었다. 또한 IDA처럼 실행 환경(주로 Unix)과 분석환경(주로 Windows)이 달라서 생기는 사소한 문제들도 해결할 수 있으면 좋겠다고 생각했다.

하지만 당연히 비슷한 생각을 하는 사람들이 있어서, Binary Ninja나, radare2 같은 2티어 바이너리 분석 툴들에서 이미 비슷한 문제에 대해 고민하고 있었다. 특히 radare2 같은 경우는 해외 커뮤니티에서 super stiff learning curve라는 이야기를 들을 정도로 어디서부터 시작하면 좋을지 모르게 생겼었는데, 최근에 웹 UI를 도입하면서 사용성이 크게 개선된 것처럼 보였다.

Radare2 Web UI

내가 생각하고 있던 구조도 서버에서 바이너리를 실행하고 웹 기반 GUI로 상호작용 하는 것이었는데, radare2의 웹 UI와 특징이 많이 겹쳤다. Binary Ninja는 웹UI는 아니지만 이것도 쓰기 좋은 크로스 플랫폼 UI를 제공하기 때문에 UI 사용성에서는 크게 우위를 보이기 힘들 것이라는 생각이 들었다.

중간 언어를 이용한 디컴파일링 기능은 Hex-Rays 만큼은 당연히 구현하지 못하겠지만, 함수 시그니처 인식, 조건문과 반복문 정도만 구현해도 무료 도구 치고는 경쟁력을 가질 수 있다고 생각했다. 하지만 radare2에서 이미 구현중이었고, Binary Ninja의 로드맵에도 주 목표 중 하나로 제시되어 있었다. 조사하다보니 lldb, gdb, vdb, windbg에 대한 추상화 레이어를 제공하는 Voltron 같은 프로젝트도 있었고, 알아볼수록 기존에 잘 만든 도구들이 많아서 이 주제를 그대로 고르는 것이 맞는지 계속 고민된다. 만약 그대로 이 주제를 선택한다면 완성도는 Binary Ninja Python Prototype 정도를 목표로 하려고 한다. 또한, 기존 도구들에 비해 어떤 차별성을 가질 수 있을지를 더 심도있게 고민해야 할 것으로 보인다.

만약의 경우를 대비해 생각해 두고 있는 다른 주제들도 몇 개 있다. 첫 번째는 1학년 때 MS 이매진컵 주제였던 복셀 기반 월드 에디터 + 비주얼 프로그래밍 언어를 이용한 교육용 프로그래밍 플랫폼 프로젝트다. SangJa라는 이름으로 나갔었는데, JS가 처음이기도 했고 협업에 익숙하지 않아 코드 관리가 조금 아쉬웠지만 주제 자체는 훌륭했다고 생각한다. 지금 생각하고 있는 주제 중 “창의IT”에 제일 적합하다고 생각되기는 한다. 팀 프로젝트라 내가 마음대로 주제를 쓸 수 있는게 아니라서 만약 이 주제를 고르게 된다면 이전에 같이 진행했던 사람들에게 연락해 내가 주제를 다시 써도 되는지 물어보아야 할 것 같다.

두 번째 주제는 안드로이드 매크로다. G매크로류의 매크로 프로그램들은 PC만 지원하는 경우가 많은데, 안드로이드까지 지원을 확장하고 비전 기반 기능들을 추가하려고 생각하고 있다(체력바를 읽는다든지 카드 희귀도를 알아내서 리세마라를 해 준다든지). 이 주제를 하게 되면 본의 아니게 또 OpenCV와 한 학기를 보내게 될 것이다. 이것도 적다보니 오토핫키 안드로이드 열화 카피가 되는 건 아닌지 걱정된다. sl4a 같은 프로젝트도 있고…

원래는 미리 고민해서 개발을 시작하려고 했는데, 연구참여도 하고 동아리도 하다 보니 짧은 방학이 훌쩍 지나가버렸다. 이번 학기에는 기초필수 과목이 끝난 덕분에 학기중 연참을 하면서 창의IT설계와 연구참여 투탑 체제로 프로그래밍 비중이 높은 학기를 보내려고 계획하고 있다.

방학 중간에 쓰기 시작한 글인데 귀찮다고 미루다 보니 쓸 책도 많아지고 내용도 많이 잊어버렸다.

서민의 기생충 콘서트

착한 기생충, 특이한 기생충, 나쁜 기생충으로 기생충을 분류해 재밌게 설명하는 책이다. 서민 씨는 책에서도 그렇고 인터뷰에서도 그렇고 “기생충은 우리의 친구다!”를 일관성 있게 주장하시는 분인데, ‘배탈을 일으키긴 하지만 세상에 치사율이 50%가 넘는 기생충도 있는데 이 정도면 착한 기생충이다’라는 이야기가 처음엔 공감 가지 않았지만, 책을 읽다 보니 점점 세뇌되는 기분이었다. 나쁜 기생충 챕터에는 코로 들어가 뇌를 파괴하는 등 진짜 무서운 기생충들이 많이 나오는데, 읽을 땐 무서웠지만 지금 생각해보면 내가 에볼라 바이러스를 두려워하지 않는 것과 마찬가지로 별로 신경 쓰지 않아도 되는 생물들인 것 같다. 기생충에 대한 생물학적 소개뿐 아니라 에피소드를 다양하게 실었던 점이 마음에 들었다.

다크 존

꾸준히 이어지는 기시 유스케 덕질의 일환. 이제 읽을 책이 [자물쇠가 잠긴 방] 한 권 남았는데, 도서관에서 책이 분실되는 바람에 못 읽고 있다가 얼마 전 예약 도서 찾아가라고 연락이 와서 빌려서 읽고 있다. 기시 유스케 다 읽은 다음에는 베르나르 베르베르 책을 읽어볼까 생각 중이다.

작가 본인이 일본장기 팬이라서 장기 소재를 소재로 종종 가져다 쓰는데, [다크 존]도 그런 작품 중 하나다. 다크 존이라는 정체불명의 공간에서 참가자들이 각자 하나의 말을 맡아 서바이벌 게임을 하는 장면과 현실에서 벌어지는 일들을 절묘하게 교차 편집해서 이야기를 진행한다. [해리포터와 마법사의 돌] 후반부에 나오는 마법사 체스를 장편소설화 시킨 느낌이라 생각하면 될 것 같다. 일본장기에서 아이디어를 가져온 부분은 있지만, 관련 지식이 없어도 재미있게 읽을 수 있도록 주석이 자세하게 달려 있다. [크림슨의 미궁]도 같은 서바이벌 호러 장르였는데, 아무래도 [다크 존]이 좀 더 이후 작품이다 보니 스토리 구성과 묘사가 더 깔끔하다는 느낌을 받았다.

퀴어이론 입문

요즘 페미니즘에 관심을 가지면서 전통적 성 역할의 변화에 대해 공부해 보려는 마음가짐으로 반납함에 있던 걸 집어 와서 읽었는데 기대만큼 취향에 맞지는 않았다. 인터넷에 돌아다니는 자칭 전문가들이 사실 별로 아는 게 없다는 걸 새삼스레 느꼈고 사회가 바뀌는 데는 역시 많은 시간이 필요하다는 생각을 했다. 상식으로 알아둘 만한 내용들도 있기는 하지만 학술적인 접근이 대부분이었고, 시간이 지나니 읽은 양에 비해 기억에 남은 내용이 별로 없다 크흑… 다루고 있던 토픽 중에 기억나는 것들을 몇 개 적어보면 성소수자를 나타내는 표현의 변천사, 성소수자들이 어떻게 사회에서 목소리를 내게 되었는지, 퀴어 커뮤니티의 변화, 레즈비언 페미니즘 등이 있다.

문제해결로 살펴본 수학사

PL 시간에 Type Theory나 수학과 프로그래밍의 연관성 등에 관해 이야기를 들었던 게 재밌어서 골랐다. 그러지 말았어야 했는데. 이것도 기대한 내용과 별로 겹치는 게 없었던 책이다. 챕터 구성은 주제 제시, 주제와 관련된 수학자의 일생, 개념 설명 및 예제 풀이, 연습 문제로 구성되어 있다. 고등학교 때 읽었던 [수학의 반전]이랑 느낌이 비슷한데, 주제에 대한 깊이가 살짝 얕고 거기에 수학자의 일생을 넣으면 비슷한 느낌이 날 것 같다. 당연히 연습 문제는 풀지 않았다.

별로 재미는 없었지만 읽기 시작한 게 아까워서 끝까지 읽었다. 비추천할 정도는 아니지만 굳이 시간 내서 읽을 필요는 없다는 느낌의 책. 앞부분은 자연수, 유리수 등의 기초적인 개념에서 시작해서 뒷부분은 해밍 코드, 리만 가설 등이 나온다. 토픽만 보면 어려운 것들도 많은데 어디 가서 아는 척할 수 있는 정도까지만 다루고 있다는 점이 장점이다.

소녀불충분

애니메이션 서브컬처 쪽에서 유명한 작가 중 한 명인 니시오 이신의 책이다. 좋아하냐 싫어하냐라고 물으면 아슬아슬하게 좋아하는 편으로 분류하는 작가지만 책을 사서 볼 정도로 좋아하지는 않는데, 기시 유스케 책 사면서 배송비 무료를 적용받으려고 한 권 끼워 샀다. 장점일지 단점일지는 모르겠지만 한 마디로 평가를 내리자면 지금까지 읽었던 니시오 이신 작품 중 가장 니시오 이신 느낌이 나는 책이었다. 말장난이 없었던 게 조금 아쉬웠을지도?

스포일러 포함

제노사이드

도서관에 오고 가고 하면서 꾸준히 대출함에 나타나는 책이길래 재밌으니까 많이 대출되겠지 싶어서 읽어 보았다. 기시 유스케의 탄탄한 과학적 고증에 대비하면 아쉬운 부분이 많았지만, 전체적인 스토리 자체는 나쁘지는 않았다. 제일 당황스러웠던 부분은 “일방향 암호로 암호화된 위성 카메라 데이터 정보(?)를 인간의 영역을 뛰어 넘는 계산 능력을 바탕으로 복호화(?)”하는 장면이었다. 화학이나 생물 쪽도 이상하다 싶은 부분이 많이 나오는데 관련 전공 분들이 보면 더 많이 찾으실 듯. 고증은 좀 문제가 있지만 과학을 하는 사람들의 심리 묘사는 공감 가는 장면이 많았다.

스토리 자체는 살짝 유치하고, 전형적인 캐릭터 설정이나 전개 방식이 많이 보였다. 작가가 친한인 것 같은데 한국인 조력자가 중요한 역할로 등장하고 한국인의 ‘정’에 관한 설명도 나와서, 일본 소설에서 저런 내용을 보게 될 줄 몰랐는데 조금 당황했다. 내용에 담긴 주제 의식은 괜찮은 편이었다고 생각하지만 베스트셀러감은 아닌 것 같다고 생각한다.

학벌사회

부제가 “사회적 주체성에 대한 철학적 탐구”다. 진짜 철학자가 철학적으로 접근해서 학벌 의식이 어떤 문제가 있는지를 분석한 책이다. 10년 전에 나온 책임에도 불구하고 지금이랑 문제점이 똑같다는 점이 참 안타깝다. 인상 깊었던 부분을 몇 개 요약해보면 다음과 같다. 인상에 남지 않은 부분에도 좋은 내용이 많아서 한 번쯤 읽기를 추천하고 싶은 책이다.

  1. 학벌은 한 번 고정되면 바꿀 수 없다는 점에서 현대판 신분 제도라고도 할 수 있다.
  2. 아무리 학벌 의식이 심한 사람이라도 외국에서는 학벌 의식이 생기지 않는다는 점에서 학벌은 한국 사회에서의 특수한 현상으로 생각해 분석할 필요가 있다.
  3. 대학은 고등 교육 기관인데, 모든 사람이 대학에 가는 분위기 때문에 대학의 정체성이 점점 더 모호해지고 있다.

작가는 대학이 평준화되어 있는 독일에서 유학을 갔다 왔는데, 그때의 개인적인 경험을 조금 성급하게 일반화한다는 느낌 빼고는 정말 공감 가는 부분이 많았던 책이다.

차회예고

요즘은 [자물쇠가 잠긴 방] 짬짬이 읽고 있다. 방범 탐정 시리즈 최신작으로 이것만 읽으면 드디어 기시 유스케 컴플리트를 찍는다. 그 외에는 전공 책을 읽고 있는데, 옥스토비 7판 생각보다 열심히 읽고 있고 고오급 프로그래밍 과제로 [Clean Code]를 읽고 있다. 클린 코드는 과제로 읽는 책치고는 상당히 재밌다. 일단 베르나르 베르베르 소설을 읽어볼까 생각 중이긴 한데 책 읽는 포스테키안 대상 도서를 먼저 읽게 될 것 같다.

방학하고 게임하느라 독서량이 줄었다. 하지만 게임을 할 수록 경쟁전 점수도 줄고 있다. 방학 전에 읽은 책 중에 소개하고 싶은 것들도 많지만 타이밍을 놓쳐버린게 아쉽다. 작년에 미국에 있을 때 등교 시간에 페이스북 보는 것보다 조금이라도 의미 있게 시간을 보내야겠다는 생각에 e북을 읽기 시작했는데, 그게 이번 학기까지 이어져서 재밌는 책들을 많이 읽었다.

크림슨의 미궁

작년에 <신세계에서> 읽고 빠진 작가인데, 올해 제대로 덕질을 시작해서 유스케씨 책을 꾸준히 읽고 있다. 도서관에다 책 사달라고 신청도 하고 절판된 작품은 중고로 사 모아서 이제 도서관에 있는 책과 내가 소장하고 있는 책들을 모으면 유스케 작품이 전부 모인다. <크림슨의 미궁>은 다른 작품에 비해 오락성이 강했던 책으로 <헝거 게임> 같은 생존 서바이벌을 소재로 하고 있다. 나름대로 여운 있는 결말과 적절한 반전이 있었지만 유스케의 다른 명작들에 비해서는 주제의식이 가벼웠던 점이 살짝 아쉽다. 나중에 기시 유스케는 영업글을 한 번 쓸 예정.

오감도

이상의 시집. 예전부터 소문으로만 들어서 직접 읽어봐야겠다고 생각하다 도서관에서 발견했다. 한자가 많아서 절반 정도밖에 이해하지 못했다. 정신분열 걸리는 시라는 세간의 인식과는 달리 막상 읽어보니 괜찮은 시도 많았다. 특유의 소재와 문체가 어울려 몽환적인 분위기를 만듦. 한자를 한글로 쓴 판본이 있다면 다시 읽어보고 싶다. 모자랑 거울 나오는 시들이 특히 좋았다.

공부중독

창의설계 수업 마지막 시간에 나눠준 책. 공부가 유일한 길이라고 믿는 현재 한국 사회의 교육문화를 분석한 책이다. 흥미로운 부분 두 가지를 꼽자면 인성교육이나 픽업 아티스트 등 배움의 영역이 아닌 것들이 포장되고 상품화되어 공부 산업이 되어버렸다는 부분과, 공부를 한다는 핑계로 사회 진출을 미루는 사람이 늘었다는 부분이었다. 사회에 공부하는 사람만 필요한 것도 아닌데 모두가 공부만이 길이라고 믿는 건 이상한 현상이고, 이런 믿음은 많은 부작용을 낳으니 해결해야 한다는 것이 저자들의 주장이었다. 대중의 입장에서는 흥미롭고 설득력 있었지만, 내 주변에는 진짜 자기 길이 공부였던 사람이 많아서 일반화 당하는 듯한 기분이 살짝 있었다.

차회 예고

e북으로 <Crystal Society>를 읽고 있다. 강인공지능의 눈으로 바라본 인간 세상 이야기인데 영문에다가 엄청 길어서 언제 다 읽을 수 있을 지 모르겠다. AI에 관심 있는 사람들이 보면 진짜 재미있게 볼 수 있을거라 생각한다. 공짜니까 검색해서 받아 보시면 됩니다. 한강의 <채식주의자>는 <Crystal Society> 다 읽고 나서 읽으려고 e북을 사 놓기는 했는데 아마 근시일 내에는 읽지 못할 것 같다.

기시 유스케 작품을 열심히 읽어서 이제 <다크 존>이랑 <자물쇠가 잠긴 방> 두 개 남았다. <다크 존>을 먼저 읽을 예정이다.

PL 수업시간에 괴델, 튜링 등 수학자들 얘기 들었던게 너무 재밌어서 수학사 책도 읽고 있다. 고등학교 때 읽었던 <수학의 반전> 같은 느낌으로 수학자 소개와 연습 문제를 잘 섞어 놓은 책인데, 내가 원하던 방향성이랑은 약간 달랐지만 내용이 적당히 재밌어서 이것도 자기 전에 조금씩 읽고 있다.