2025년 2월 15일

프밍기 학인시 직전, 내 실력을 측정해보자는 의미로 2025 KSA Automata Winter Contest에서 빡겜을 해보자고 다짐했다.
대회가 학교에 입소한 직후 친구들과 찜질방에 가기로 한 날과 겹쳤기에, 그냥 찜질방에서 코딩을 하기로 했다.
2025 KSA Automata Winter Contest 후기
0:00
대회가 시작되었다. 난이도 오름차순으로 문제가 정렬되어있다길래 A부터 잡았다. 처음엔 소수판정 짜고 어떻게어떻게해서 7분만에 제출했는데, 바로 틀렸다. 조금 더 생각해보니 그냥 1부터 n까지 순서대로 쓰면 되길래 갈아엎고 구현해서 맞았다.
0:13 (100점, A solved)
이후에 B를 읽었다. 그리디하게 잘 구현하면 될 것 같아서 코드를 짜기 시작했으나, 풀이를 구체화하지 않은 상태로 키보드를 잡은 것이 패착이었다. 구현량이 복잡했고 (당시의 나는 코드를 간결하게 짜는 것을 잘 못했다) 인덱스 실수도 자꾸만 늘어나 말리기 시작했다. 결국 1시간 40분을 박아 4WA 후 15점을 긁고 다음 문제로 넘어갔다.
1:53 (115점, A solved, B subtask 1 solved)
C를 읽었는데, 너무 무서워보여서 D로 넘어갔다.문자열을 뒤에서부터 읽는 그리디를 빠르게 떠올려 짰으나, 계속 런타임 에러가 났다. 딕셔너리를 이용해 K, S, A의 개수를 세는 과정에서 각 글자가 0개인 경우에 키에러가 나기 때문이었다. 4WA를 받긴 했으나 그래도 침착하게 디버깅해서 AC!
2:41 (215점, A, D solved, B subtask 1 solved)
다음으로 E번을 읽었다. 어떻게 풀어야하는지 감조차 잡히지 않아서 작은 수에 대해 나이브 시뮬레이션을 먼저 짰다. 그런데 피보나치 수가 눈에 띄는 것이 아닌가? 이 관찰을 토대로 바로 구현했고, 1WA 이후 빠르게 맞췄다.
3:07 (315점, A, D, E solved, B subtask 1 solved)
F는 푼 사람도 별로 없길래 내가 손댈 수준이 아니라고 생각하고, 다시 C로 돌아가서 10점짜리 섭테를 긁었다. 그러고는 키보드를 놓고 친구들과 찜질을 즐겼다. 멍 때리고 있길래 돌아다니면서 생각을 해보기로 한 것이다. 목욕탕에 가서 놀고 있을 때쯤, 풀테 풀이가 떠오른 듯 했다. 바로 냉탕으로 들어가서 친구들에게 이거 풀이 구체화하기 전까지 폭포 맞고 있겠다고 선언한 후, 20초도 안돼서 구상을 끝내고 나왔다... 한 번에 맞췄다.
4:37 (415점, A, C, D, E solved, B subtask 1 solved)
이젠 남은 22분동안 B에 전력을 다하는 수밖에 없었다. 1500B에 달하는 괴랄한 많조분 코드와 힘겹게 씨름해보았으나, 섭테를 하나 더 긁는 정도의 성과뿐이었다.
4:44 (425점, A, C, D, E solved, B subtask 1, 2 solved)
5:00 (425점으로 종료)
스코어보드 프리즈가 풀리고 보니, 내가 164명 중 36등에 위치해있었다!

아깝게 순위상을 타는 것엔 실패했지만, 괄목할 만한 성과였다고 생각한다.
PS 입문 3달 반만의 일이었다.
2025년 3월 2일
개강 이후 놀고 술마시느라 PS를 많이 하진 않았다.
하루는 술 마시고 해장을 위해 국밥먹다가, 라면 사기 (Small) (BOJ 18185, Diamond V)의 풀이가 떠올랐다. (대체 왜??)
그날 밤 라면을 먹으며 그 문제를 풀었다.

2025년 3월 4일
그리고 마침내,

프로그래밍기초 학점인정시험 당일이 되었다.
에타에 학인시 관련 이것저것을 찾아보니 클래스 사용법, 파일 읽는 방법 정도는 알면 좋다는 정보를 얻었다.
그래서 새벽에 Loreips에게 파이썬 클래스 사용법을 간단하게 배우고, csv 파일 읽는 법을 복습한 후 시험장에 들어갔다.
문제는 총 5문제, A+ 커트라인은 100점이라고 칠판에 적혀있었다.
무조건 올솔한다는 마인드로 시험이 시작되었다.
1번은 if문과 카운터만 잘 쓸 줄알면 되는 Bronze IV 수준의 간단한 문제였다. 빠르게 AC를 받고 넘어갔다.
2번 문제는 가게에서 여러 물건을 팔고, 가격을 바꾸는 등 할 게 많은 구현문제였다. 많은 조건 분기를 하여 무지성으로 구현하고 AC 받았던걸로 기억한다.
3번도 그냥 많조분+구현. 2차원 배열 만들고 열심히 for문 돌려가면서 깡구현을 했다. 이까지는 Bronze 상위권 ~ Silver 하위권의 문제를 푸는 기분이었다.
4번 문제의 코드를 지금 다시 보니 너무 끔찍하다. 실제로 시험장에서도 매우 끔찍한 기분을 느끼며 조건 분기를 짰었다.
csv 파일에서 음료들의 여러 특징을 얻어와서 이것저것 하는 문제인데, 일단 정보량 자체가 많고 까다로운 부분도 많아서 if문 16개 박으면서 구현했다... 맞왜틀을 조금 당했지만 빠르게 디버깅에 성공하여 마지막 문제로 넘어갈 수 있었다.
여기까지 1시간 가량이 걸렸다.
대망의 마지막 문제, 그러나 여기에서 막히게 되었다.
5번은 마트료시카처럼 상자 속에 상자들이 있는 상황에서, 이 상자들을 깊이/라벨/내용물 번호 순으로 정렬하라는 문제였다.
문제는 상자가 클래스를 이용해 선언되어 있어 단순히 내장 정렬함수 딸깍을 할 수가 없었고, 어떻게 다뤄야 문제를 풀 수 있을지 감조차 잡히질 않았다. (클래스를 당일 새벽에 처음 배웠기 때문에...)
30분 동안 아무런 성과 없이 좌절하고 있었다.
문득 전날에 읽었던 에타 글에서 '알고리즘은 깊이 공부할 필요 없이 버블소트 할 줄 아는 정도면 충분하다'라는 문구가 떠올랐다.
내 사고는 '굳이 클래스에서 선언된 메소드를 쓸 필요가 없지 않나??'로 이어졌고, 문자열을 다 뜯은 후에 원하는 것만 따로 배열에 넣어서 '버블소트'를 짜기로 결심했다.
막상 파싱을 시작하니 구현량이 그리 많지도 않았다. 시간복잡도를 신경 쓸 필요가 없었기 때문에 의식의 흐름대로 코드를 계속 적어갔고...
결국 100점이 적힌 화면을 볼 수 있었다.
떨리는 손으로 문제들이 모두 제출되었는지 확인한 뒤 시험장에서 조기퇴실했다.
건물 밖에 아무도 없음을 확인하자, 신나서 미친듯이 소리를 지르고 다녔다.
지금껏 해온 노력이 의미있는 것이었음에,
내 약점을 극복했다는 증표이기에,
하면 된다는 것을 증명했기에,
너무나도 기뻤다.
잠시 뒤, 메일로 공식적인 시험 결과를 공지받았다.

마지막으로 한 분야에 이렇게까지 매진했던 적이 언제였던가.
지난 4개월동안, 내 하루 일과에서 가장 비중이 높았던 것은 코딩이었다.
밤낮 가리지 않고 미친듯이 문제 풀이를 고민했고, 파이썬 코드를 짰다.
나의 코딩 역사 #0 글에서 봤던 이 성적표를 기억하는가?

솔직히 저 성적을 받은 후로, 난 노력도 해보지 않고 그냥 코딩에 재능이 부족한 것이라 생각했다.
그래서 열심히 해도 안될까봐 두려웠다.
하지만 그걸 극복하고 미친듯이 하니까 실력도 점점 늘더라.
계속하니까 재밌어지고, 그러니까 잘하게 되고, 성장하니까 재밌어져서 계속하는 선순환이 이어졌다.
그것의 결실이라 생각한다.

학인시는 끝났다.
그러나 아직 나의 코딩은 끝나지 않았다.