ACM_ICPC 2016 후기

이민석, 정진경, 홍성현

https://docs.google.com/document/d/1-d-yv20PJ9UYaibZUk9oq7jg5y7TrMzhHUJ3Z7EgN_A/edit

ACM-ICPC 대회 참여를 고민하는 사람에게

대회 준비가 현실적으로 도움이 되는지?

JG: 도움이 되는 요소를 2가지로 나누자면 소위 스펙이라는 외재적 요소와 코딩 능력이라는 내재적 요소로 나뉜다고 생각하는데, 정말로 쓸모있는 스펙이 되려면 아주 많은 노력을 들여야 할 지도 모릅니다. 다만 제가 강조하고 싶은 부분은 대회에서 입상을 하지 못하더라도 준비 과정에서 얻게 되는 코딩 능력이 꽤나 유익하다고 판단합니다. 여러 IT 기업들이 ACM-ICPC 방식의 문제를 이용해서 입사 문제 등을 활용하고 있기도 하기에 취업 준비에도 직접적인 도움이 될 가능성도 있습니다. 다만 현업에서의 실무는 분야에 따라 요구되는 능력이 다양합니다. 대용량 코드 유지보수, 동시성 처리, 호환성 이슈 등 소프트웨어 개발에는 다양한 이슈가 존재하는데 ACM-ICPC가 그런 이슈들을 모두 다루지 않습니다.

대회를 준비한다면 조언하고 싶은 것들
JG: 못 푸는 문제 끈질기게 풀어보는 연습 필요. 코드잼, 해커컵, 코더스 하이, UCPC, SCPC 등 나갈 수 있는 대회는 다 나가볼 것. 알고스팟, 백준 등 커뮤니티 참여해서 모르는 것 질문할 수 있는 창구 늘리고, 좋은 포스팅 등 있으면 공유 받기. 코드포스나 탑코더 등 콘테스트 해볼 것. 이미 한 번 푼 문제의 코드를 발전시켜 볼 것.

동기부여
JG: 공부를 더 해보고 대회에 출전한다는 생각 버렸으면 함(경험상 이 핑계가 가장 많은 것 같다). 실력을 드러내지 않으면 성장할 기회를 하나 잃어버린 것. 본인은 원고리즘 B학점임. 용기를 가지셈.

SH: 대회로 입상하면 상금도 받고, 상장도 생각보다 가산점으로 혜택을 보게 됩니다. 온라인 저지에서 문제를 풀거나 콘테스트 참가해서 랭킹 올리는 재미도 있으니 취미 생활로 해도 좋습니다.

ACM-ICPC 썰

팀 개개인의 실력이 너무나도 출중해 그냥 가도 올 솔브 → 이 문서를 볼 필요가 없다
대회 5시간 안에 최대한의 퍼포먼스를 발휘하려면?

공부 자료

남이 공부했던 자료 어차피 안 봄
알아서 공부하세요
알고리즘 문제 풀이 책, 온라인 저지 애용

인터넷 예선

문제 유형
온라인 competitive programming 콘테스트들은 기형적인 문제들이 많아
ACM-ICPC는 전형적인 문제로 구성 (주지스피셜)

대회 환경(DOM Judge)에서 가능한 것 테스트해보기
메모리를 이만큼 잡으면 터지나?
이 연산이 저지 시스템에서 속도가 얼마나 걸리나?
재귀 함수를 얼마나 호출하면 스택이 터지는가?

예선 문제들이 본선에도 비슷하게 나온다
예선에서 네트워크 플로우 문제 → 본선에도 네트워크 플로우 문제 나옴
예선에서 inch worm 문제 → 본선에도 inch worm 문제 나옴

대회와 비슷한 환경에서 예습
코드포스 같은 데서 다 같이 버츄얼 콘테스트 돌려보기
셋이 5시간 동안 남의 나라 리저널에 버츄얼 콘테스트
ㄴ 여건이 힘들더라도 이거 한 번이라도 하는 거 추천


팀노트 준비

알고리즘은 아는데 코딩하기 귀찮은 것 / 까먹을 위험이 있는 것 / 못 외울 것
ex) 네트워크 플로우, 벨만-포드, 펜윅 트리

모르는 거 적어가봐야 못 품

팀노트 만들면서 배웠던 거 총정리하는 느낌

대회할 때

시간 분배
5시간 동안 12문제(문제 수는 변할 수 있습니다)

문제 푸는 순서
다 훑어보고 문제 분류하기 (이건 DP, 저건 그리디, 요건 네트워크 플로우…)
잘못 분류하면 뭐… 읽은 사람 탓
쉬운 것부터
초반에는 문제를 읽고 바로 코딩 가능한 것들이 있음. 이런 문제들을 찾아서 바로 풀고, 옆 사람은 종이에 손 코딩이라도 하면서 다른 문제를 풀거나 풀고 있는 문제들 테스트 케이스를 만듭시다.
테스트 케이스는 간단하게 통과 가능한 것 부터, 생각할 수 있는 에러들을 넣어가며 해보는 것이 바람직합니다.(ex> 전체 범위가 음수~양수이면, (음수~음수), (음수~양수), (양수~양수), (음수~0), (0~양수) 등등 가급적 여러 조합들을 다 해보는 것을 추천.)
C++ 같은 경우 ifdef를 사용해서 만들어 둔 테스트 케이스 txt 파일로 redirect 시키는 것도 좋아요.
어차피 올 솔브 못하니까 못 풀 것 같은 문제를 오래 붙잡는 것 보다 코딩 문제들 촤라락 풀고 한 문제에 대해 두 명 이상씩 붙어서 토의하면서 풀면 좋습니다.(페어 프로그래밍 하면 좋아요)
클린 코드를 지향합시다. 다른 사람이 코드 보기도 더 수월하고, 디버깅도 더 수월하고 실수할 소지도 줄어듭니다.(STL 사용에 익숙해 집시다)

페어프로그래밍, 세 명이 한조

A: 이거… 이진 탐색인가?
B: 이러이러한 특정 구간을 이진 탐색으로 찾아보자.
A: 아니 그거 이진 탐색으로 안됨. inch worm으로 구해봐.
C: ㅇㅋ 그거 내가 코딩함 (실패)
C: 어... 입력이 음수일 때 특수 처리해야 해.
A: (옆에서 보다가) 님 그렇게 고치는 거 맞음?
최종 통과

모르면 아예 못 푸는 문제
convex hull이 뭔지 모르는데 해법을 생각해보니 convex hull이 필요 → convex hull 알고리즘을 30분 안에 생각해내서 풀기 가능?(실제로 convex hull을 열심히 외워 갔지만 convex hull로 풀리는 것인지 몰라서 손도 못 댔어요. 기본적인 알고리즘 베이스는 당연히 중요하고 어떻게 적용되고 응용되는지 많은 문제를 풀면서 감을 키워야 합니다)

아이디어가 필요한 문제
알고리즘도 알고 기막힌 아이디어도 필요한 문제

리눅스

저 비주얼 스튜디오만 써봤는데요?
리눅스 터미널에 익숙해지셈
평소에 우분투에서 코딩해보기 / 윈도우즈에서 putty로 vim 열고 코딩

공부할 때 도움될만한 사이트들
http://codeforces.com/ 코드포스, 온라인 콘테스트도 자주 열리고, 다양한 문제들이 수록되어 있음. 문제가 영어임. 전세계의 실력자들이 콘테스트를 통해 풀었던 문제이므로 어느 정도 검증이 됨(이상한 테스트 케이스, 오해의 소지가 있는 문장 등이 적은편SH의 주관). 뿐만 아니라 틀렸을 때, 틀린 테스트 케이스를 볼 수 있고, 다른 사람의 코드도 볼 수 있다는 장점이 있음.

http://59.23.27.112/ 더블릿, 유료 사이트지만 제로페이저라면 제로페이지 계정을 이용하여 풀 수 있음. 단계별로 정리가 되어 있음.

https://www.acmicpc.net/ 백준, 국내 저지로 실력자들에게 질문하기 수월함. 게시판에 글을 쓰거나 slack을 활용하여 질문할 수 있음. 다만 검증되지 않은 문제가 가끔씩 좀 있고, 틀리면 맞추기 전에는 왜 틀렸는지 알 수 없음. 또한, 맞추기 전에는 다른 사람 코드를 볼 수가 없음.

https://algospot.com/ 알고스팟, 백준과 성격이 비슷함.

https://www.codeground.org/main.do 코드그라운드(삼성, SCPC), 삼성에서 사용하는 저지, 풀어본 적은 없지만 SCPC에 참가하기 전에는 보는 것이 좋음. 다른 컨테스트와 룰이 조금 다름(개인적으로 하는 추측이지만, TL이 각 케이스 별로 돌지 않고 전체 케이스 합산인 것 같음.)

탑코더는 이용해본 적이 없지만, 다른 곳 보다 수준이 좀 더 높다고 알고 있음.
이외에도 구글 코드잼, 페이스북 해커컵, 삼성 SCPC, 코더스 하이, 코드 첼린지 등등 많은 대회가 있는데 참가해보는 것을 권장함.

Retrieved from http://wiki.zeropage.org/wiki.php/ACM_ICPC2016
last modified 2021-02-07 05:22:20