Leetcode에 대해 한마디

Leetcode라는 곳이 있다. 쉽게 말해서 온라인 컴퓨터 경진대회 문제집(?)/playground? 같은 곳이다.

그러니까 여러가지의 경진대회 스타일의 문제가 있고 (자주 컨테스트도 한다) 그것에 대한 해답을 submit하면 자체적으로 돌려보고 요구 조건에 합당한 결과가 나올 때 그 해답을 채택한다. 사실 그 해답이 채택되어야 내가 그 문제를 풀어낸 게 되는 것이다. 문제가 채택되는 조건은 다양한 입력 패턴에 대해서 출력결과가 예상 결과와 완벽히 일치해야 함은 물론이고 또 주어진 시간 내에 그 모든 입력 패턴을 실행할 수 있어야 하고 메모리 사용도 되도록이면 작게 해야 한다는 것이다.

이곳의 장점은 비교적 다양한 언어를 지원한다는 데 있지 싶다. 그런데, C/C++를 java/python보다 선호하는 입장에서는 뭐랄까 조금 섭섭한 구석이 있긴 하다.

대충 적어보자면,

이를테면 recursion을 써서 3-4줄이면 끝나는 문제인데 time out이 되어서 받아주지 않고, 오히려 hacker style로 feed-forward하면서도 지저분하게 작성해야 되는 경우가 있다. 도무지 이해가 되질 않는다. 두 가지 경우를 컴파일해서 비교해 보면 오히려 전자의 처리 속도가 더 빠름에도 불구하고 말이다.

C/C++로 작성하는 것과 Java나 Python/swift/Perl로 만든 것과는 엄청난 차이가 있다. 그런데, 내부의 playground에서는 이것을 온전한 C++로 인식하지 않고 다른 형태의 언어로 conversion을 해서 처리하는 것이 아닐까 한다. 오히려 C++를 쓰면 penalty가 있는 게 아닌가 싶을 정도로 python으로 멍청하게 작성한 경우 더 좋은 결과를 낸다.

이렇게 된 것에는 요즘 사람들이 Java나 Python을 즐겨쓰기 때문이 아닐까 하는 생각이 들기도 한다. 여러 해 전인가 간단한 FFT도 python으로 만들면 처리 시간이 C++ 대비 수백배나 느렸던 것을 생각하면 C++로 엉터리로 작성해도 python보다는 수십배는 빨라야 정상일듯 한데 말이다.

분명히 어디가서 이렇게 얘기하면 ‘니가 꼰대라서/멍청해서 그런다’ 하는 소리를 듣게 마련이지 싶다. C/C++과 java/python이 뭐가 다를 게 있냐는 둥, unix 만들 시절에 쓰던 그런 구닥다리 언어를 누가 쓰냐는 둥. ‘억울하면 너도 java/python으로 해’라고 할 수도 있다.

어디가서 이제 컴퓨터 좀 한다는 소리 들으려면 C/C++로 쉽게 만들 수 있는 것으로 일부러 java나 python으로 짜서 보여줘야 되는 시절이 된 거다. 그냥 딱 봐도 C/C++로 작성은 하고 있지만, 그것이 assembly로 어떻게 매칭이 될지 빤히 보이는 것도 java나 python으로 하면 여기 저기 들락날락하면서 시간 까먹을 걸 생각하면서 ‘아 이렇게 하면 엄청 느릴텐데’ 하는 나의 직관은 그냥 쓰레기 통에 버려야된다.

왜냐고? C/C++ 혹은 assembly로 하면 별다른 설명이나 예외처리 없이 그냥 애플리케이션 전체가 crash되는 것으로 끝나지만 java나 python은 그렇지 않으니까. 수십배 느려지더라도 예외처리가 되어서 적어도 애플리케이션 전체가 다 죽어버리는 대참사는 벌어지지 않게 하는 것이 좋으니까 라고 하는 사람들이 있는데, 가장 큰 이유는 이 세상의 주류를 이룰 어린 이들이 C/C++보다 java/python에 많이 노출되었기에 사용자의 수가 이쪽으로 급격히 늘어나는 반면 C/C++를 쓰던 이들은 점점 그 수가 줄어가고 있기 때문이 아닐까 한다.

70-80년대를 보면 사실 C처럼 operating system을 작성하는 데 쓰였을 만큼 어떤 실용적인 의미조차도 없던 basic이란 언어가 컴퓨터를 하는 사람들의 대부분의 사용 언어였다는 것을 생각하면 이 상황이 충분히 이해가 된다. 지금 basic이란 언어를 쓰는 사람이 있나? 내가 봤을 땐 basic 보다 차라리 직업적인 이유 때문에 fortran이나 cobol을 쓰는 사람들이 더 많을 것이라고 본다.

세상이 그렇다.