잘하고 싶은 마음은 굴뚝 같지만, 나는 알고리즘에 굉장히 취약하다. 학부 때 중간고사에서 바닥을 깔아 전공 공부에 심각한 회의를 들게 만든 과목이 바로 알고리즘이었다. 안에서 새는 바가지 미국에서도 샌다고 마지막 학기라 단 한 과목만 들었던 학기였음에도 여기에서도 (아마도) 꼴찌였다.

머리가 나쁜 것이 원인이라고 말하고 웃어넘길 수 있겠지만, 알고리즘을 새롭게 디자인하는 것도 아니고 알려진 알고리즘을 활용하여 프로그램을 작성하는 수준이라면 왜 나는 못 하는 것일까? 이번 기회에 구체적으로 원인을 따져보면 해결책이 있지 않을까 해서 글을 써본다. 떠오르는 문제가 크게 3가지 있다.

첫째, 재귀적 사고력(recursive thinking)이 부족하다. 많은 문제가 재귀(recursion)로 풀면 쉽게 풀린다. 회사에서 문제 풀이(problem solving)를 한 적이 몇 번 있다. 여기에서 나는 놀란 점이 사람들이 꽤 재귀적 사고에 익숙하다는 점이었다. 재귀 방식의 장점은 풀이가 직관적이라는 것이다. 그런데 나는 그것이 쉽게 되지 않는다. 풀이를 보고 쉽게 이해되지도 않는데, 내가 그렇게 프로그램을 짜는 것이 얼마나 어려운 것인지는 말 안 해도 알 것이다.

둘째, 고집과 아집으로 인해 다른 접근 방식을 생각해보지 않는다. 물론 초기에는 이러저러한 접근 방식을 고려하지만, 어느 정도 방향이 보일 때 접근 방식에 대한 더 이상의 유연함이 없다는 점이 큰 문제이다. 정답이 다른 접근 방법으로 풀었고 훨씬 간단할 때 뼈져리게 느낄 수 있다. A 접근으로 해결책이 나오지 않으면, B 접근은 없을지 생각해보아야 하는데 그러지 않는 경우가 많다.

셋째, 세심하지 못하다. 경계 검증(binary check)을 참 못한다. off by one error와 같은 기본 문제를 발생시키지 않는 경우가 없다. 문제에 대한 해결책이 떠올라도 실제로 돌려보면 오답이 나오는 경우는 십중팔구 이 문제를 해결하지 못해서다. 툭하면 배열 인덱스를 벗어나 런타임 오류를 발생하는 원인이다.

위 문제들을 해결하는 방법이 딱히 있는지 모르겠다. 셋째의 경우 의도적으로 종이에 써서 하나씩 알고리즘을 완성하고 경계 검증까지 해보려고 하는데 그것도 쉽지 않고, 수차례 해서 오류가 나면 짜증이 날 뿐이다. 침착하고 정확하게 하기보다는 대충 빨리 풀고 오류를 고쳐나가는 try and error 방식으로 모든 문제를 풀어왔던 게 이런 문제를 일으킨 하나의 문제이기도 하다.

그렇다고 손 놓고 있을 수는 없으니, 앞으로 오랜 시간에 걸쳐 공부해나가면서 개선되는 점이 있으면 그러한 방법을 공유해 보도록 해야겠다. 나처럼 머리가 나빠서(?) 알고리즘과 같은 문제를 풀어내고 싶은데 고생하는 사람들이 많이 있을 테니 말이다.

,