오늘 동탄에 가서 SW역량테스트를 치르고 왔다. 우선 결론적으로는 0솔브로, 탈락을 예감하고 있는 상태이다.
서류 지원부터 코테까지 보게 되면서 느낀 점들을 잊지 않기 위해 쓴다. 다소 TMI 글이 될 수 있겠다.
지원 동기
이제 7학기에 돌입하여, 본격적으로 취업에 대해 고민하는 시점이 왔다. 하지만 나는 막학기 교환학생으로 인해 추가학기가 확정인 상태라
아직 취준에 대해 크게 신경쓰지는 않고 3학년의 마음가짐으로 (?) 살고 있다.
그러던 와중 삼성 공채가 뜨게 되었는데, 대학생 인턴 모집이 눈에 들어왔다.
졸업예정자여야 하는 공채와 달리, 대학생 인턴은 지원 자격도 되고 이번 여름 방학에 6주정도 짧게 인턴 생활을 한다고 한다. 교환을 가는 시간과도 겹치지 않아 나에게 좋은 조건이었다.
아직 취준할 준비가 안되어 있는 상태여서 고민을 많이 했는데, 이번 학기가 인턴을 지원할 수 있는 마지막 기회이고 (인턴은 1년에 한번만 뽑는다고 한다.) 무엇보다 합격하면 더할나위 없이 좋지만, 불합격하더라도 1년 미리 채용 과정을 경험해볼 수 있다는 점에서 써서 나쁠 건 없다고 생각했다.
서류 지원을 하면서
서류 지원을 하면서도 느낀 점이 많았다. 일단 생각보다 스트레스를 많이 받았다. 벌써부터 이러면 나중에 본격적으로 취준 시즌이 되었을 때가 걱정이 될 정도다. 지원서를 어떻게 써야할지도 막막하고, 대기업이라 그런지 SW개발 직무도 너무나도 다양해서 어디를 지원해야할지조차 막막했다. 계속 신경만 쓰고 제대로 쓰지 못하다가 마감날이 되어서야 직무를 정하고 학교 수업을 들으며(..) 부랴부랴 쓰게 되었다.
직무를 정하면서 느낀 점은, 내가 하고 싶은 곳보다는 지금까지 내가 한 활동과 엮을 수 있는 곳을 먼저 써야 한다는 것이다.
처음에는 삼성 리서치로 지원을 하려고 했다. 나는 현재 딥러닝 분야에 관심이 있어 여러가지 발을 걸치고 있는데, 관심이 생긴지 얼마 안되었으며 아직 나의 관심을 어필할 만한 제대로 된 프로젝트도 존재하지 않았다. 하다못해 관련 수업도 이번 학기에 처음 듣고 있다. 활동이 없는데 지원서를 쓰려고 하니 스트레스가 이만저만이 아니었다. 그래서 결국 수업 과제랑 연결해볼 수 있는 부서로 바꿔서 지원하게 되었다.
또한 이러한 서류는 미리미리 써야 한다는 것이다. 막판에 부랴부랴 쓰다가 마감 3분 전에서야 제출했고, 최대한 글자 수를 꽉꽉 채워서 제출하려고 했으나 가장 글자 수가 길었던 (1600자. 아마 2번이었던 것 같다) 문항을 반만 써서 제출하였다. 그래서 서류 합격에 큰 기대를 하지 않았다. 그리고 코테 공부도 하지 않았다.
그러던 중 4월 3일, 자정에 우연히 메일함에 들어갔다가 삼성에서 메일이 온 것을 보았다.
얼떨결에 서류를 합격했다. 지원서를 개판으로 썼는데 일단 합격시켜줘서 고마웠다. 근데 역량테스트가 6일 후였다.. 월요일 자정이 지나서 보았으니 사실상 5일 남은 셈이었다.
나는 나름 알고리즘 동아리에도 있었고, 여러 스터디를 시도해보았지만 흥미를 느끼지 못하고 꾸준히 하지는 못했다. 백준 문제를 안푼지 일년이 넘은 상태였고, 그마저도 실버 3정도나 조금씩 푸는 정도였다.
그리고 곧 중간고사 기간이고, 학교 과제도 있고, 개인적으로 하는 프로젝트도 있고, 코세라 강의도 들어야 하고, 할 일이 너무 많은 상황이라 코테를 준비를 해야할지 말아야할지 고민이 들었다.
삼성 유형을 찾아보니 어느정도 정형화가 되어있고 알고리즘은 DFS, BFS 정도로 나오고 보통 구현/시뮬레이션 위주로 나온다고 한다. 그정도면 불가능하지는 않지않을까..?라는 생각으로 남은 날동안 최선을 다해보기로 했다. 코테 준비 해야지해야지하면서도 죽어도 안했는데, 당장 5일 뒤에 본다니까 이거 핑계삼아 공부해볼 수 있겠다는 생각이 들었다. 무엇보다도 코테날에는 거의 하루를 몽땅 투자해서 시험을 치뤄야 할텐데, 준비를 안하고 가면 너무 시간이 아까울 것 같다는 생각이 들었다.
코테를 준비하며
학교 수업이 많은 하루를 제외하고, 4일 간 서류합격한 42동료들끼리 모여서 하루종일 기출을 풀었다. 그래봤자 4일이지만, 매일 10시간 이상은 투자했던 것 같다. 하루에 10시간을 투자해도 생각보다 많은 문제를 풀지는 못했다. 많이 풀어봤자 4문제였고, 적게 푼날은 2~3문제이기도 했다.
총 4일동안 14문제를 풀고 시험을 치르러 갔다. (기출은 12문제) 풀기 전에 웬만하면 답을 보지는 않았고, 보통 푼 다음에 최적화를 생각보면서 다른 사람들의 코드를 읽어보았다. 적게 풀고 문제 하나하나에 긴 시간을 투자하는게 맞는지, 짧게 더 많은 문제를 아이디어만 생각하고 넘어가는게 좋았을지는 아직 잘 모르겠다. 나는 직접 풀면서 부딪히지 않으면 모르는 것도 안다고 착각하고 넘어갈 수 있어서 적은 문제여도 긴 시간을 투자하였다. 다시 생각해도 아쉬운 점은 10문제쯤 풀었을 때 대강 감이 잡혀서, 30문제정도 풀었으면 정말 해볼만하지않았을까라는 생각이 든다. 기간이 한달만 더 주어졌더라면.. 사실 이런건 방학때 했어야 했다.
처음에 구슬탈출2부터 시도해봤는데, 나한테 너무 어려웠다. 그래서 기본적인 DFS, BFS 문제를 익힐 겸 다음 문제를 풀었다.
- 1697(숨박꼭질)
- 1012(유기농 배추)
그 다음에는 기출 문제 중에서도 쉬운 문제를 선별해놓은 문제집을 찾아서 이것들을 하나씩 풀어갔다.
문제집: 삼성 역테를 처음 준비하며 멘붕이 온다면 (suntouch)
www.acmicpc.net
시간상 낚시왕 빼고는 모두 풀었다. 구현 문제 특성상 열심히 생각하면 어쨌든 풀만해서 성취감 있고 재밌었다. 다만 이거를 빨리 풀고 최신 기출로 넘어가려고 했는데, 생각보다 문제 하나하나가 호락호락하지는 않았다. 각 문제당 아주 짧게는 한시간부터 길게는 4시간 넘게 붙잡은 문제들도 있었다.
코드트리의 최신 삼성 기출 문제들이 있다고 해서, 시험 전날에 작년 하반기 문제였던 코드트리 빵을 풀어보았다.
결국은 통과했지만, 진짜 시간 많이 걸렸다. 거의 6시간 정도 걸린 것 같다. 풀고 나면 별 것 아닌데, 풀면서 정말 자괴감 많이 들었다. 지금까지 푼 것들이 15년도 즈음 하는 과거 문제였는데, 큰 유형자체는 다르지 않지만, 훨씬 요구하는 사항들이나 조건들이 복잡해짐을 느꼈다.
문제를 풀면서 나의 접근 방식과 코드, 최적화 방안은 다음과 같이 노션으로 준비했다. 시간이 된다면 여기에도 정리해서 올려보고자 한다.
시험 당일
아침에 일어났는데 기분이 싱숭생숭했다. 아직 나는 대학원에 진학할지 취업할지도 결정하지 못해서 진로 고민을 하면서 인재개발원에 왔다. 시설이 정말 좋아서 감탄하면서 들어갔다. 나는 오후반이었고 4시간동안 시험을 치뤘다. 맥과 vscode에 익숙해져 있어서 윈도우 환경이 많이 어색했지만, 질의응답에 자세히 남겨져있어서 비쥬얼 스튜디오를 쓰는데 큰 무리는 없었다.
문제 2번은 보지도 않았고, 1번 문제를 4시간동안 풀었다. 모두가 아는 시뮬레이션 문제였는데, 구현해야 할 사항이 많고 문제가 정말 길었다. 어차피 한 문제만 풀 생각이었기때문에 바로 코드를 치려고 하기보다는, 최대한 설계를 자세하게 하고 생각을 많이 한다음 코드를 짜고자 하였다. 솔직히 처음에 문제를 보았을 때는 할만하다고 생각하고 웃으면서 풀었다. 문제를 다 설명할 수는 없지만, 크게 이동과 회전으로 이루어져있고, 모든 플레이어가 탈출로 나가거나 주어진 시간이 지나면 하나의 테스트 케이스가 종료되는 방식이다.
처음 보았을 때 회전이 더 까다로워 보여서 회전을 먼저 n*n배열에 대해 구현하였고, 그 다음에 문제를 하나씩 구현해나갔다. for문으로 시작 인덱스와 끝 인덱스를 갱신시켜나가면서, 각 테두리에 대해 이동시키는 방식으로 했다. 지금 생각해보면 그냥 말그대로 평행이동 시키면 되는데, 회전 배열을 하나하나 그리면서 규칙을 발견하려고 했었다..? 왜이렇게 복잡하게 생각했을까.. 회전은 특히 근래 문제에 많이 있었던 것 같은데 최근 기출을 많이 안풀어본게 역시 아쉽다. 한시간쯤 지났을 때 회전을 구현하고 신나서 차근차근 입력부터 시작하였다.
이동시키는 것은 알고리즘 쓰는 것이 아니라 말 그대로 구현이라 그리 어렵지 않아서 무사히 짰고, 잘 이동하는 것까지 확인했다. 이동과 회전을 대강 구현해놓았으니 솔브가 눈 앞에 보이는 것 같았다.
그런데 플레이어와 출구를 포함하는 최소 정사각형을 구하는 부분에서 머리가 꼬였다. 이건 DP인가? BFS인가? 잠시 혼란이 찾아왔다. 뭘 해도 엣지케이스가 있을 것 같았다. 결국은 중첩 for문을 사용하여 엄청나게 복잡하게 구현했다.
내가 구현한 방식은 다음과 같다. 우선 플레이어를 for문으로 돌면서 출구와의 길이를 탐색하고, 가장 적은 길이를 저장해주었다.
map에 대해 전부 돌면서 해당 길이만큼의 정사각형을 전부 만들어주었고, 그 안에 출구와 플레이어 위치가 있으면 벗어나도록 했다.
너무 복잡하고 단순무식한, 부끄러운 방법이다..
지금 든 생각으로는 그냥 최소 길이의 정사각형을 구하고 정사각형 안에 무조건 한칸은 출구가 있도록 하였으면 시간복잡도가 N*N안에는 해결되었을 거라는 생각이 든다. 이 방법도 효율적인지는 모르겠으나.. 위 방법은 효율이 끔찍하다.
이렇게 머리가 복잡하게 꼬이니 최소 정사각형을 구하는 데에 시간을 너무 많이 들였다. 시간 초과가 날 지도 모르지만 어쨌든 구현했다는 생각에 얼른 이후 구현을 하려고 하였다. 그런데 배열 전체에 대해 회전을 적용시킨 코드에서 특정 사각형만큼 회전을 적용시키도록 변환하는 과정에서 어딘가 인덱스 실수를 하였는지 올바른 값이 나오지 않았다. 사실 별 거는 아니었을 텐데 이미 위 코드를 구현하다 패닉이 와서 제대로 발견하지 못했다. 그렇게 시간은 마법같이 4시간이 지났고, 끝내 제출하지 못했다.
나오면서 너무 기분이 안좋았다. 문제 자체는 그리 어렵지 않았고, 하나하나는 내가 공부했던 것들을 활용하면 충분히 풀 수 있었을 것이기 때문이다. 내가 왜 풀지 못하였을까 생각해보았는데, 역시 절대적인 문제 풀이 양의 부족인 것 같다. 문제의 호흡이 긴 만큼 충분히 설계를 하고 생각을 한 다음 문제를 푸는 것은 중요하지만, 시간 안에 확실하게 구현하기 위해서는 어떤 방식으로 풀지 결정하는 시간이 빨라야 한다. 아직 나는 그것이 너무 느렸던 것 같다.
이렇게 나의 첫 인턴 도전이 끝났다. 이번이 지원서써보는 것도 처음이었고, 코테 준비도 처음이었다.
4일동안 했던 과정이 허무하기도 하고.. 내가 4일, 시험을 포함하여 5일동안 할 수 있었던 다른 일들을 생각하면 우울해지기도 하다.
하지만 한편으로는 4일 공부한 거 같고 코테를 붙으려고 하는 것도 욕심이긴 하다. 벼락치기로라도 코테를 공부해본 경험 + 취준의 슬픔을 1년 미리 경험해 본 것만으로도 충분히 가치있는 일주일이었다고 생각하려고 한다.
이번에 공부해보면서 알고리즘 풀이의 성취감과 재미를 조금이나마 느꼈다. 앞으로는 정말로 열심히 공부해서, 적어도 코테가 취업의 발목을 잡을 일은 없도록 하고 싶다.