후일담

[42 서울]라 피신 후기

최선을 다하는 2022. 10. 1. 22:35

    주위 친구들 중 42 서울 본과정을 하는 친구도 있었고 공부도 하면서 지원금을 받을 수 있다는 것이 매력적으로 다가와서 지원하게 되었다. 사실 저번 겨울 방학 때 참여를 하려고 했으나 체크인 미팅조차 티켓팅을 하지 못해서 기억에서 잊혀갔다. 하지만 봄학기에 친한 친구가 42 서울 피신을 통해 본과정에 합격하기도 했고 야심 차게 방학 때 혼자 자바와 스프링을 공부하려던 목표가 번아웃 때문인지 하기가 너무 싫어 8월 중순까지 매일 포스팅하던 백준 문제만 풀고 집에서 뒹굴거리기만 하는 것이 반복되어 문득 42 서울이 다시 생각이 났다. 운이 좋게도 친구의 도움으로 8기 1차 티켓팅에 성공할 수 있었다. 그렇게 피신을 시작하게 되는데.

    처음 가자마자 당황스러웠다. 안내를 해주시는 분들은 서류작성이 끝나자 이제 시작해주시면 됩니다! 라는 말과 함께 어떠한 설명도 주지 않았다. 그래도 앞에 분들이 피신을 경험하신 분들이 있어 어떤 것부터 시작하는지 비교적 빠르게 알아낼 수 있었다. 처음 두 과제는 shell 문제였다. 그래도 나름 학부과정에서 linux 환경을 접하고 활용했지만 여기에서 요구하는 대부분을 사용해본 적이 없었다. touch로 시간을 바꾼다던지 link를 조절한다던지 등 shell에서 할 수 있는 다양한 작업들이 과제로 나왔다. 경쟁심이 불타올라 리트(피신에 합격하지 못해 다시 도전하는 사람들)들과 속도를 맞춰보려 했으나 C도 아니고 비교적 생소한 shell이라 검색을 하는데 오래 걸렸다. 지금 다시 하라 그러면 두 시간이면 다 할 것 같은 것을 보면 리트분들과 속도를 맞추려던 것이 오산이었던 것 같기는 하다. 이렇게 며칠을 가다 보니 이것을 굳이 왜 해야 하나 라는 생각이 들었다. 하지만 그래도 블로그 이름처럼 최선을 다해야 한다는 생각으로 이왕 시작한 거 본과정을 다니지 않더라도 피신은 잘 마무리해보자라는 마음가짐을 가지고 다시 시작했다.

    그래도 어떤 착하신 분이 shell은 시험에도 안나오고 뒤 과제에도 안 나온다면서 과제 설명을 빠르게 해 주신 덕분에 쉽게 넘어갈 수 있었다. C를 들어가니 비교적 수월하였다 printf 가 아닌 write와 같은 unistd.h 라이브러리의 함수를 활용하였다. 문제는 되게 쉽다고 느꼈지만 그래도 몇몇 문제와 함께 쉬워 보이는 문제에서도 꼼꼼하지 못한 부분 때문에 틀리기 일수였다. C과제를 하며 가장 크게는 실력은 예외처리인 것 같다. 백준 문제에서도 거의 한 번에 통과하는 일 없이 생각나는 예외 처리하고 제출하고의 반복이었는데 이제는 조금 나아지지 않았을까 싶다.

    이렇게 문제를 풀다보니 첫 시험이 다가왔다. 시험이 되게 악명이 높았다. 처음 과제를 시작한 것처럼 시험장에 들어가서 시간이 되면 시작하세요!라는 말과 함께 일정 시간이 지난 뒤에도 시험을 시작하지 못하는 피 시너는 퇴실을 해야 한다는 말을 하셨다. 이 소식을 먼저 듣고 가서 다른 블로그들에도 명확히 적혀있는 블로그가 없었다. 수소문 끝에 어떻게 시작해야 하는지 알아갔지만 주위에 꽤 많은 분들이 영문도 모른 채 퇴실을 당하는 불상사가 있었다. 그래도 시험 자체는 쉬웠지만 atoi함수를 구현하는 문제에서 은근히 시간이 끌려 한 시간 반 정도 걸렸다. 그래도 백점은 맞았지만 너무 오래 걸린 것 같아 살짝 기분이 안 좋았다!

    시험이 끝나니 러시00 이 시작되었다. 3명이 한팀으로 과제 코드를 작성하여 나중에 본과정 사람이 와서 평가를 하는 방식이었다. 그래도 러쉬 00 은 비교적 쉬운 별 찍기 형식의 문제여서 다 같이 모여 한 시간 만에 코드를 다 짜고 해산할 수 있었다. 하지만 평가를 받기 전 ex00이라는 폴더를 만들어서 제출을 해야 했다는 것을 알게 되었고 보기 좋게 0점을 받게 되었다! 굉장히 아쉬웠다. 나중에 문제를 더 풀기 전까지 러시에서 점수를 받은 친구들 경험치를 절대 넘을 수가 없었다..

    시험은 매주 금요일마다 보았다. 두 번째 시험은 1시간 정도에 걸쳐 1문제를 제외한 문제를 풀었지만 마지막 문제를 돌려보아도 잘 나오는데 첫 번째 테스트 케이스를 절대 뚫지 못하는 현상이 일어나서 결국 풀지 못했다! ft_split 문제였는데 알고 보니 2차원 문자열들의 배열의 마지막에 nullptr을 넣어야 하는 문제였다. 시험의 많은 문제가 '~하는 함수를 작성하여 제출하세요' 여서 내가 임의로 메인을 작성하여 테스트를 할 수밖에 없었는데 채점 환경의 메인은 while(*str)과 같이 nullptr을 만나면 종료하나 보다. 이렇게 한 문제를 못 풀고 나왔더니 기분이 매우 안 좋았다..

    안 좋은 마음으로 시험을 마치고 러시01을 제대로 하겠다는 마음을 가졌다. 러쉬 문제를 금요일에 보고 토요일에 팀원들과 모여 어떻게 짤 지 이야기해보기로 하였다. 문제는 Skyscrapper 문제로 주위 띠가 주어졌을 때 유효한 입력인지 판단하고 정답 행렬을 출력하는 문제였다. 딱 보아하니 백트래킹 문제였고 결국 유효한 판을 확인하면 될 것 같았다. 그래서 토요일이 되기 전까지 어떻게 유효성 검사를 할 것에 대한 생각을 해보았고 생각해본 내용으로 코드를 40분 정도 끄적여 보았더니 유효한 판들을 모두 구할 수 있었다! 생각보다 일찍 짜서 팀원들에게 다 짰다고 말하니 놀라신 것 같았다! 다른 팀원 한분이 입력 검사를 작성해주셔 가지고 굉장히 수월하게 러시를 완료할 수 있었다. 다른 한 분은 살짝 내용을 버거워 하셔서 걱정이 되었지만 괜한 걱정이었다. 일요일날 모여 내가 코드 설명을 드리고 월요일 쯤에 잘 이해하셨는지 들어볼 생각이었는데 일요일에 갔더니 그 분이 자신이 이해한 것이 맞는 것인지 확인해달라고 하시면서 코드 리뷰를 시작하셨는데 이해를 굉장히 잘하고 설명도 야무지게 하셨다! 어떻게 된 일인지 여쭤보니 밤을 새면서까지 코드를 이해하려고 노력하셨다고 한다. 코드 리뷰가 끝나고 자신이 정리한것도 맞는지 확인해줄 수 있냐고 여쭤보셔서 확인을 해보니 내가 작성했다고 믿을 정도로 생각의 흐름을 잘 정리해두셔서 놀랐다. 이분이 피신 기간 중 가장 대단하다고 생각했던 분들 중 한분이다. 이렇게 좋은 팀원과 함께 러쉬01은 좋은 점수를 받을 수 있었다!

    러쉬를 하지 않고 시험을 보지 않는 2~3주 차는 C과제를 푸는 시간을 가졌다. 중간에 string library의 함수들을 재 구현하는 과제가 있었는데 이는 모든 것을 man과 검색을 통해 어떤 기능을 하는지 어떠한 예외가 있는지 확인하는 과정이 필요하여 굉장히 많은 재시도를 하였다. 또 malloc이 나오고 계속 segfault와 abort 가 나오는 과제가 있었는데 여러 번 재시도 끝에 -fsanitize=address 옵션을 활용하여 단 하나의 메모리 침범도 안 일어나게 고쳐 맞출 수 있었다. 이 과제를 통해 좋은 옵션을 알아간 것 같아서 좋았다! 

    세 번째 시험은 1시간 반 정도 걸려서 다 풀 수 있었다. 마지막 문제가 링크드 리스트를 통해 노드의 제거였는데  메인을 짜기 싫어 함수 부분만 작성을 하고 제출을 했는데 바로 맞아버려 기분이 되게 좋았다! 저번 시험에서 틀린 이유를 안 순간부터 시험에서 어떤 것을 물어보는지 어떤 것을 의도하는지 파악하는 실력이 많이 올라간 것 같다.

    러시 02에는 참여하지 않고 다음 주에 BSQ를 할 생각으로 개인 과제에 집중하였다. 러시 02는 분위기가 다들 참여만 하고 풀지 않을 생각을 하시는 분들이 많고 러시는 랜덤 조원이지만 BSQ는 본인이 원하는 팀원과 진행을 하기 때문에 이러한 선택을 했고 굉장히 잘한 선택이라고 생각한다. 그렇게 C10을 제외한 C11까지의 문제를 잘 마무리할 수 있었다. 비교적 간 시간이 짧아(나는 열심히 갔으나 주위 친구들이 너무 열심히 하는 것이 아니었나 생각을 해본다) C10과 그 뒤로는 풀 지 못했지만 목표한 바를 이룰 수 있어서 뿌듯했다.

    대망의 월요일 BSQ 문제를 풀기 시작했다. BSQ 문제는 Biggest Square Question으로 장애물이 있을 때 2차원 map에서 가장 큰 정사각형을 표시하는 문제였다. 알고리즘은 DP를 활용하여 굉장히 쉽게 풀 수 있었지만 문제는 파일 입출력이었다. 입력 파일 첫 줄에 (행의 개수)(빈 공간 장애물 채워 진공 간)에 대한 정보가 주어지고 다음 줄부터 map정보가 들어오는데 유효하지 않은 map을 걸러내는 것이 힘들었다. 우선 atoi를 통해 행의 개수를 받아들여야 하는데 어떠한 입력을 유효한 입력으로 해야 하는지에 대한 정보가 없어서 굉장히 난감했다. 이것도 결국 합리적인 숫자만 받아들인다는 가정을 하고 넘어가야만 했다. 그다음은 열의 개수가 주어지지 않는 다는 것이었다. 열이 갯수가 주어지지 않기 때문에 첫째 줄의 열과 다른 열이 있으면 오류라고 생각했다. 그리고 argv가 실행파일 외에 들어오지 않으면 stdin으로 입력이 들어온다고 하였는데 이를 어떻게 처리할 지도 의문이었다. 처음에는 그냥 원하는 만큼 들어오면 입력을 더 받지 않고 map을 출력했지만 시험 환경에서 stdin으로 직접 입력하지 않고 파일의 형식으로 입력이 될 것 같아 stdin도 EOF가 들어올 때까지 처리를 해줘야 한다는 판단을 하였다. 이때 학교에 있었고 마감시간이 40분밖에 남지 않아 난감했지만 코드를 잘 짠 덕인지 코드 하나만 빼면 될 것 같아 팀원에게 전화하여 이 부분만 빼볼 수 있냐고 물어보았고 빼보니 잘 돌아간다는 답을 얻어 조금 안심할 수 있었다. 결국 마감시간이 되었고 3번의 동료평가 후에 기계 평가를 받을 수 있었다. 그리고 가슴 졸이는 대기시간이 지난뒤 100점이 나왔다!! BSQ가 잔인하게도 기계평가를 하면서 재시도 기회도 없고 예외처리 역시 명확하게 알려주지 않는다. 형식 때문에 틀리신 분들도 많고 입력을 어떻게 처리해야 하는지에 대한 토론도 굉장히 많았다. 사람들의 원활한 토의를 의도한 것인지 아닌지는 모르겠지만 조금은 문제가 있지 않나라는 생각을 해보았다! 실제로 100점을 받은 팀이 굉장히 적었는데 통과한 팀을 두 팀 정도 더 본 것 같다. 주위에서도 다 맞았다고 말씀드리면 맞은 사람 처음 봤다는 반응이 많았다!

    이렇게 결국 마지막 시험까지 오게 되었다. 마지막 시험은 본래 6문제 정도 나오던 시험이 16문제로 늘고 총 8시간 동안 시험을 보는 장기전이었다. 처음 문제들은 무난하게 풀다가 10번째 문제 부근에서 나를 좌절시켰던 ft_split 문제를 다시 보게 되었다. 확신을 가지고 내 코드를 제출을 하였고 한 번만에 통과할 수 있었다. nullptr을 넣어야 한다는 것을 알기만 하고 따로 짜는 연습을 해보지는 않았는데 저번 시험에서 짠 코드보다 훨씬 깔끔하게 짰다는 느낌을 받을 수 있었다. 확실히 코딩을 많이 하다 보니 실력이 는 것 같기는 하다! 그다음도 무난하게 넘기고 마지막 문제들도 할 일이 많아졌지만 단계적으로 풀다 보니 다 풀 수 있었다. 결과적으로는 4시간 반 정도에 걸쳐 문제를 풀었고 다 맞고 나올 수가 있었다!

    마지막 시험을 끝으로 4주간의 Piscine 기간이 끝났다. 앞에서도 언급했듯 처음에는 왜 해야 하는지 모르겠다고 생각이 들었지만 끝나고 나니 한 달을 알차게 보냈다고 의미 있는 일이었다고 생각하게 되었다. 빠지는 날 없이 4주를 1시간에 걸쳐 서초 캠퍼스에 갔고 학교를 가지 않는 날에는 10시간 넘게 코딩을 하는 것이 어디서 쉽게 겪을 수 없는 경험이었던 것 같다. 또 코로나 때문에 군대 전역을 하고 1년 동안 아는 친구들만 만나고 새로운 사람과 이야기하는 것이 조금 낯설어질 때쯤 피신을 진행하여 옆에서 모르는 사람이 궁금해하는 것 알려주고 모르는 것 물어보고 동료평가를 하며 스몰토크도 하는 등 사회성이 복구를 넘어 이전보다 많이 생긴 것 같아 의미 있는 한 달이었던 것 같다! 4학년의 지식으로 쉽게 넘어가기는 했지만 조금 더 일찍 42 서울을 알고 지원해보았으면 어땠을까 하는 생각을 한다. 같이 다니던 친구 중에 2학년인 친구가 있었는데 나도 저 때 이렇게 열심히 공부했다면 지금 쯤 코딩을 몇 배 더 잘하지 않았을까라는 생각이 들기도 하였다. 여하튼 이 글을 보시고 피신을 고민하시는 분이 있다면 추천한다고 말씀드리고 싶다!!

    

'후일담' 카테고리의 다른 글

2021년 2학기 후기  (1) 2022.03.12