첫 코드포스 도전 후기

2019. 11. 25. 21:57Problem solving

저는 소프트웨어학과를 올해(2019) 입학한 학부 신입생입니다. 그리고 소프트웨어학과는 프로그래밍을 배웁니다. 프로그래밍을 배우는 과정에서 개발자 커뮤니티나 동기, 선배 등 제가 가야 할 길을 미리 거쳐간 많은 사람들의 조언을 들을 수 있었는데, 그들이 입을 모아 말하는 것이 한 가지가 있습니다.

 

문제를 많이 풀어봐라.

 

고등학생때 비록 잘하지는 못했지만 수학이라는 학문을 공부한 경험으로 왜 하나같이 입을 모아 이런 말을 하는지 알 수 있었습니다. 어떤 학문에 있어서 그 법칙과 개념들은 객관적인 것들입니다. 그러한 것들은 우리가 공부를 통해 받아들일 수 있습니다. 하지만 그러한 법칙과 개념들을 응용하는 것은 그저 그것을 알게 되는 것과는 전혀 다른 차원의 문제입니다.

 

여기서 프로그래밍 선배들이 해주신 조언이 빛을 발합니다. 바로 문제를 푸는것입니다. 반복된 훈련으로 무의식적으로 더 빠르고, 효율 좋고, 우아한 프로그래밍을 하기 위한 '직관'을 쌓아가게 됩니다.

직관이라 함은 매우 추상적인 개념인데, 굳이 말로 표현하자면 문제를 분석하는 능력과, 비슷한 상황에서 이전의 경험을 바탕으로 문제를 해결할 수 있는 능력 등을 말하는 것일 것입니다. 그리고 프로그래밍에서 이 직관은 곧 실력을 의미합니다. 

 

굳이 직관이 무엇인지 복잡하게 말로 풀지 않아도 여러분들도 문제풀이가 문제를 푼다 그 이상의 의미를 가진다는 것을 잘 아실것이라 믿습니다.

 

그래서 저는 프로그래밍을 연습하기 위해 매우 유명한 온라인 저지 사이트인 백준 온라인 저지(https://www.acmicpc.net)에서 매우 기초적인 문제부터 문제를 풀기 시작했습니다.

 

아직 제대로된 알고리즘 아는 것 하나 없는 볼품없는 실력이지만, 한 문제 한 문제 풀어나갈 때마다 사이트에서 제공하는 랭킹이 오르는 것을 보고 희열을 느낄 수 있었습니다. 문제 수로 사이트 이용자들과 경쟁이 아닌 경쟁을 한 것이지요.

 

그리고 특히 제가 경쟁적인 상황에 놓였을때 얼마나 학습에 있어서 동기부여가 잘 되는지 온라인 저지를 사용 하면서 잘 알게 되었습니다. 더욱더 경쟁적인 프로그래밍 플랫폼을 찾던 도중, 코드 포스(Codeforces, https://codeforces.com/)라는 프로그래밍 대회가 자주, 정기적으로 열리는 사이트를 발견하게 되었습니다.

이 사이트는 열리는 Contest마다 사용자의 점수를 바탕으로 League of legends같이 참가자의 대략적인 실력을 나타내기 위한 rating을 매깁니다. 그리고 사용자에게 rating을 바탕으로 닉네임 색상과 칭호를 내려줍니다. 프로그래밍의 실력에 따라서 본인의 프로필에 가시적인 변화가 보이는 것이죠. 이 것을 보고 코드 포스는 제가 스스로 공부하도록 동기부여를 하게 만들 수 있는 최고의 매체라고 생각하였습니다.

 

그렇게 하여 첫 Contest로 Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3)에 참가하여 문제를 풀어보았습니다. 경쟁적 프로그래밍에 처음 참가해본 저로써는 다소 이해하기 어려운 점수 시스템이 있었는데, 이것은 다음에 제가 더 경험이 많이 쌓인다면 포스팅해보겠습니다. (문제풀이뿐만 아니라 Hack이라는 행위를 통해서도 점수를 획득할 수 있는 등의 복잡한 규칙이 있습니다)

 

그렇게 해서 받은 저의 성적입니다. 

인생 첫 Codeforces 참가 성적

총 8개의 문제가 있는데, 그 중 가장 쉬운 문제인 A번을 대회 시작 후 50분이 지난 시간에 풀었습니다. 그리고 곧바로 B번을 도전하였는데, A번과는 살짝 괴리가 있는 난이도를 가진 문제였습니다. 표를 보시면 B에 -1이라는 기록이 되어있는데, 이는 제가 한 번의 제출을 실패했다는 뜻입니다. 이 제출에서 첫 번째 테스트 케이스는 통과하였지만 두 번째 테스트 케이스는 통과하지 못하였습니다. 제가 완벽하지 않은 코드를 시험 삼아(...) 제출해본 것이 그 이유입니다.

 

결국 A, B번을 푸는데 시간을 너무 많이 할애하여 저의 실력으로는 C번부터는 문제를 읽어보지도 못했습니다. 저의 실력에 반성을 하게 만드는 성적이였습니다. 그리고 B번은 시간제한(2시간)만 없었다면 뭔가... 풀 수도 있었을법한 문제였습니다. 이번 대회에서 한 번의 시도라도 해본 A, B번은 B번의 답을 스스로 구해보고 포스팅해보겠습니다.

 

처음 받은 Codeforces 등급

 

그리고 대회 종료후 얼마 뒤 제 프로필을 가보니 텅텅 비어있던 Rating graph에 점 하나가 찍혀있었습니다. 바로 제가 참가했던 첫 코드 포스 라운드에서 배정받은 rating이었습니다. 1415점, Specialist등급 이네요! A번만 풀고 전문가 칭호를 받다니 좀 양심에 가책을 느끼네요. 이름뿐인 건 알지만 앞으론 더 열심히 하라는 코드 포스의 깊은 뜻이 아닐까 싶습니다.

 

저는 정말 최근에야 PS를 시작했습니다. 사실 어디가서 프로그래밍한다고 말할 실력도 아닙니다. 아직 조건문, 반복문만 사용한 구현만 조금 하는 수준이고, 앞으로 더 배워야 할 부분이 정말 많은 것을 알고 있습니다. (특히 이번 코드 포스에서 한 문제밖에 못 푼 것으로 이 것을 더 절실히 느낍니다)

당장은 미래에 더 높은 연봉의 직장같은 거창한 목표를 위해 PS를 하는 것이 아니라, 코드 포스 닉네임 색깔을 더 화려한 색깔로 바꾸기 위해 공부할 것입니다. 일단 세 달 안에 파란색 등급을 달성해 보는 것이 저의 단기간 목표입니다.

엄청 유치한 이유긴하지만, 어쨌든 방구석에서 개돼지처럼 사는것 보단 낫잖아요?

 

앞으로도 주기적으로 코드 포스를 비롯한 대회 참가 수기를 많이 남기겠습니다. 저의 발전을 기대해 주세요. :^)

'Problem solving' 카테고리의 다른 글

LCA 예제 코드  (0) 2020.06.03
실수(real number)포비아 를 위한 ceil(x/y)  (0) 2020.05.29
그래프 그리는 툴 (CS Academy Graph Editor)  (0) 2020.05.11