Dev/Algorithm

삼성전자 SW 검정 Pro 합격 후기

HJ Works 2021. 6. 22. 18:05

소비 자원

응시 기간 고통기간: 2021. 3.20 ~ 2021.6.19 (90일)
사용 자원: A4 68매 + @ + @ + @

계기

난 2016년에 Advanced 등급을 획득했다. 이후 연 1회정도로, 요즘은 알고리즘 풀이를 어떻게 하나 궁금한 마음에 가끔 시험장에 가 보는 정도였다. 그러다가, 올해 들어 이런저런 이유들로 본격적으로 시험 준비를 하게 되었다.
시험에 집중하게 된 계기가 몇가지 있다. 일단, 회사에서 certi 보유가 강제화 되는 분위기가 형성된 것이다. 모두가 시험에 합격해야 하는 것은 아닌 듯 하나 누군가는 해야 될 것 같았고, 어차피 할거면 내가 하자는 마음으로 시작했다. 특히 올해는 certi의 의무화가 크게 느껴진 해다. 왠만한 업무보다 시험이 우선시 되었고, 두달에 한번 치는 시험이 한달에 두번도 넘게 칠 수 있게 되었다. 근무도 시험이 우선이고, 내부 스터디가 양성화 되었다. "강제는 아니다" 라고 했지만, 업무보다 시험이 우선이 된 시점에서 "올해 못 붙으면 어쩌지?" 라는 불안함이 더 나를 채찍질 했다.

또 다른 큰 계기는 외부 TF에 참여했을 때가 영향이 컸다. TF 참여 기간 동안 개발 업무에서 벗어난 상황이기에 상대적으로 업무보다 시험 준비가 나았었다. 하지만 상황보다 더욱 동기를 크게 만든 것은, TF 활동에서 만난 분들이 다들 S/W적으로 면면이 훌륭하신 분들이었는데, 이 분들 대부분이 certi를 보유한 분들이었다. Certi와 업무 간 연관성은 크지 않기에 의미가 없는 시험이다 라는 의견이 아마도 주류였던 데 비해, 내가 접한 많은 certi 보유자들을 보며 느낀 것은, 나도 저들과 같은 선에 서고싶다는 생각이 더욱 들었다.

특징

Certi를 위해서는 일반 알고리즘 시험과는 다른 몇가지 준비를 해야 한다.

1. STL을 쓰지 않는다.

회사 시험은 백준<https://www.acmicpc.net> 과 같이 순수한 알고리즘적 역량으로만 평가하진 않는다. 문제 이해와, 설계를 모두 포함해서 봐야 하고, <hash>, <queue>, <tree>, <vector> 같은 표준 라이브러리의 사용이 불가능하다. 반대로, 이런 코드들을 어떻게 설계해야 하는지에 대해서 reference가 있고, 일정 부분은 이 코드에서 가져다 써야 시간 절약을 할 수 있다.

2. 시험은 4시간, 문제는 하나

정보 올림피아드나, 타 회사 입사 시험과는 다른 느낌이다. 일례로, 프로그래머스에서 카카오 입사 시험 예비? 같은걸 준비할 때 5시간동안 7문제를 풀게 된다고 한다. 한국 정보 올림피아드도 유사한 방식이다. 총 180분 동안 여러개의 문제를 풀게 된다.
반면, Certi는 4시간동안 한개의 문제를 푼다. 유형이 크게 한번 바뀌었는데, 일전에는 좀 더 보통의 알고리즘 문제같았던 반면, 지금은 몇가지 함수가 정의되어 있고 이 함수들이 유기적으로 작동하면서 오답을 내지 말아야 한다.

1, 2를 종합했을 때 "정답이 있는 논술 문제" 에 가깝다는 것이 내 생각이다. 게다가 100점을 받아야 통과하는 시험이다 보니, 4시간동안 문제를 풀 수 있도록 정신적으로도 준비가 필요하게 된다.

3. 응시 환경의 변화

2019년 까지는, 시험장에 가서 응시했다. 환경은 좋다고 볼 수 없던게, 23인치 FHD 모니터와 데스크탑 구매시 번들로 딸려오는 키보드/마우스로 시험을 쳐야 했다. 당시는 다들 동일한 환경에서 쳤으니 어쩌면 환경 자체가 문제 해결 조건이었는지도 모르겠다. 그리고 그 와중에도, 코딩 자체에 어떤 감정을 느끼는 분들은 키보드 마우스를 직접 공수해서 시험을 쳤었다.
2020년 코로나 이후, 한동안 중단되었던 시험은 온라인 응시가 가능하게 되었다. 이제 집에 있는 자원들을 최대한 활용 가능하게 되었다. 무선 기계식이나 무접점 키보드를 쓰고, 무선 마우스도 쓰고, 심지어는 집에서 32인치 UHD 모니터로 문제 화면과 Visual Studio를 동시에 띄워놓고 칠 수 있게 되었다. 이제 환경이 열악하다는 건 더이상 통하지 않게 된 것이다.

합격하기까지

Certi 합격을 위해서 내게 필요한 무기는 세가지였다. 이 세가지는 각각 "문제해결 전략 이해", "환경에 적응하기", "시간에 적응하기" 이다.

문제에 적응하기

일단, 문제해결 전략을 여러가지로 숙지해야 한다. 기본적인 알고리즘 리마인드를 한 뒤, 회사 시험에서 자주 나오는 유형을 바탕으로 한 알고리즘도 추가로 이해하고 있어야 한다. Trie, Hash, Linked List는 기계적으로 작성하거나 레퍼런스 코드에서 가져올 수 있어야 한다.
응시 초기에 한번 붙을 수 있는 기회가 있었다. 설계와 자료구조가 완벽했다고 생각했다. 하지만 실제로 문제가 요구하는 것은 Trie를 활용한 문제 풀이였고, 이 날 요령껏 "Hash" 를 이용해서 접근하였으나 여전히 시간을 크게 줄일 수 없었다. 합격한 시점에서 생각해 보면, 현재 스타일의 Certi 풀이 방법을 너무 모르고 접근했었다.

또한, 정말 중요한 것 중 하나는 문제 유형을 몇가지로 분류한 후 반복적으로 푸는 것이다. 내 경우, 연습 문제를 시간 내 푼 적이 거의 없으며, 푼다 하더라도 예제의 TC를 다 맞추지 못했다. 하지만 반복해서 문제를 어떻게 접근할 지 고민하는 것 만으로도 큰 도움이 되었다. 동시에, 문제를 다양하게 읽으면서 어떤 식으로 접근할 지 빠르게 파악해야 한다. 총 4시간을 나눠서 풀어야 하는데, 문제를 이해하는 데 시간조차도 최대한 줄여야 하는 것이다.

환경에 적응하기

다른 문제는 환경에 적응하는 것이었다. 현행 시험 체계에서 붙는 방법은 두가지가 있다. 1) 회사 고사장에 가서 시험 응시, 2) 집에서 시험 응시이다. 1의 경우, 시험에 집중하는 환경 자체는 훨씬 유리하지만  인프라가 열악하다. 반면 원격 응시를 하게 되면 인프라를 매우 유리하게 가져올 수 있으나, 1)집이 응시 가능한 환경이어야 하며, 2)집의 인프라가 회사 시험장보다 좋아야 한다. 당장 노트북만으로 응시해야하는 지원자라면, 회사에서 시험을 치는 것이 여러모로 좋을 것이다.
집에서 충분히 좋은 환경에서 응시할 수 있다면, 이번에는 모니터 전체에 대한 perspective 구성에 대해서도 고민해야 한다. 4k 모니터를 쓰고 있으나, virtual desktop 환경 상 4k 를 100% 활용할 수는 없었고, 다음과 같이 세팅했다.

소스코드를 에디터를 가운데 두고, 조사식을 오른쪽으로 두개 둔 상태이며, 에러 내역을 확인하기 위해 output창을 작게 남겨놓은 것이다. 그리고 Quiz content 도 켜 놓아서 문제를 계속 확인할 수 있도록 구성했다.

시간에 적응하기

그리고 마지막으로,  시간에 대한 적응을 해야 한다. 4시간 이상 연속해서 쳐야 하는 시험이기 때문에 연속해서 집중하는 것은 매우 어려운 일이고, 어느시간에 휴식을 할 지를 정해야 한다. 처음 시험을 시작했을 때는 3시간을 연속으로 풀었다. 이렇게 하면, 당 부족에서 이어지는 집중력 저하에 직접적으로 노출된다. Certi는 최적화 까지 고려 대상이기에, 구현이 끝나더라도 남는 시간을 활용해서 최적화를 수행해야 한다.

합격 후기 및 출제 위원 등의 강의를 잘 보면, 시간을 매우 효율적으로 분배해서 사용할 것을 권고한다. "1시간 동안 문제 이해" - "2시간동안 코딩" - "1시간동안 디버깅 및 최적화" 이다. 나는 여기에 리프레싱 시간을 2시간 경과 시점에 활용했다. 쉬는 시간은 10분을 주는데, 이 시간을 최대한 활용해야 했다. 화장실 이용을 했고, 당을 많이 채울 수 있는 음식들을 먹었다. 예를 들면 카스텔라와 같은 달은 빵 또는 초콜릿 등을 먹었다. (부가적으로, 당 부족을 막기 위해 무카페인 에너지드링크를 물 대신 마셨다.)

그리고, 시간적으로 주말 중 4시간 이상을 쓰는 만큼 가족의 배려가 필요하다. 집에서 시험을 치는 경우, 모든 가족이 시험 시간동안 시험 응시자가 집중할 수 있도록 조용해야 하며 특히아이가 있는 가정이라면 아이가 방해하지 않아야 한다.

아주 중요한 것들

멘탈 관리

시험을 시작하기 전, 이번 시험이 마지막이다 라고 마음 속으로 다짐했었다. 3개월동안 주말과 밤 시간을 최대한 활용하고 이 시험이 나에게 도움이 될 것이라 계속 최면을 걸었다. 그럼에도 시간이 지날수록 시험은 내 역량에 대해 의심을 갖게 하고, 멘탈이 흔들리는 게 스스로 드러난다.

문제 설계가 되는 초기 1~2회 시험에서는 마치 조금만 더 잘 생각하면 붙을 수 있다고 생각한다. 이 시기에는 시험이 끝나면, 조금만 더 잘 했으면 붙었을 텐데 라는 생각에 화가 났다. 그런데 비슷한 상황에서 한달 이상 반복해서 떨어지게 되면, "어차피 오늘도 떨어질 것이다" 라는 마음이 생긴다. 이 때 부터가 위기의 시작이라고 생각한다. 막상 시험을 치는 나 자신은 이 시험에 제대로 응시하기 위해 어떤게 필요한지 조차 제대로 준비가 되어있지 않을 수 있다. 실제로 내 경우 시간 조건에 맞추기 위한 Hash, List, MinHeap, Trie에 대해 이해를 한 것은 5월 이후였다. 이미 아슬아슬한 시점이었지만, 포기하지 않고 계속 시험을 친 것이 내가 붙게 된 원동력이었다.

복기

또 하나 중요한 것은 복기이다. 매번 시험을 치면, 어떤 유형의 문제였고, 어떤 것들을 구현해야 하며 내가 어떤게 틀렸는지 계속 파악해야 한다. 시험 특성 상 "오답 노트"를 만드는게 내가 시험에 붙게 하는 것은 아니다. 하지만 시험이 끝나는 순간에도 문제를 놓지 않고, 조금이라도 나은 결과를 만들려는 노력 자체가 필요하다고 생각한다.

 

스터디

보통 시 Certi 응시 전 2주 가량 교육을 다녀온다. 이때 2주동안 매일 문제를 푸는 게 정말 큰 도움이 된다고 생각한다. 이 2주간의 집중 교육으로 합격이 결정된다면 당연히 모두가 교육을 들어야 할 것이다. 하지만 대부분의 경우 2주 만에 합격하기 어렵고, 교육을 다녀온 뒤에도 반복 학습이 필요하다. 그래서 서로가 자극을 줄 수 있도록 스터디가 필요하다고 생각한다. 특히 도움이 되었던 것은, 기출 문제 또는 연습 문제에 대해 토론을 하는 것이다. 그리고, 도움이 되기 위해서는 꼭 문제를 풀어보고 이 토론 과정에서 한마디라도 하는 것이다. 엉뚱한 말이라도 내가 풀었던 것에 대해 말하면서 틀린 부분을 고치면, 이것들이 누적되면서 시험을 치는 시간 동안 반드시 기억이 난다.

 

결국

본격적으로 공부를 시작하고 90일째 되는 날, 오늘이 마지막 시험이라고 생각할 때 합격했다. 이 과정 동안 너무 많은 도움을 받았다. 스터디 리딩을 해주는 선배님들이 있었고, 스터디에서 같이 아이디어를 공유하는 멤버들도 있었다. 업무를 줄여서 시험에 집중하게 만든 선배님들도 있었다. 그리고 집에서 시험에 집중하게 해주는 가족들도 있었다. 누군가는 어렵지 않게 느낀 시험이었을 수 있으나, 나는 매우 어렵고 힘들게 합격했기에, 도와주신 많은 분들에게 매우 감사할 따름이다.