알고리즘

코드포스 블루 달성 + 정올 얘기 + 잡설

gubshig 2023. 7. 27. 01:44

블루를 찍었다! 이번 1월부터 ps를 본격적으로 시작하며 그 때 팠던 계정인데, 학기중에 새벽코포를 할 순 없어서 유기하고 있다 방학에 다시 시작하였다.

최근에 있던 div 3 에서 6/7 솔을 하고 블루를 달성하였다. 3월에 마지막으로 후기(?)를 작성하고 뭔가 쓴 게 없어서 그동안 어떻게 살았는지, 뭘 공부하였는지도 작성해볼까 한다. 

 

4월

4월에 있던 가장 큰 이변은 아마 ps과외를 시작했다는거다. 정올 1차 전까지만 2달 특강 느낌으로 할 계획이었다.

 

그냥 학교 동아리에서 주는 셋과 수업을 들으며 준비할 예정이었지만,

동아리 수업이 5월 이후에 시작하고 기초적인 내용만 다룰 예정이라는 얘기를 부장에게서 듣고,

혼자서 준비할 자신이 없어서 과외 선생님을 지인의 추천을 받아 구하였다.

 

과외의 형식은 문제를 주시면 내가 15분 가량 풀이를 생각하고 모르겠으면 풀이를 듣는 식이었다.

그 후 수업 때 다루었던 문제들을 구현하는 방식? 

업솔빙은 왠만하면 다 하려고 노력했다.

다양한 웰노운 유형들, 테크닉, 문제 접근 방법, 고급 알고리즘 등을 배울 수 있어서 좋았다.

단기간에 실력을 늘리고 싶으면 과외를 받아보는 것도 괜찮다고 생각한다.

 

이때 이후로 플레 문제에 대한 자신감이 생겼고,

플랜디가 가능한 실력은 아직 한참 멀었지만 어느정도는 풀 수 있게 되었다.

5월

5월에는 대망의 정올 1차가 있었다. 당시 나는 본선을 가는건 무리고 경험을 쌓자는 생각으로 나갔었다.

일단 알고리즘 공부를 시작한지도 얼마 되지 않았었기에.. 

결과적으로는 본선 진출에 성공하게 되었다. 1교시 점수가 참 인상적이다.

 

2교시 2번 문제에 대한 억울한 점이 조금 있는데..

정해와 동일한 풀이를 제출하였지만 파이썬 억까를 당해서 MLE를 맞고 만점을 받지 못하였다(....)

이건아니잖아요진짜

듣기로는 dfs 함수에 인자를 하나만 넣으면 AC고 2개부터는 MLE 라는데.. 난 진짜 모르겠다..

시간이 충분하였다면 스택으로 비재귀 dfs를 짜봤겠지만,

나는 이 문제의 풀이를 대회가 끝나기 5분전에 찾아서 그럴 시간이 없었다.

12월에 있던 USACO에서도 대회가 끝나기 5초전 제출을해서 맞았는데, 이번에도 성공했다.

본선에서도 상을 받고 싶은 욕심이 생겨 과외를 연장하였다.

 

대충 대회 때 기억을 더듬어보자면..

 

1교시는 자신이 없었다.

내가 수학에서 가장 못하는게 조합론이기도 하고 기출을 딱히 풀어본적이 없어서(...)

문제에서 기댓값이 나왔는데 나는 기댓값 계산하는법을 모른다!

그냥 조졌구나.. 싶어서 비버 챌린지 몇개를 열심히 풀었다. 

 

1교시를 조졌으니 2교시라도 잘 봐야한다는 마음이었다.

2교시 1번은 네제곱이 돌 것 같아서 짰는데 맞았다. 10분 정도 걸렸던 것으로 기억한다.

 

2번을 봤는데 트리 문제였다.

트리 문제를 평소에 좋아했지만, 뭔가 감이 하나도 안잡혔다.

이걸 센트로이드를 짜야하나.. 를 진지하게 고민하다 고등부 1차 2번에 센트가 나올리가 없다는 생각을 하고 3번을 봤다.

이걸 대체 어케풀지?

생각이 들어서 바로 유기하고 2번을 계속 잡고 있었는데.. 뭔가 dfs를 시뮬레이션하며 생각해보니 풀이가 보였다. 이 당시 남은 시간은 단 5분(...) 빛의 속도로 짜고 74점을 긁는데 성공했다.

6월

1차에서 파이썬은 TLE MLE 언어다 라는 교훈을 얻고, CPP을 공부하기 시작했다.

이 연습의 이름은 "PS트레이닝여행" 이다.

마침 수학여행이 정올 바로 다음주라, 수학여행에서 STL 연습을 하면 딱이라는 생각을 했다.

아무래도 집에 있으면 게으러져서 침대에 자꾸 누으니...

침대가 없는 수학여행 숙소라면 평소 예민한 나는 불편해서라도 눕지 않을 것이라는 생각이었다.

또한 이동에 상당히 많은 시간을 소비하여, 버스에서 ps를 하면 딱이라고 생각했다.

파이썬에 없어서 서러웠던 std::set 의 사용법을 숙지하였다.

그 외에 구조체 세그를 짠다던가 삭제 연산 지원 우선순위 큐을 구조체로 짠다던가 하며 STL에 익숙해졌다.

 

처음에는 CPP에 대한 막연한 공포가 존재하였지만, 막상 해보니 주변에 고인물들의 코드를 눈팅하던 습관 때문인지 생각보다 빠르게 익히게 되었다. 현재에 이르러선 간단한 문제는 python으로 빠르게 구현하고, 그래프나 자료구조 등 코드가 길어지는 문제는 CPP로 짜는 상태에 도달했다.

7월

7월에는 정올 본선이 있었다. 마지막 과외 수업을 받고, 혼자서 이런저런 oi셋을 돌며 대비하였다.

그러나 치명적인 문제가 생겼는데.. 본선 1주 전에 심각한 독감에 걸렸다. 학교를 이틀동안 빠지고도 완벽히 회복을 못해 평소 일주일에 3번씩 가던 노래방도 가지 못하는 상황에 이르렀다. 그렇게 최악의 컨디션으로 본선을 맞이하게 된다. 

 

망함

결과는 처참했다.

1번은 간단한 실버 그리디 문제였지만 스택으로 단조성을 관리하는 뻘짓을 하여 30분이나 소비하였고..

2번은 지금봐도 잘 모르겠는 어려운 문제다. 보자마자 23점을 긁을 풀이가 생각났지만, 풀테를 계속 노리가 결국 시간만 버리고 23점만 긁게 되었다.

3번은 일단 스킵하고 4번을 봤는데, 뭔가 금광세그를 짜면 될 것 같아 짜다가 개같이 멸망하고.. 풀테를 계속 노리다 결국 실패하여 25점으로 마무리하게 된다.

시간이 별로 남지 않은 상황에서 3번을 보는데, 그동안 계속 있던 두통이 더 심해져 집중을 하지 못하는 상태에 이르렀다.

 

여담으로 3번은 백준에 문제가 올라오자마자 풀었다고 한다(...) 내가 평소에 자신이 있던 트리 + 그리디 유형이라 무조건 풀었어야 했는데 당시엔 내가 고등부 3번을 풀 수 있을리가 없다 + 고등부 3번이 이렇게 간단할리가 없다 분명 센트 이런거겠지? 싶어서 던졌었는데.. 아직도 후회된다.

 

아무튼 이렇게 본선을 망치고 장려상을 예상하며 결과를 기다렸다.

 

다행히(?) 동상을 받게 되었다. 컨디션이 진짜 안좋은 상황에서 보기도 하였고 실제 대회도 망쳤다고 생각해서 장려상을 예상하고 있었는데.. 턱걸이로 동상을 받게 되었다! 솔직히 은상을 기대하고 있었어서 아쉽기도 한 것 같다.

7월에는 이거말고 천하제일코딩대회라는 교내 대회도 있어서 참가하게 되었다. ^2등^을 하였는데.. 진짜 억울하고 할 얘기도 많지만 이거까지 쓰면 너무 길어질 것 같아 나중에 기회가 되면 작성해보도록 하겠다.

 

그래서 이제 뭐함?

뭐 아무튼 이래서 허무하게 정올이 끝나게 되었다. 단기적인 목표로는 NYPC 본선 가서 코스프레 하기, 코드포스 퍼플 가기 정도가 있을 것 같다.

 

블루를 가게 되어서 자신감이 조금 붙었다. 대회를 2연속 망쳐서 조금 많이 우울했었는데, 생각보다 내 멘탈은 강한지 별로 오래가지 않았다.

 

방학 때 공부 계획은 좋지만 지금 거의 완벽히 수행한적이 없다. 일단 매일 oi셋을 돌거나 업솔빙을 하고, 골플랜디도 하며 코드포스도 참가하는(...) 계획을 세웠는데 변수가 몇개 작용하였다. 일단 수학학원 시간이 늘어난 것이 있다. 이 때문에 월 수 금 에는 ps를 거의 하지 못한다. 아침에 하면 되긴 하는데.. 이는 두번째 변수 코드포스에 막힌다. 코드포스가 새벽까지 있다 보니 컨테를 마치고 디스코드에서 잡담을 하다 보면 4시를 넘기게 된다. 결국 생활패턴이 망가지고 아침에 무언가를 하지 못하는 상황이다.

 

방학 프로젝트로 게임 개발도 해야하고 뭐 할게 많은데 어떻게든 되지 않을까? 일단 오늘은 자고 일어나서 셋을 좀 돌아야겠다.