본문 바로가기
Problem Solving

삼성 SW 검정시험(Certificate Test) 가이드 (Professional, Expert)

by hongjun7 2017. 2. 8.

  오랫동안 프로그래밍 경시대회를 준비하였으며, 2015년부터 삼성전자 인재개발원에서 Expert 대비반과 Professional 대비반 실습 교육 강사를 하였습니다. 그동안의 경험을 바탕으로 직원분들이 문제해결능력과 구현능력을 키울 수 있는 방법에 대해 기술해보고자 합니다. 그리고 Professional과 Expert 검정시험을 잘 볼 수 있는 방법들에 대해서도 조언드리고자 합니다. 저에 대한 간략한 소개와 수상 이력은 이 웹페이지를 보시면 되겠습니다.
※이 글은 최소한 Professional 시험을 준비하는 분들을 위한 것이므로 기본적인 것들에 대해서는 생략하고 바로 본론으로 넘어가겠습니다. 그리고 내부 정보를 외부로 유출하는 것은 금하는 것이 원칙이므로 이에 유의하고 작성한 글임에 양해해주시기 바랍니다.

  Professional 난이도 이상의 시험을 준비할 때에는 단순한 문제 유형 암기 또는 코드 암기로 통과하기란 사실상 불가능합니다. 시험을 준비하는 과정에서 느끼셨겠지만, 세상엔 수많은 알고리즘들이 존재하고 일반적으로 널리 알려진 알고리즘들은 그 중 가장 기본이 되는 몇 가지 일부에 불과합니다. 즉, 모든 문제 유형들을 접하기엔 시간이 부족한 것이 현실입니다. 따라서 알고리즘의 동작 원리를 완전히 익히고, Naive하게 혹은 Brute Force하게 구현한 알고리즘에 비해 어떤 점이 더 좋은지, 어떤 아이디어가 가미되어 효율이 더 좋아졌는지, 최적해가 어떻게 보장되는지 등의 대해서 심도 있는 고민과 이해가 필요합니다. 이러한 고민과 이해가 기반이 되어야 본격적으로 알고리즘 문제해결능력을 기를 수가 있습니다.

  알고리즘의 특성상, 단 하나의 조건이 변형되거나 삽입, 삭제 됨에 따라 답의 정당성이 무너지거나, 시간복잡도가 비이상적으로 증가하게 됩니다. 따라서 기본적인 알고리즘에 대한 깊은 이해가 없으면, 엉뚱한 상황에서 잘못된 응용을 하여 (본인은 시험을 잘 보고 나온 줄 알지만) 참담한 결과를 받기 쉽습니다.

  첫 번째 요소인 알고리즘 문제해결능력을 기르기 위해서는
1. 학부 과정 혹은 사내 교육 과정 중에 배우는 자료구조와 알고리즘에 대한 깊은 이해가 필요합니다.
  해당 알고리즘 혹은 자료구조의 정의, 수행 과정, 복잡도 분석 등등에 대한 심도 있는 고찰이 요구됩니다. 그리고 자주 쓰이는 자료구조나 알고리즘은 코드를 여러 번 작성해보면서 익숙해지는 과정이 필요합니다. 대표적인 예시로 힙(Heap)이 있습니다. 힙을 자유자재로 다룰 줄 안다면 우선 힙 정렬을 할 수 있게 되고, Dijkstra 알고리즘에도 응용할 수 있으며, 기타 문제를 푸는 도구로도 사용할 수 있습니다. 또한  Linked List나 간선 배열을 재가공하여 그래프를 탐색하는 법은 실제 업무에도 많이 쓰일 수 있으므로, 간결하고 확장성 넓게 쓸 수 있도록 코드 패턴을 정형화 해두는 것이 좋습니다.


2. 다양한 문제를 접하며, 본인이 스스로 알고리즘을 고안해서 구현까지 하여 문제를 해결합니다.
  1.에서는 어떤 알고리즘을 사용해야 할 지 알고 문제를 풀기 시작한 것에 반해, 2.를 연습할 때에는 어떤 문제가 주어졌을 때에 그 문제가 가진 고유한 특성과 조건들을 활용하여 본인이 직접 알고리즘을 고안해보아야 합니다. 문제에서 주어진 상황을 본인이 직접 그래프로 모델링 해본다던가, 그래프로 모델링 하였을 때에 최단거리를 구해야하는데 그 때 Dijkstra 알고리즘을 사용하면 되겠다던가, 수행시간을 더 줄이기 위해 힙(Heap)을 써야겠다는 생각을 할 수 있겠습니다. 혹은 힙 구현에 자신이 없다면 본 블로그에 있는 SPFA를 구현할 수도 있겠죠.

  두 번째 요소로, 구현 능력이 있습니다. 본인이 고안한 알고리즘을 1)정확하고 2)수행시간이 짧도록 신경 써서 3)짧은 시간 안에 구현하여야 합니다. Professional과 Expert 두 시험 모두, 정확하게 코딩하는 것이 가장 우선시 됩니다. 시험 시간이 넉넉하기 때문에 알고리즘 고안에만 너무 시간을 할애하지 않는다면, 구현할 시간은 충분할 것입니다. 그 다음으로 본인의 코드 수행시간에 주의해야 합니다. 입력의 크기가 매우 클 수 있음에 주의하지 않는다던가, 전처리를 하여 결과를 저장해두면 반복적으로 계산할 필요가 없음에도 그러지 않았다던가 하는 경우가 있을 수 있겠습니다.
  이 구현 능력을 기르기 위해서는, 사내 문제해결 사이트에서 많은 연습이 필요합니다. 구현에서 실수가 생겼는데 며칠을 고민해도 못 찾겠다면, 질문 게시판을 활용하거나 다른 분들께 도움을 요청하여 가능하면 확인하고 넘어가는 것이 좋습니다. 한 번 하였던 실수는 반복하기 쉽기 때문입니다.

  세 번째로 평소에 업무 외의 시간에 공부하실 때, 같은 등급 시험을 준비하는 비슷한 실력의 직원분들과 함께 공부하는 것을 적극 추천드립니다. 함께 시간을 정하여 실제 시험과 비슷한 조건에서 연습을 하시면서 함께 구현, 풀이에 대해 토론하고 서로가 서로에게 부족한 부분을 채워주는 것이 남들보다 성장하는 속도가 빨라질 수 있는 지름길이라고 생각합니다. 단, 그룹원들이 모두 기초 알고리즘을 모른다거나 기본적인 로직 구현에 막히는 실력이라면, 부족한 부분부터 다 함께 보완해야 모두에게 바람직하겠습니다.

  이제 시험을 잘 보는 법에 대해서 몇 가지 Tip을 드리겠습니다. 반복하여 읽으셔서 꼭 숙지하시기 바랍니다.
1. 문제를 잘 읽어야합니다.
  빠짐없이 꼼꼼하게 읽어서 문제를 완벽히 이해하고, 조건들을 하나도 놓쳐서는 안됩니다. 놓친 하나의 조건으로 인해 최종 채점 결과가 0점이 되는 것은 한 순간입니다. 혹은 엉뚱한 문제를 시험 시간 내내 푸는 경우도 가끔 있습니다. 문제 정독의 중요성은 몇 번 강조해도 지나치지 않습니다.

2. 할 수 있는 최선을 끝까지 다 하여야 합니다.
  2-1) 어떻게 풀어야 할 지 잘 모를 때는, 문제의 크기가 작을 때부터 손으로 이런저런 방법들을 시도해보며 규칙을 유도한다거나 패턴, 성질 등을 찾아보려 노력해야합니다.

  2-2) 시험 시간을 남기고 다 끝냈다고 판단되더라도, 끝까지 데이터를 손으로 직접 만들어서 넣어보거나, 가장 큰 데이터를 프로그램을 짜서 만들어서 넣어본 후 제한시간을 초과하지 않는지 확인해보아야 합니다. 만약 최대 데이터에 대해서 너무 느리게 나온다면, 이전까지 작성한 코드를 다른 곳에 안전히 보관해 둔 후, 시험이 끝나기 전까지 최적화 작업에 몰두하시면 됩니다. 시험 마지막에 점수가 어떻게 기록되는지를 잘 확인하여 받을 수 있는 점수를 못 받는 참사는 절대 없어야겠습니다.
  2-3) 문제의 조건이 불분명한 경우에는 감독관에게 알린 후, 문제에 대한 질문을 꼭 하여 의문점을 해결해야합니다. 문제를 처음부터 끝까지 5번 정도 정독하였는데도 이해가 안되는 부분이 있다면 문제 기술에서 빠진 부분이나 비문이 섞여있는 것이므로 반드시 확인해야합니다.
3. 본인이 경험했던 문제 혹은 알고리즘에 억지로 끼워맞추거나, 기억을 떠올려가며 문제를 푸는 행위는 절대 하지 마십시오.
  앞서 말씀드렸지만, 문제 조건이 하나만 일부가 바뀌더라도 해법 전체가 바뀔 수 있는 경우가 비일비재합니다. 그 동안의 노력이 한 순간의 자만으로 무너지지 않도록 차분하고 침착하게 시험에 임하세요. 특정 알고리즘을 외울려면 확실하게 반복 연습하여 외우시던가, 어중간하게 일부만 외워와서 시험장에서 기억을 떠올리다가 시간을 모두 허비하는 어리석은 경험은 하지 않으시길 바랍니다.


  제가 드릴 수 있는 중요한 조언들은 모두 기입했다고 생각됩니다.
  노력하시는 모든 개발자분들께 좋은 결과가 있으시길 바랍니다.

댓글