본문 바로가기

Untagged

PS 노베이스의 ICPC 도전 가이드

728x90
728x90

읽기 전 참고

이 글은 대학교에 입학 전 PS, 심지어 제대로 된 코딩 경험조차 없는 사람이 ICPC를 준비하는 법에 대한 법을 사족과 함께 설명한다.

 

각 주제 제목의 접두사에 사족이면 (사족)을 붙였으므로 정보 습득만을 필요로 하면 사족은 건너뛰고 보면 된다. 애매하면 붙이지 않았다.

이 사람은 뭐 하는 사람인가?

2021 Seoul Regional Persea Gratissima로 참가하여 예선 52위

2022 Seoul Regional FastIO로 참가하여 본선 24위를 했다.

 

 

팀 좌석에서 가장 오른쪽이 본인이다.

 

글을 쓰는 2024년 지금은 개발자로 일하면서 추후 진로를 고민하고 있다.

 

비록 수상 기록은 없지만 나같이 경험 없는 사람이 대회에 도전하고자 할 때 참고가 되면 좋을 것 같다.

(사족) 어떻게 시작했는가?

"뭔가 프로그래밍으로 대회를 하는 것이 있다" 처음 PS에 대한 인식이었다. 그때는 정올이 정확히 뭔지를 하는 건지도 몰랐던 시절이었는데, 대학교 입학 후 "프로그래밍 문제를 맞히는 사이트가 있다더라~"라는 동기들의 학구열에 BOJ와 알고스팟을 알게 되었다.

 

하지만 오래 할 수 없었다. 2017년에는 Solved.ac가 없어 부정확한 태그를 따르고 있었고, PS 자체를 몰랐기 때문에 문제를 푸려면 공부가 필요하다는 것도 알 수 없었기 때문이다.

 

아무 태그나 검색하다가 "다이나믹 프로그래밍"이라는 태그가 만만해 보여서 아무거나 들어갔는데 뭘 하라는 건지 이해할 수 조차 없었다. dp가 뭘 하는 건지도 몰랐으니 당연했다. 글을 쓰는 지금도 dp는 역시 어렵다.

 

그렇게 제대로 된 공부를 할 수 없었고 학부 1학년 수준에서 실습하는 수준 혹은 검색이 가능한 기믹성 문제(현재 solved.ac에서 번외 태그가 붙을만한 문제)만 풀면서 랭작을 하다가 접었다.

 

제대로 하게 된 계기는 2019년. 해군 정보보호병으로 병역을 이행하게 되면서 자기 계발 시간이 많이 확보된 시점이었다.

 

공교롭게도 맞후임이 과 동기(!!!)였고, 그가 종만북을 보는 것을 계기로 PS가 뭔지 제대로 인식하게 되었다.

 

과 동기가 말하길 "요즘 기업에서 개발자 전형으로 프로그래밍 문제를 맞히는 코딩 테스트라는 게 유행인데 정보보호병이라 시간이 있는 만큼 대비를 하려 한다."라고 했다.

 

나는 "그러면 미리 준비하는 게 무조건 이득이잖아?"라며 동의했고, 첫 휴가에 종만북을 사게 된다.

 

공부를 하면서 여러 정보를 알게 되니 "이왕 하는 거 대회까지 도전해 보자!"라는 결심이 들어 CP에 뛰어들게 된다.

 

정작 계기가 되어준 동기는 PS를 깊게 하지 않고 있다.

첫 공부 과정

정말 운이 좋았다. 당시 알고스팟은 UI가 구식이어서 신식을 추구하는 나에게는 고역이었는데, 마침 solved.ac가 베타 서비스로 세상에 나온 것이다.

 

그래서 베타 기여자 뱃지가 있다.

 

그때 PS를 하는 후임 중 하나가 나에게 solved.ac를 추천해 줘 바로 쓰게 되었다.

 

그래서 종만북과 BOJ를 병행했는데

 

  1. 일단 종만북을 읽는다.
  2. solved.ac에서 해당 태그를 검색하고 돌격한다. 물론 입문 문제는 클래스와 단계별 문제 풀기의 도움을 받았다.
  3. 그렇게 쭉 푼다.

 

이러면서 군생활동안 약 500문제 내외를 풀며 코드포스나 앳코더에도 입문을 하게 되었다.

그래서 어떻게 시작하나요?

ICPC에 제대로 도전하고자 하는 사람은 일단 본인이 최소한의 실력을 확보하는 것이 필요하다. 사람이 부족해서 깍두기로 데려가는 게 아닌 이상 팀에서 본인 포지션은 온전히 수행할 수 있어야 하기 때문이라는 것은 굳이 설명하지 않아도 중요하다. 팀에서의 포지션이 뭔지는 후술 한다.

 

아직 단계별이나 클래스 초기를 따라가는 수준이면 개념 공부를 열심히 하도록 하자. 정말 초심자인 경우 아래 글들을 보는 것을 강력히 권한다.

 

https://plzrun.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4PS-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0

 

알고리즘 문제풀이(PS) 시작하기

이런건 고수들이나 써야 하지 않나 싶지만, 그래도 1년정도 공부하면서 이 분야를 어떻게 시작해야 할지 써보려 한다. ▶ 어떻게 공부해야할까? 나는 아직도 PS(Problem Solving)를 잘 못하지만, 주변

plzrun.tistory.com

 

https://baactree.tistory.com/52

 

알고리즘 공부, 어떻게 해야하나요?

오랜만에 정상적인 포스팅을 쓴다. 메일로 가장 많이 물어 보는 질문들이 [알고리즘 공부 어떻게 해야하나요? 어떻게 하셨어요? 뭘 공부해야 할 지 모르겠어요.] 와 같은 질문들이다. 위 질문에

baactree.tistory.com

 

본인의 실력과 학교의 인재풀에 따라 변동이 있겠지만 내가 생각하기에 ICPC에 도전하려면 아무리 최소로 잡아도 solved.ac의 클래스 6+ 이상의 사전 지식을 가지고 있어야 한다. 그렇지 않으면 적어도 한국에서는 풀 수 있는 문제가 거의 없다.

 

클래스를 밀면서 콘테스트 사이트에 도전해 대회 감각을 키우도록 한다. 본인에게 주어진 시간과 기회가 엄청 적다고 생각하면 앳코더 위주로, 여유가 더 있다고 생각하면 코드포스도 같이 한다.

 

앳코더를 공부하는 법은 이 블로그에 있던 글을 참조한다. 코드포스 공부법은 구글링 하면 여러 좋은 글이 많으니 참조하자. 나도 블루 이상을 달성하면 글을 보충하도록 하겠다.

왜 앳코더 먼저?

위에 앳코더를 공부하는 법에도 써놨는데, 앳코더 ABC는 코드포스 div2~3와 비교해서 자료구조, 문제 풀이 테크닉을 응용하는 비중이 더 높다. 그리고 이 특징은 ICPC와도 어느 정도 겹친다고 보기 때문에 양적 성장을 원한다면 앳코더를 추천한다.

 

물론 이게 정답이 아니다. 내가 걸어온 길을 제시하는 것이고 후술할 팀에서의 포지션을 보면서 "이거 딱 나인데??" 싶으면 그 길에 맞춰 공부해도 된다.

 

이렇게 열심히 본인 실력을 수련하도록 한다. 슬슬 팀을 꾸려도 될 거 같다고 싶으면 팀을 모집하도록 하자.

팀 구성하기

이제 ICPC를 준비하기 위한 팀을 구성해 보자. 백준 학교 랭킹을 보면서 인재풀을 파악하여 상상 팀 구성을 해본다. 과거 학교 ICPC 실적을 보면서 어느 정도 수준을 맞춰야 할지도 파악한다. 활성화된 PS 동아리가 있을 경우 동아리에서 열심히 영업하며 인재 영입을 한다.

 

다만 동아리가 활성화되지 않거나 학교의 학풍 자체가 PS를 열심히 하지 않을 수도 있다. 그럴 때는 에브리타임에서 글을 올려 구인하거나 수업에서 알게 된 사람을 어떻게든 설득시켜 깍두기라도 참전시켜야 한다.

 

사람을 모을 용기가 나지 않는다고 포기하지 말자. 보통의 코스를 밟고 졸업하는 한국 대학생은 ICPC 본선에 진출할 기회가 4번뿐이다. 거기다 재수 삼수 같이 나이가 많아지면 나이 제한에 의해 더 줄어들 수 있다! 나는 ICPC를 늦게 대비해서 정말 아쉽게 느껴진다. 그러니까 하고 싶으면 뭐든 하자.

 

참고: ICPC에 참가하려면 선수 3명 말고도 코치 교수를 지정해야 한다. 학교에 따라 팀 코치를 해줄 교수를 직접 찾아야 할 수도 있다. 내 주변 소식통으로 생각하건대, 그런 학교는 대게 PS가 활성화되지 않은 학교고 가장 적합해 보이는 교수를 찾아 메일을 보내면 두 팔 벌려 환영해 주실 것으로 예상한다.

 

아무튼 본인에 환경에 따라 가능하면 빠르게 팀 구성을 끝낼 수 있도록 하자.

친목하기

팀을 구성했으면 가장 먼저 달성해야 할 목표는 팀 연습도 아니고 "서로 반말하기"다. FastIO 팀은 17, 19, 22 학번이라는 심상치 않은 조합이어서 제일 오래된 내가 먼저 조심하려고 존대를 했다. 하지만 이것은 틀린 판단이었다.

 

팀의 호흡을 맞추고 싶으면 친목을 통해 빨리 서로 반말을 할 수 있는 상태에 도달해야 한다. ICPC는 3명이 호흡을 맞춰야 하는 대회이다 보니 서로의 소통이 빠르고 원활하게 이루어져야 한다.

 

예시: "A번 좀 봐주시겠어요?" vs "A 좀 봐봐"

 

소통에 필요한 글자가 절반이 된다. 어느 대회가 그렇듯 시간 관리가 중요한데 이런 짤짤이 하나가 팀의 진행을 빠르게 해 줌을 크게 느꼈다.

 

술을 먹든, 피자를 먹든, 보드 게임 카페를 가든 빨리 친해지도록 하자.

초벌 팀 연습과 팀에서의 포지션

팀이 전반적으로 뭔가 정올이나 그런 경험이 풍부하다면 알아서 연습하면 되지만 경험이 없으면 모른다.

 

ICPC를 대비하기 위해서 3명이 모여 기출문제를 푸는 팀 연습을 거치게 된다.

 

그런데 처음 모인 팀은 두세 번 팀 연습을 해보면서 나, 그리고 팀원의 특성을 파악해야 한다.

 

기출문제로 공부하기 좋은 지역 셋은 구사과의 블로그 글에 있다.

 

https://koosaga.com/217

 

내가 문제풀이를 연습하는 방법

(2018.11.07: ICPC 대회 난이도에 별점을 매겼습니다. 사실 제일 중요한 건 난이도인거 같아서 마음에 좀 걸렸는데, 이렇게 하면 조금 더 가시성이 있지 않을까 싶네요.) 공부하기 싫어서, 제가 평소

koosaga.com

 

FastIO 팀은 여기서 BAPC, NCPC, GCPC, LARC 위주로 연습을 했다. 이 4개의 대회가 가장 접근성이 좋다고 생각된다. 그리고 그거보다 더 어렵게 하기엔 팀 역량에 비해 너무 버겁기도 했다.

 

아무튼 처음 한다면 그중에서도 BAPC 예선 또는 GCPC를 치도록 하자. 그러면서 서로 강평을 하도록 하자. 그러면 각 팀원의 특성을 알 수 있는데 이 과정이 상당히 중요하다.

 

수학을 못하고 구현을 잘하는 팀원에게 깡수학으로 추정되는 문제를 주면 될까 안될까? 당연히 안된다.

 

우리는 저기 스코어보드 상위권의 3 레드처럼 모든 분야에 하방이 보장된 사람들이 아니다. 따라서 극상위권이 아니라면 문제를 3 등분해서 온전히 맡으면 안 되고, 문제를 파악하면서 해당 문제에 가장 잘 대응할 거 같은 팀원에게 빠르게 토스해줘야 하기 때문에 팀원의 특성 파악이 매우 중요하다.

 

팀 FastIO는 연습을 통해 각자의 특성을 다음과 같이 파악했다.

 

ktw020406: 정올 출신이라 가장 체급이 높다.

noye: 팀의 수학자. 팀 연습 때 LCP 문제를 뭔가 해서 행렬로 푸는 기행을 보여줬고 22 Seoul Folding Stick도 "이거 그냥 이거 아님?"하고 뚝딱 맞췄다.

herdson: 구현 특화, 챗 지피티. 팀 중에서 가장 구현에 강해 문제의 구현이 무겁다 싶으면 떠넘기는 식으로 운용했다.

 

연습을 하면서 서로를 잘 파악하도록 하자.

팀 연습 하기

그러면 그 팀 연습을 어떻게 하느냐? 가 따라오는 질문일 텐데 teams에서 팀을 파고 코드포스 GYM을 활용하면 좋다.

 

 

Create new team 하고 팀원 초대하면 된다.

 

 

그리고 코드포스 메인 페이지에서 gym 탭에 들어가 필터에 Official ICPC Contest를 걸면 어딘가에서 했었던 ICPC 기출을 해볼 수 있다. 다만 모든 기출이 업로드되는 것이 아니라서 gym에 없는 경우 백준에서 그룹을 파고 그룹 연습 기능을 이용해 풀었다.

 

 

팀 연습을 통해 부족한 점을 보완하고 팀 호흡을 완성시키도록 한다.

 

가능하면 대면으로 모여하는 것을 추천하고, 모이기 힘든 경우엔 디코로 하도록 하자.

팀 노트 작성

ICPC는 예선과 본선 모두 단면 25장의 노트를 가져갈 수 있다. 외우기는 힘든데 대회에서 자주 나올만한 알고리즘의 구현 코드나 발상을 하는데 도움이 되는 팁 등을 적을 수 있다. 여백에 따라 응원 메시지를 넣을 수도 있다.

 

어떻게 생겼는지는 여기서 보면 될 것이다. 물론 최상위권의 팀 노트이기 때문에 팀 수준에 맞게 적당히 낮추는 것이 중요하다.

 

팀 노트를 만들 때는 온라인으로 tex 편집이 되는 overleaf를 사용할 것을 추천한다.

 

처음엔 어떻게 만들지 몰라서 수소문을 했다.

(외전) 대회 홍보

ICPC 한국 규정에 "한 학교에서 15팀 이상 참여하면 본선 시드 추가 지급"이 있다. 어쨌든 본선에 갈 기회가 늘어나면 좋으므로 이런 시드 확보를 위한 외적 노력을 하는 것도 유용할 수 있다.

 

모 대학처럼 학교 차원에서 장학금을 걸거나 강제 참여를 시키지 않으면 달성하기 상당히 어렵다. 친한 과 사람들에게 참여를 독려하거나 에브리타임에 글을 올리면서 가능한 많은 팀이 참가하기를 노려보자.

예선

잘해보자. 떨어지면 아쉽지만 다음 해를 잘 노려보자.

본선과 팁

본선에 붙었다면 잘 쉬도록 한다. 한 잔 하면서 긴장을 풀도록 한다.

 

그리고 본선도 열심히 준비하자. 본 대회는 토요일, 금요일에 예비소집을 하므로 그냥 출석 인정서를 확보하고 숙박을 잡는 것이 여러모로 편하다. 넉넉히 2~4주 전에 예약을 하도록 하자.

 

숙박 시설마다 정원이 2인으로 제한되거나 3인 입실 시 추가금을 받는 경우가 있다. 그런데 킨텍스 주변은 학생의 평범한 자본금으로는 2인 제한인 경우가 많았다. 3인 입실 가능한 매물을 잘 찾아보도록 한다. 팀 FastIO는 K 모 호텔을 저렴하게 잡을 수 있었다.

 

그리고 본선을 친다. 그리고 멀티태스킹이 잘 되는 경우는 주변에 강팀이 있을 경우 대화를 귀담아듣자. 열린 공간에서 하는 대회기 때문에 타 팀의 토의에서 좋은 아이디어를 얻을 수 있다. 어차피 우리 팀도 토의해야 하기 때문에 서로 주고받는 페널티라 생각하면 된다.

 

말은 이렇지만 실제 대회로 들어가면 그냥 우리 문제에 집중하기 때문에 귀담아 들을 일이 없다.

 

 

본선이 끝나면 뒤풀이, 회고는 나중에 미루고 일단 집에 신속히 가는 것이 좋다. 나는 대회장 가는 경로만 생각했는데 집에 돌아올 때 버스 대기가 너무 길어서 힘들었다. 어쨌든 지하철로 집에 갈 수 있는 경우 길 찾기 앱에 버스가 빠르다고 나와도 무조건 지하철을 타는 것이 시간적으로 이득이다.

마치며

원래는 대회가 끝나자마자 쓰려고 했는데 휴식과 일이 겹치다보니 지금 쓰게 되었다. 예정보다 1년 이상 지체되었지만 지금이라도 ICPC에 관심이 있는 사람들에게 도움이 되길 바란다.

728x90
728x90

'Untagged' 카테고리의 다른 글

리팩터링 2판 요약 - 챕터 6  (1) 2023.12.17
리팩터링 2판 요약 - 챕터 3  (0) 2023.12.03
리팩터링 2판 요약 - 챕터 2  (1) 2023.11.12
[numpy] unravel_index  (0) 2022.01.02