PS 기록/CP

SUAPC 2023 SUMMER 후기 (+ 수정 완료!)

pearl.k 2023. 8. 26. 19:50

 

내 인생 첫 대회... 어리버리하고 실수도 많이 해서 넘 아쉬웠지만 그래도 이화여대 1등팀이 되어서 기쁘다.

확실히 첫 대회라 긴장도 많이 하고, 시간 배분도 잘 못해서 풀 수 있는 문제를 놔두고 어려운 문제 잡고 고통 받기를 반복했다... 그래도 경험이 있는 팀원들의 도움을 많이 받아 운이 좋았다.

문제나 캠프 관련된 후기는 나중에 오픈콘이 끝나고 작성할 예정이다!

 


오픈콘이 끝난 후 적어보는 대회 구체적인 후기! 우리 팀원 이름이나 핸들을 밝히기는 좀 그래서 ㅎㅎ 핸들 이니셜을 따서 M벗, K벗이라고 부르겠다. ('벗'이라는 단어는 이화여대 학우끼리 서로 부르는 애칭이다!)

 

1. 준비 과정

PS를 시작한지 얼마 안되었지만, 졸업 전에 SUAPC에 꼭 나가보고 싶다는 생각을 가지고 있었다. 원래는 SUAPC 24 WINTER 를 목표로 이번 23 SUMMER를 경험 삼아 나갈 생각이었고, 팀원 모집할 때도 같이 열심히 공부해서 겨울에 제 실력 보여주실 분들을 모집했다.

당시에 나는 열정이 가득한 상태여서 SUAPC 정식 모집 공고가 뜨기 전에 (ICPC 신촌 알고리즘 캠프 공지사항이 뜰 시기쯤으로 기억한다.) 팀원을 구하고 다녔는데 우연히! 나랑 뜻이 일치하는 팀원을 구할 수 있었다. 이 때 M벗과 처음 연락처를 주고 받았고, 본대회가 가까워 질 때까지 (8월 초 쯤?) 한 자리가 공석이었다.

8월 대회가 가까워질 때 쯤.. 남은 팀원 구할 생각에 걱정이 되어서 M벗에게 "남은 자리에 혹시 데려올 팀원 있나요?" 라고 여쭤봤는데 다행스럽게도 M벗이 이미 같이 나갈 멤버를 포섭한 상태였다 ㅎㅎ 여기서 K벗이 합류하면서 3인이 완성 되었다.

팀이 결성된 이후로는 대회까지 시간이 얼마 안남았기 때문에 온라인으로 정기적으로 모여서 회의를 했다. 우리의 첫 회의는 8월 9일부터 시작하여 지금까지 꾸준히 이어오고 있다! 우리의 자취를 모두 기록하기 위해 M벗의 주도로 Meeting Note를 쓰고 있는데, 아직 공개하기는 부끄럽고... 내용이 많이 쌓이면 보기 전용 링크로 포트폴리오화 하여 공개할 생각이다!

준비 기간 동안 공부는 각자 알아서(?) 하기로 했다..! 내가 가장 한가했고 (나는 방학동안 자프링 개발 프로젝트 + ICPC 신촌 알고리즘 캠프 두 가지만 집중해서 진행했기 때문) M벗은 구글 인턴으로 일하시느라 바쁘셨고, K벗도 학부 연구생이라 방학에도 바쁘셨다. 그래서 대회까지 각자 가능한 여건에서 최선을 다하기로 했다. 중간에 팀 노트도 만들어볼까? 골드 문제 위주로 풀어볼까?(<<정작 까보니 골드 문제가 없었다...실화임..?)이런 이야기도 오갔는데 시간이 촉박하여 가능한 선에서 준비하기로 했다.

대회 전날에는 M벗이 나와 K벗을 구글 코리아로 초대해주었다! M벗 덕분에 구글 코리아 오피스에 가서 뷔페 뺨치는 구내식당도 가보고, 역삼역 22층 view도 구경할 수 있었다. 대면 모임은 이 날 처음이었는데 다들 관심사나 컴공 관련된 이야기를 하느라 시간 가는 줄 모르고 재밌게 점심시간을 보냈다!

구글 게스트용 신분증과 역삼역 고층 오피스뷰!!

 

2. 대회 ~ing

우리는 온라인으로 대회를 치르기로 약속해서 디스코드에 모였다. 내가 대회용으로 미리 파놓은 서버가 있었는데 거기에 문제 별로 section을 구분해 놓고 문제에 대한 이야기만 할 수 있게끔 만들었다.

내가 맨 처음으로 잡은 문제는 C F I L 이었는데 L은 풀이 방향을 제시해놓고 C F I 를 우선적으로 봤다. 대회 중에는 I가 골드급의 문제라고 생각하여 I를 제일 먼저 잡았는데, 이게 가장 큰 실수였다.

사실 격자에서 최단 경로를 구하는 알고리즘을 이산수학 시간에 배운적이 있다. 이항 계수를 이용하면 쉽게 계산할 수 있다고 배워서 맨 처음 접근을 이항 계수를 이용하는 방향으로 갔다. 이항 계수 접근으로 문제를 풀려면 이항 계수 전처리 후 포함 배제까지 했어야했는데, 수학 문제를 많이 안풀어봐서 전처리 해 본 경험이 없었고... 전처리 안하고 시도를 하다가 당연히 TLE을 한 3번 정도 했다.

내가 이렇게 삽질하는 동안... 다른 팀원들이 맡았던 (비교적 쉬운) G, H, L 번을 풀고 AC를 받아왔다. 덕분에 나는 I에 좀 더 집중할 수 있었는데 못 푼 내 잘못인 것 같다 (사실 내가 경험이 더 있었거나 수학 문제를 더 풀었으면 됐는데 내 잘못이 크다 ㅠ)

이후에 K번 문제를 읽고 아이디어를 적어놓은 후, K벗에게 구현을 부탁했다. 이 때 K벗이 I번 문제에 대한 의견을 주었는데, DP로 풀면 어떨 것 같냐고 해서 작은 희망을 품고 바로 DP로 선회했다. 격자 상 최단 경로 DP 문제를 푼 기억을 떠올리며 구현했다. 로직도 다 맞고, 작은 입력 범위에서는 아주 잘 돌아갔다. 하지만 이 문제가 플래인 이유가 여기서 나온다... 시간 제한, 메모리 제한 모두 빡빡해서 N^2 테이블 DP로는 어림도 없는 것이었다..!

당시 내 심정을 한짤으로 요약해봄

고민도 엄청 하고, C++과 Python을 두-세번 넘어다니며 바꿔보고 난리를 쳐봤지만 역부족이었다. 5틀인가 6틀 했다.이렇게 내가 삽질쇼를 하는 동안 K벗이 K번 AC를 받아왔다. 그리고 나는 인정했다. I번.. 이 문제... 골드가 아니야!!!!!!!!!  (+ 이후에 K벗이 I번 푸는 걸 도와줬는데 K벗도 마지막에 가서 이 문제를 포기한 듯 했다..)

쿨하게 인정한 후 (사실 쿨하지 못했다.. 뒤끝이 아직도 남는 I번 이다..) 팀원들한테 너무 미안해서 다른 문제로 선회했다. D번을 보다가 이거 좀 재미있는 문제라는 생각이 들었다. 관찰을 좀 해보니 row 별로 기계가 위치한 index의 min값과 max 값을 잘보고 가능한 경우와 불가능한 경우를 구분해주면서 처리하면 될 것 같았다. 

오.. 이거 구현 좀 해볼까? 하고 짜고 있었는데 M벗이 도움을 요청했다. J번 이었는데, 소인수분해 후 자릿수가 다른 여러 개의 수들을 나열하여 최댓값을 만들어내는 문제였다. 이 때에는 시간이 거의 1시간 밖에 남지 않아서 D번과 J번, 둘 중 하나를 선택해서 풀어야했다. 하나라도 더 AC를 받아야 순위를 올릴 수 있으니까... 고민하다가, M벗이 큰 수 만드는 과정만 python으로 구현해달라고 요청했다. 이 말을 듣고 내가 확실하게 할 수 있는 부분이라고 생각해서 불확실한 D번 구현을 포기하고 J번을 잡았다.

나열된 수들을 적절히 배치하여 최댓값을 만드는 과정을 C++로는 구현해 본 적이 없었다. (팀원 중 아무도 없었다. 사실 이건 백준에 따로 문제가 있다. 참고 : https://www.acmicpc.net/problem/16496) M벗이 이 문제를 Python으로 풀어야 할 것 같다고 한 이유는...! 사실 Python에 큰 수 만들기를 한 줄에 끝낼 수 있는 개꼼수 정렬 방법이 존재하기 때문이다!! (더보기 참고)

더보기

https://www.acmicpc.net/problem/16496

N = int(input())
arr = list(map(str, input().split()))
arr.sort(key=lambda x:x*10, reverse=True)
res = ''
for i in arr:
    res += i
    
if res == '0'*len(res): print(0)
else: print(res)

+ P5 백준 문제를 이런식의 개꼼수 내장 정렬함수로 해결할 수 있다. 수를 모두 str 형으로 고쳐 준 후에 10 자릿수만큼 맞춰서 내림차순으로 정렬해주는거다. 이후 str을 다 이어 붙힌 후, int 형으로 전환하기!

+ 혹시라도 이 글을 보는 파이썬 유저들은 참고해서 유용하게 쓰시기 바랍니다..ㅎㅎ

근데 J번은 수 정렬이 문제가 아니었다. 정렬은 해결 됐는데 우리가 짰던 기존 코드에서 소인수분해가 뭔가 이상하게 되고있는게 문제였다. 그 다음부턴 디버깅과의 전쟁이었다. 계속 테케를 만들어보면서 모든 상황에서 정답이 나오는지 체크하다가 어느덧 종료 시간까지 2분. 2분 남은 상황에서 우리가 만든 모든 테케가 돌아가는 코드가 완성됐고, 마지막 희망으로 제출해보았다!

채점 돌아갈 때 솔직히 심장이 너무 떨렸다.. 그렇게 돌아가다가(제발 AC 하면서 숨참았지만..ㅠㅠ) 중간에 WA를 받음과 동시에 대회가 종료됐다 ㅠㅠ 나랑 M벗이랑 너무~~ 아쉬워하다가.. 갑자기 M벗이 틀린 이유로 엣지케이스 하나를 떠올렸고, 그 엣지케이스  처리가 안되었다고 말했다. 대회가 끝나자마자 틀린게 생각나서인지, M벗이 너무 심적으로 힘들어 하셨다. 그래도 최선을 다했으니 괜찮다고 하면서 M벗을 위로하면서도, 혹시라도 내가 디버깅하면서 엣지 케이스를 생각해냈다면 분명 맞을 수 있었을거라서.. 더 미안한 마음이 들었다.

대회가 끝나니 후련하기도 하고 지치기도 하고.. 너무 어려운 문제를 잡다가 말려서 침착하지 못했던 점이 계속 아쉽다. 내 실력을 제대로 발휘 못했다는 아쉬움도 있었다. 그래도 첫 대회인만큼, 이 경험을 양분 삼아 더 성장하면 충분하다고 생각한다. "첫 술에 배부르랴?" 라는 속담은 이럴 때 쓰는거다ㅎㅎ

아쉬움이 계속 쌓이다보니 다음에는 더 잘하고 싶다는 열망이 생겼다. 이번 대회에 내 책임이 많이 느껴져서 그렇다. 내가 다른 팀원에 비해 자유시간이 더 많았으니까 팀에서 좀 더 무게중심을 잡아주는 역할을 했었어야 했는데, 그러지 못했으니까.. 수학 문제 더 풀 걸, 코포 버츄얼도 더 열심히 할 걸.. 이런 반성할 점이 많이 생겼다 ㅎㅎ

우울해하면서 스코어보드 공개 방송을 보고 있었는데, 정말 감사하게도 학교 별 1등상을 수상하게 되었다. 아무래도 쉬운 문제를 큰 페널티 없이 빨리 풀어서 그런 것 같다. 다른 이화여대 팀들도 쉬운 문제들을 잘 풀어서 AC를 받았지만 시간이나 페널티 관리 면에서 우리 팀이 좀 더 유리했던 것 같다.

+학교 별 1등상으로 여러 가지 상품이 왔다!

SUAPC 후원사인 이지스퍼블리싱의 도서 2권 / ICPC 신촌 마스코트가 3연 WA...를 받고 즐거워하며 따봉을 날리는 머그컵이 왔다.. (나름 귀엽)
ICPC 신촌의 스티커인데, 솔직히 가운데 시간을 다루는 딱지가 시강임

+ 솔직히 Python 유저로서 시간을 다루는 딱지 저거 좀 탐나는 아이템이다... 저거 보고 시간복잡도 감소 효과 부적으로 어디 붙여놔야겠다는 생각이 들었다... 야.. C++ 쓰는 너네들은 이런 감정 모를거야..

우리 벗이 제작한 goat 배경도 얻을 수 있었다!

마지막으로 이런 것도 줄 줄 몰랐는데.. 배민 상품권이 왔다. 학교 등교하는데 너무 뜬금없이 와서 오잉??? 이런 것도 준다고 하셨나..? 하고 혼란스러워 했다. 그리고 답장을 보냈다

그렇다 나는 겨울에도 나가기로 약속했다...!!

 

3. 대회 후 피드백

피드백을 해야 성장할 수 있다. 대회 후에 팀원들과 모여서 피드백 시간을 가졌다. 그 중에서 내가 작성한 셀프 피드백을 공개하겠다!

  1. 경험 부족으로 인한 문제 시간 배분 실수 -> 유연한 문제 교체로 대처하기 (plat~dia 난이도의 문제를 처음 잡았을 때 페이스가 말리지 않도록 조심)
  2. C++ 과 Python 병행 더 철저하게 준비 (문제 별 유리한 언어를 골라 자유자재로 쓸 수 있도록)
  3. 심화 알고리즘 커버 부족 (다음 대회 전까지 기본~심화 알고리즘 모두 커버할 수 있게 준비)

아무래도 경험 부족, 공부 부족이 시급한 문제이다!! 이걸 해소하려면 크고 작은 경험을 계속 쌓고 다양한 도전을 해봐야 할 것이다. 그리고 더 넓은 범위의 알고리즘을 커버함과 동시에 부족한 점들 (구현력, 수학 문제- 정수론/선형대수학/기하, 트리 등 비선형 구조 다루는 역량) 을 채울 수 있는 문제를 많이 풀어봐야 할 것이다.

아래는 이러한 피드백을 바탕으로 정한 Personal Milestones 이다.

  1. solved.ac 에서 Class 5, 6 달성 (더 많은 알고리즘 커버)
  2. Codeforces Rating 1400+ in 2023 (코포 배치 완료 + 개인 콘테스트 경험 쌓기)
  3. Codeforces Problem Set 에서 1000~1400 사이의 레이팅 문제들 꾸준히 업솔빙

 

++ 마지막 덧붙이는 말으로.. ICPC 신촌 알고리즘 캠프를 열고 서포트해주신 운영진, 강사진 분들에게 감사드린다.. 내가 너무 궁금한게 많고 물음표 살인마라서 이것저것 질문을 했는데 그 때마다 빠르고 친절한 대응을 해주셔서 기뻤다 ㅎㅎ

++ SUAPC 출제진, 검수진 분들에게도 감사드린다. 대신 B번 이름을 "기초적인 문제" 라고 지으신 이 분만 빼고..! << 당연히 장난입니다ㅎㅎ