시작하기에 앞서...
저는 소프트웨어학과를 올해(2019) 입학한 신입생입니다. 저는 이중에서도 문제를 읽고, 그 문제를 조건에 맞춰 푸는 프로그램을 작성하는 분야인 PS(Problem Solving)에 관심이 많았습니다. 이 PS를 배우는 과정에서 커뮤니티나 동기, 선배 등 제가 가야 할 길을 미리 거쳐간 많은 사람들의 조언을 들을 수 있었는데, 그들이 입을 모아 말하는 것이 한 가지가 있습니다.
문제를 많이 풀어봐라!
고등학생때 얕게 공부했던 경험으로 수학이나 물리와 같은 학문에도 적용되던 불변의 진리이지만, 학문에 있어서 그 법칙과 개념들은 객관적인 것들입니다. 그러한 것들은 우리가 공부를 통해 받아들일 수 있습니다. 하지만 그러한 법칙과 개념들을 응용하는 것은 그저 그것을 알게 되는 것과는 전혀 다른 차원의 문제입니다.
여기서 선배들이 해주신 조언이 빛을 발합니다. 바로 문제를 푸는것입니다. 반복된 훈련으로 무의식적으로 더 빠르고, 더 우아한 프로그래밍을 하기 위한 '직관'을 쌓아가게 됩니다.
직관은 사실 매우 추상적인 개념인데, 굳이 말로 표현하자면 문제를 분석하는 능력과, 비슷한 상황에서 이전의 경험을 바탕으로 문제를 해결할 수 있는 능력 등을 말하는 것일 것입니다. 그리고 대부분의 학문에서 그렇듯이 문제해결에서 이 직관은 곧 실력을 의미합니다. 굳이 직관이 무엇인지 복잡하게 말로 풀지 않아도 여러분들도 문제 풀이가 단순히 문제를 푸는 그 이상의 의미를 가진다는 것을 잘 아실것이라 믿습니다.
Codeforces를 만나다
그래서 저는 문제 해결을 연습하기 위해 유명한 온라인 저지 서비스인 백준 온라인 저지에서 기초적인 문제부터 문제를 풀기 시작했습니다. 아직 제대로된 알고리즘 아는 것 하나 없는 볼품없는 실력이지만, 한 문제 한 문제 풀어나갈 때마다 랭킹이 오르는 것을 보고 희열을 느낄 수 있었습니다. 문제 수로 사이트 이용자들과 경쟁이 아닌 경쟁을 한 것이지요.
그리고 특히 제가 경쟁적인 상황에 놓였을때 얼마나 학습에 있어서 동기부여가 잘 되는지 온라인 저지를 사용 하면서 잘 알게 되었습니다. 더욱 더 경쟁적인 문제 해결 플랫폼을 찾던 도중, Codeforces라는 ps대회가 자주, 정기적으로 열리는 사이트를 발견하게 되었습니다.
이 사이트는 열리는 Contest마다 사용자의 점수를 바탕으로 League of Legends 같은 게임처럼 참가자의 대략적인 실력을 나타내기 위한 rating을 매깁니다. 그리고 사용자에게 rating에 따른 닉네임 색상과 칭호를 부여합니다. 프로그래밍의 실력에 따라서 본인의 프로필에 가시적인 변화가 보이는 것이죠. 이 것을 보고 코드 포스는 제가 스스로 공부하도록 동기부여를 하게 만들 수 있는 최고의 매체라고 생각하였습니다.
첫 Contest 결과
그렇게 하여 첫 Contest로 Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3)에 참가하여 문제를 풀어보았습니다. 경쟁적 프로그래밍에 처음 참가해본 저로써는 다소 이해하기 어려운 점수 시스템이 있었는데, 이것은 다음에 제가 더 경험이 많이 쌓인다면 포스팅해보겠습니다. (문제풀이뿐만 아니라 Hack이라는 행위를 통해서도 점수를 획득할 수 있는 등의 복잡한 규칙이 있습니다)
그렇게 해서 받은 저의 첫번째 성적입니다.
총 8개의 문제가 있는데, 그 중 가장 쉬운 문제인 A번을 대회 시작 후 50분이 지난 시간에 풀었습니다. 그리고 곧바로 B번을 도전하였는데, A번과는 살짝 괴리가 있는 난이도를 가진 문제였습니다. 표를 보시면 B에 -1이라는 기록이 되어있는데, 이는 제가 한 번의 제출을 실패했다는 뜻입니다. 이 제출에서 첫 번째 테스트 케이스는 통과하였지만 두 번째 테스트 케이스는 통과하지 못하였습니다. 제가 완벽하지 않은 코드를 시험 삼아(...) 제출해본 것이 그 이유입니다. 결국 A, B번을 푸는데 시간을 너무 많이 할애하여 저의 실력으로는 C번부터는 문제를 읽어보지도 못했습니다. 저의 실력에 반성을 하게 만드는 성적이였습니다.
느낀점
그리고 대회 종료후 얼마 뒤 제 프로필을 가보니 텅텅 비어있던 Rating graph에 점 하나가 찍혀있었습니다. 바로 제가 참가했던 첫 코드 포스 라운드에서 배정받은 rating이었습니다. 1415점, Specialist등급 이네요! A번만 풀고 전문가 칭호를 받다니 좀 양심에 가책을 느끼네요. 이름뿐인 건 알지만 앞으론 더 열심히 하라는 Codeforces의 깊은 뜻이 아닐까 싶습니다. 실상은 이름만 Specialist일 뿐이지 민딱이라는 귀여운 칭호를 가지고 있습니다.
저는 정말 최근에야 PS를 시작했습니다. 사실 어디가서 PS좀 해봤다고 말할 실력도 아닙니다. 아직 조건문, 반복문만 사용한 구현만 조금 하는 수준이고, 앞으로 더 배워야 할 부분이 정말 많은 것을 알고 있습니다. (특히 이번 Contest에서 한 문제밖에 못 푼 것으로 이 것을 더 절실히 느낍니다)
당장은 미래에 더 높은 연봉같은 거창한 목표를 위해 PS를 하는 것이 아니라, 코드 포스 닉네임 색깔을 더 화려한 색깔로 바꾸기 위해 공부할 것입니다. 일단 세 달 안에 파란색 등급을 달성해 보는 것이 저의 목표입니다. 엄청 유치한 이유긴하지만, 어쨌든 방구석백수처럼 사는것 보단 낫잖아요?
앞으로도 주기적으로 Codeforces를 비롯한 대회 참가 수기를 많이 남기겠습니다. 저의 발전을 기대해 주세요. :^)