이미 끝난지 2주 지난 대회의 후기를 지금 올리는 이유는...
울음소리로 힘차게 아침을 시작하면 재우면서 하루가 끝남.
아무튼... 이 대회가 뭔가 마침표가 될 것 같은 느낌이었는데 끝나고도 아직 식지 않는 걸 보니 아직 아닌 것 같다. 뭔가 더 멀리 있는 무언가에 도착해야 "다 했다." 싶을 듯.
여기까지 오게 된 과정을 정리해보고 싶어서 대회 후기를 남겨본다. 언젠가 흐릿해지면 아쉬울 기억인 것 같아서...
0. 옛날 이야기
시간을 거슬러 2019년 여름. 대학원 5학기, 졸업을 앞둔 나는 지도교수님께 찾아가 논문 주제에 대해 여쭤보았다. 내가 생각한 논문 주제는 대강 '어디 고장난 게임을 디버깅하는 게임을 개발해 초등학생에게 적용하고 컴퓨팅 사고력 증진 효과를 검증'해보는 것이었다. 이게 당시에는 꽤 핫한 주제였으므로 교수님은 한 번에
하셨고 한 권의 책을 보여주셨는데 그 책이 뭐였냐면
대충 이런 책이었다. 아직 눈칫밥을 덜먹었던 그 때의 나는 주섬주섬 가방을 열고 책을 넣으려 했고 순식간에 책도둑이 되었다. 교수님은 당황한 듯한 웃음과 함께 "아니 그걸 준다는 건 아니고 그걸 공부해보라고 허허"하셨다. 나도 웃으면서 "앗 넵 ㅎㅎ" 하면서 도로 책을 꺼내놨다. 목적지 좌표가 찍혀버린 나는 그렇게 집으로 돌아가 아무 고민 없이 곧바로 "유니티" 검색해서 나온 책을 샀다.
이 책이었는데 펼쳐보니 머리가 아파오기 시작했고 한 가지 알게 된 것은 내가 주제로 정한 게임을 만들려면 C#이라는 프로그래밍 언어를 다룰 줄 알아야 한다는 것이었다. 그렇게 유니티는 잠시 제껴두고 새로운 체크포인트를 찍게 되는데 그렇게 구입한 책이
이 책이다. 뭐 책팔이 하는 것 같지만 본인 책장에 이런식으로 1/10도 읽지 않은 정보 관련 도서가 수두룩하다. 심지어 자바스크립트 공부하겠다고 산 자바 책까지 있다. 진짜 뭐하는;
하여튼 이 책의 첫 장에서 다루는 파트가 문자열 다루기였다. 이것 저것 검색하다보니 우연히 발견하게 된 것이 바로 어느 블로그의 백준 문제 풀이 글이었다. 갑자기 호기심 자극당한 성인 ADHD의 두뇌는 백준 온라인저지에 들어가보게 되었고
그렇게 4년 전 봄, 개 구데기같은 코드로 Hello World!를 띄우며 백준에서 첫 번째 맞았습니다!!를 받게 된다. 고등학교 졸업 이후, 수학 문제 번호에 빨간 동그라미 치는 낙을 잃었던 나에게 이건 거의 마약이었다.
브론즈 5 문제에서 틀렸습니다 와 컴파일 에러를 겁나 띄우면서 C# 문법을 조금씩 익혀 나갔고 문자열 다루기를 넘어서는 새로운 영역의 문제를 만나는 시점에서 나의 목적지는 완전히 버려진 땅이 되었다.(아직도 안함) 그렇게 의문의 이산수학 뜻밖의 여정이 시작되었다.
그래프 이론에서 다익스트라 알고리즘을 처음 배운 순간 "와 개쩐다."하는 그 쾌감이 아직도 잊혀지지 않는다. 지금도 여기에 빠져서 사는 이유는 이걸로 정리되는 것 같다. "와"를 느끼고 싶어서 이 커리어를 가장한 취미생활을 계속 이어가고 있다. 결국 논문은 시작도 하지 못하고 2020년 3월, 입대를 하고 마는데...
선임 눈치 살피다 싸지방에 겨우 발붙이기 시작한 나는 컴파일러부터 찾아봤다. 하지만 군용망에서는 비인가 프로그램 사용을 할 수가 없다고? OS가 윈도우가 아니고 무슨 리눅스에다 비주얼스튜디오는 설치가 아예 안되는 컴이었다. "아 그럼 메모장에다 작성하고 넷프레임워크로 컴파일하자" 해서 메모장을 컴파일하니 실행이 된다. 와!! 이렇게 불편할 수가! 결국 문제풀이는 점점 뜸해지고 나는 무슨 콘솔창으로 야구게임이랑 스네이크를 만들기 시작했다. 그 땐 그게 그렇게 재밌었다. 포병야구 이스터에그까지 넣어서 기똥찬 게임을 세 개 만들었다.
그렇게 싸지방 오른쪽 구석 자리 컴에 게임을 하나 만들어두면 연등신청한 선임들이 갖고 놀았다. 그러다 나중에 정보장교 선탑으로 운행 나가다가 듣게 된 사실, "비인가 프로그램 돌리다 걸리면 휴가 짤린다."
아니 코로나 군번이라 휴가 뭐 안짤려도 나갈 수 없는 상황이었지만 그래도 손해보긴 싫으니 쫄려서 게임은 싹 다 치우게 됐다. 많이 아쉬웠지만 휴가를 버리면서 즐길 수는 없으니 어쩌랴. 암튼 그렇게 군대에서 게임 만들기는 끝나나 싶었으나, 그 때 찾게 된 게 repl.it이었다. 이게 엄청 간편하다는 걸 알아서 이 때 부터는 다시 백준 문제풀이로 돌아갔다. 운전병이라 졸면 큰일나서 연등 신청은 못하고 개인정비시간에 싸지방에서 뽑은 백준 문제를 수첩에 접어두고 레이더 포대 운행 나갈 때마다 산 쳐다보면서 풀이 생각하고 돌아와서 제출했다. 이 때 solved.ac 골드3 찍었던 것 같다. 그 뒤로 말년 되면서 점점 일이 늘어가고(분대장+버스운전+1호차+부식차량+대대또래상담+병영도서관리+성악병 이었음) 싸지방은 아예 갈 시간이 사라져버렸다. 아니 실은 개인정비시간에 못 놀면 진짜 쉴 시간 아예 없어져서 어쩔 수 없었다. 말년의 개인정비시간은 지포스 나우로 데드셀만 했던 것 같다.
그리고 전역. 백준은 기억에서 잊혀진지 꽤 오래됐고 그렇게 복직한 나는 2022년이 되면서 어떤 프로젝트를 시작한다. 5학년 담임을 맡고 있던 당시, 포켓몬 소드/실드가 발매되고 한창 포켓몬 뽕이 찬 남자애들을 어떡하면 지배할 수 있을까? 고민을 하던 나는 솔깃한 교육자료를 발견했는데
포켓몬 픽셀아트. 애들이 환장하는 것이 아닌가? "아 이거다." 싶었던 나는 "실존(아님)하는 905(당시 905번까지였다.)마리의 모든 포켓몬의 픽셀아트를 만들 수는 없을까?"라는 고민에 빠졌고 예전에 깔짝였던 C#이 생각났다. 분명 그 C# 뭐시기 책에 콘솔 말고 윈도우 프로그램 같은 걸 만드는 방법이 있었다.(Winform 얘기임) 먼지 쌓여가던 책을 다시 꺼내서 보니 윈폼 설명이 너무 부실한 거 아닌가. 그래서 (또) 책을 (또) 다시 (또) 샀다.
하나하나 따라해보니 정작 내가 원하는 기능은 없었다. 결국
형님들의 힘을 빌려 완성한 프로그램이
이거였다. 교사 커뮤에서 대히트를 친 나는 내 삶의 의미를 되찾은 기분이었지만 "다음엔 뭐하지"에 대한 답이 나오지 않았다. "어 나 분명 논문 쓰다가 온 것 같은데... 아 맞다 백준! (왜 거기로?)"
다시 찾은 백준에서 문제를 풀며 블로그질을 시작했다. 처음에는 서로 일기쓰며 근황 공유하던 네이버 블로그 이웃들에게 외계어를 보여주는 만행을 저질러 버렸으나 그 직후에 쓴 일기에서 공감 떡락하는 현상을 보고는 "아 이거 아니구나"하며 티스토리로 이사왔다. 이쯤부터 백준 오픈 콘테스트에도 참가하기 시작했다. 대회의 맛을 알아버린 성인 ADHD.
그리고 그 다음해 가을. 공람창에서 신기한 무언가를 발견했다.
1. 2023 GTPC
2023 GTPC 참가 신청 공문이 눈에 띄었다. 나는 공람창에서 항상 "디지털, SW, 코딩, 정보, 영재교육, 과학, 천문, 일본" 등의 키워드가 아니면 싹 다 치우기 때문에 "2023 경기교사 프로그래밍 챌린지 참가 신청 - 경기도교육청미래과학교육원" 이라는 제목은 너무 눈에 띄었다. 초등교사 희귀종인 광주교대 수리 가형 이과출신은 경기도에서 친구가 아무도 없었기 때문에 팀 참가는 엄두도 못냈고 극 내향인 성격이지만 용기를 내서 주최측이 팀 짜주는 개인 참가를 신청했다.
그렇게 시간은 흐르고 참가자 명단이 떴을 때 학교 이름을 보면서 약간 좌절했다. 경기과학고, 소프트웨어 마이스터고 등등 살벌해보이는 중등 정보교사들이 대거 참가하는 듯 했다. "나 따위가 낄 곳이 있을까?"
근데 의외로 2등을 먹었다. 뭐지? 초반에는 스코어보드 신경 안쓰고 '내 갈 길 가련다' 마인드로 쭉 밀었는데 E1 쯤 풀면서 스크린 보니까 첨보는 분들과 함께하는 우리 팀이 맨 위에 걸려있는거 아닌가. "?" 하지만 대회의 형식을 이해하지 못한 나는 패널티를 줄여야 한다는 걸 몰랐고 시간 패널티 펑펑 처맞으면서 장렬하게 2등을 차지했다. 완전 의외의 결과에 치사량의 도파민을 맞아버린 두뇌는 돌아버렸고 우리 팀원 선생님 한 분이 "1등 팀 선생님이랑 숙소 같은 방이었는데 이런 거 공부하는 교사 스터디가 있대요."라고 하자 MBTI 리셋해서 그대로 팀 초코 선생님께 달려갔다. 어떻게 한 건지 모르겠는 연락처 교환을 끝내고 집에 와서 그 실체를 알게 된 교사 스터디는 이미 이전에 잠깐 활동했던 쪼랩의 스터디였다. 그렇게 코알라 스터디에서 GTPC 우승을 위한 수련이 시작됐다.
그 이후의 과정은 이미 이 티스토리에 다 들어있어서 뭐 더 적을 이야기는 없고, 2023 GTPC를 계기로 이쪽 분야에서는 "cpp와 python이 압도적이구나"를 깨달은 나는 C#을 사용하지 않게 되었다. 그렇게 초등교사로는 정말 쓰잘데기 하나 없는 "세그먼트 트리, 네트워크 플로우, LIS, convex hull" 등의 이론들을 배우며 1년이 지났다. 드디어 2024 GTPC 참가 신청 공문이 떴다. 그 전에 출제위원 제안을 받았지만 우승 한 번은 꼭 해보고 싶어서 고사했다. 아기 냅두고 장거리 출장 왔다갔다 하는 게 좀 부담이었지만 총 2회 왕복 8시간의 운전을 하면서 꾸역꾸역 참가했다. 팀도 같은 학교 근무하는 선생님이랑 타 지역 선생님 한 분씩 껴서 3인 팀 만들어 신청했다.
2. 2024 GTPC
밤 늦게 아기 재우고 새벽에 일어나서 고속도로 입구 휴게소 던킨 커피를 마시며 출발.
다행히 토요일 아침에는 길이 막히지 않아 1시간 안쪽으로 빠르게 도착할 수 있었다. 도착하자마자 아침 먹고 대회장으로 입장. 이번 대회는 지난 대회보다 좀 더 작은 공간에서 진행됐다. 사정을 듣고 보니 중등 정보 선생님들이 필수 연수 일정과 겹치는 바람에 많이 참여하지 못했다고 하더라.
풍선들 보면서 각오를 다지고 착석. 이번에는
이거 없더라. 뭔가 밋밋한 시작으로 빠르게 0번 부터 처리. 나는 뒤에서부터 팀원 선생님들은 앞에서부터 시작했다. 확실히 이전과는 다르게 문제를 보면 어떤 식으로 접근해야 할지 떠올리기 쉬웠다.
처음으로 부딪힌 난관은 C번 수직 마라톤 문제. 많은(?) 조건 분기로 케이스 분리만 적절하게 해주면 쉽게 풀리는 문제였지만 다른 팀에서 먼저 푸는 거 보고 급해져서 머리가 그냥 하얘졌다. 나중에 애프터 채점서버 열리고 다시 해보니까 허무하게 쉽게 풀리더라.
F번 문제는 LIS였다. 약간 설명이 애매해서 "이상"인지 "초과"인지 명시해달라고 해서 "이상"이라고 답변을 받았으나 실제로 제출한 코드는 "초과" LIS에서 AC를 띄웠다. 뭐지?
대회 종료를 3시간 남기고 마지막 문제인 F번 정답이 등장하자 주최측에서 추가 문제를 띄워주셨다. 둘 다 쉽지 않았는데 여기서 팀플 없었으면 바로 나가리였을 거다. 두 분 같이 해주셔서 진짜로 천만다행.
S1은 쌩노가다 브루트포스였다. 9중 for문으로 9개 칸의 쌓기나무 높이를 모두 탐색해 조건과 일치 여부를 판별했다. 팀원 선생님의 가장 큰 기여는 "위에서 본 모습"으로 탐색 횟수를 크게 줄여주셨다는 것. 이거 아니었으면 시간초과 뜨고 못 풀었을 것 같다.
S2는 문자열 처리였는데 슬라이딩 윈도우였다. 100,000이라는 길이의 문자열에서 O(n^2)은 안된다는 생각으로 최근에 공부한 트라이까지 동원한 솔루션이 나왔지만 모두 시간복잡도에서 불가능하다는 판단. 팀원 선생님이 직관적으로 떠올린 코드를 제출해봤지만 TLE가 떴다. 혹시나 해서 문자열 처리를 슬라이싱에서 인덱싱으로 바꿔보니 놀랍게도 AC.
종료 25분 정도를 남기고 올솔브 하며 대회 종료.
옆 테이블에 있던 팀이 2등이었는데 또 엄청난 실력자였다. 삐끗했으면 또 2등하고 홍진호 될 뻔... 홀가분하게 우승하고 내년에 출제진으로 낼 문제 뭐가 좋을지 간간히 고민하고 있다.
인터뷰까지 끝내고 왔는데 참여를 독려하는 말을 해달라고 하셔서 살짝 당황했지만 어찌저찌 뭐라뭐라 교실에서 터득한 풍둔 아가리술로 잘 봉합하고 온 것 같다. 너무 재밌었고 혹시 출제진 이후에 다시 참가자로 참여할 수 있게 되면 즐겜하러 가보고 싶다.