한화 S&C 기술역량평가 코드파이(CODEPIE) 및 기타 코딩 테스트 준비하기

     

들어가기 앞서..


 최근 들어 IT기업들이 입사절차에 일명 '코딩테스트' 단계를 추가하고 있습니다. 불과 몇 년 전 제가 취준할 때만 해도 코딩테스트를 보는 회사는 게임회사밖에 없었습니다. 엔씨소프트나 넥슨, NHN엔터테이먼트에서 필기형식으로 손코딩이나 문제를 풀었던 기억이 나네요. 


 하지만 요즘은 대부분의 IT기업들이 입사절차에 코딩테스트를 진행하고 있습니다. 얼마 전 카카오가  신규채용으로 대규모 코딩테스트를 진행했습니다. 아무래도 최근 블라인드 채용이라는 제도가 곳곳에서 시작되면서 스펙보다는 실제 코딩 실력을 보겠다! 라는 회사가 늘고 있는 것 같습니다.


 한화 S&C에서도 2016년 하반기부터 기술역량평가인 코드파이를 진행하고 있습니다. 작년부터 코드파이 문제출제와 평가 감독을 진행하면서 지원자들이 어떻게 준비해야 하는지를 몰라 평가에 어려움을 느끼는 모습을 많이 봐왔습니다. 


 이 글은 코드파이뿐만 아니라 IT기업에서 진행하는 코딩테스트의 대한 준비를 어떻게, 뭐부터 준비해야 하는지 모르는 취준생 분들을 위해 작성하였습니다. 알고리즘대회나 알고리즘문제풀이사이트(백준, hackerrank 등)에서 문제를 많이 풀어보신 분이면 이 글을 안 읽으셔도 될 것 같습니다. :)






사용할 프로그래밍 언어 준비


 일단 가장 먼저 자신이 사용할 언어를 정해야 합니다. 대부분 자신이 가장 자신 있는 언어를 선택하지만, 그 언어를 실제 평가에서 사용할 수 있는지를 확인해야 합니다. C와 JAVA는 대부분 평가시스템에서 사용가능하지만 Python이나 JS, Ruby 등과 같은 언어를 지원하지 않는 평가시스템도 있습니다. 코드파이는 C, C++, JAVA 3가지언어만 지원하고 있습니다.


 일부 기업들은 다양한 언어를 사용하는 지원자에게 가산점을 주는 경우도 있습니다. 예를 들어 동점자가 나온 경우, 여러 가지 언어를 사용한 사람에게 점수를 더 높게 주는 방식입니다. 하지만 그렇다고 무조건 여러 언어를 공부할 필요는 없습니다.


 자신이 여러 가지 언어를 할 수 있다면 그다음은 언어의 특징을 생각해 봅니다. 뭐 특징이라고 해서 대단한 것은 아니고, 배열이나 문자열을 사용할 때 어떤 언어로 해야 내가 더 확실하고 빠르게 할 수 있을까? 같은 점을 고민해보는 겁니다. JAVA 같은 경우 ArrayList를 사용해 동적인 배열을 쉽게 관리 할 수 있지만, C는 직접 구현해야하는 번거로움이 있습니다. String Tokenizing 같은 경우도 C보다는 JAVA가 더 쉬운 것같고요. 물론 C를 오래 하신 분이면 C가 더 편할 수도 있습니다. 개인적으로 알고리즘 문제 푸는 데는 Python이 짱인것 같습니다. ㅎㅎ코드파이에서 지원 안 하는 점만 빼면요.





표준입출력에 대한 개념 및 입력값 처리하는법


 표준입출력이 뭔지 아시나요? 사실 저는 알고리즘 문제를 접하기 전에 표준입출력에 대한 개념이 부족했습니다. 아마 대학교 전공시간에 배우긴 했고, 단어도 뭔가 아는 것 같은데 그게 도대체 뭔지에 대한 구체적인 개념이 없었던 거죠. 

표준입출력이란 말 그대로 해당 언어가 사용하는 표준 입출력방식입니다. C언어에서 우리가 항상 맨 위에 쓰는 stdio.h의 약자가 STanDard Input Output인 것은 다들 들어보셨을 겁니다. 말 그대로 표준입출력을 사용할 수 있는 헤더파일이죠. C언어에서 가장 많이 사용되는 입출력은 printf와 scanf입니다. 그 밖에도 puts, put char, gets, getchars 등등이 있는데 printf와 scanf를 가장 많이 쓰는 것 같네요. 자바의 경우에는 System.in과 System.out을 예로 들 수 있겠네요. 


 표준입출력이 왜 중요하냐면, 문제를 푸는데 가장 기본이 되는, 선행이 되어야 하는 부분이기 때문입니다. 대부분 문제들은 “X의 입력이 주어질 때 Y를 구하라!” 형식으로 되어있습니다. 즉 우리는 X를 입력받아서 Y로 만드는 함수 성격의 프로그램을 만들어야 합니다. 여기서 입력으로 들어오는 X를 어떻게 처리할까요? 구체적인 예로 두 수를 더해서 합을 출력하는 프로그램을 만든다고 합시다. 대충 아래와 같은 모양이겠죠?


x = 3

y = 5

sum = x + y

print(sum)


 위 코드는 확실하게 두 수를 더해 합을 출력하는 프로그램입니다. 하지만 두 수 x와 y에 대한 결정을 코드상에서 했기 때문에 외부로부터 입력을 받을 수는 없습니다. 


 문제에서는 “내가 x와 y를 네가 만든 프로그램에 넣어줄테니 sum을 출력해줘” 식이기 때문에 x와 y를 입력받아야 합니다. 이때 표준 입출력이 사용되는 거죠.


scanf("%d %d",&x, &y);

printf("%d",x+y);


 위에 코드는 C의 표준입출력을 사용해 두 수를 입력받아 합을 출력하는 코드입니다. 여기서 중요한 점은 문제에서 입력이 어떤 형태로 주어지고 출력을 어떤 형태로 원하는지 입니다. 위 코드의 입력과 출력은 아래와 같은 모양입니다.


입력 : x y  //두 수가 공백으로 구분됨

출력 : sum  //숫자만 출력


 입력의 두 수가 공백으로 구분되어 있기 때문에 scanf의 %d와 %d사이에 공백을 두어야 두 수를 정상적으로 입력받을 수 있습니다. 출력의 경우 단순히 숫자만을 원하기 때문에 숫자만 출력하고 있지만, 아래와 같이 원할 경우 코드를 변경해야 합니다.



입력 : x y  //두 수가 공백으로 구분됨 x,y = 자연수

출력 : 두수의 합 = sum  //숫자만 출력 sum = 자연수


scanf("%d %d",&x, &y);

printf("두수의 합 = %d",x+y);


 이처럼 문제에서 원하는 출력형태에 맞춰 코딩을 해야 합니다. 


 어떻게 보면 매우 기본적일 수도 있는데, 알고리즘 문제를 접해보지 않은 분들이나 비IT전공자들에게는 이 개념이 엄청 생소할 수 있습니다.




입력값에 대한 컨트롤


 위에서 표준입출력과 입력값을 받아오는 것에 대해 간단하게 이야기했습니다. 하지만 입력값이 위처럼 항상 간단하게만 나오는 것이 아닙니다. 예를 들어 입력값으로 단어 N개가 공백으로 주어진다고 가정해봅시다.


입력 : N개의 단어가 공백으로 주어짐

입력 예제 : blog homepage program code hello company ...


 입력을 어떻게 받아야 할까요? 입력이 한 줄의 문자열이기 때문에 일단 문자열로 받은 후, 공백으로 구분하여 tokenizing해야 합니다. 해당 언어에 tokenizing방법을 모른다면 이 문제는 손도 못 대고 넘어갈 수밖에 없습니다. 또, C에서는 위에 문자열을 그냥 scanf로 받으면 제일 앞 단어인 blog밖에 입력받지 못합니다. 



scanf("%s",input);

printf("%s",input); // 출력 : blog


 왜냐하면 scanf에서 %s는 기본적으로 공백이 오면 문자열이 끝났다고 생각하기 때문에 입력 문자열이 blog에서 끝난다고 생각하기 때문입니다. 전체를 받기 위해서는 아래와 같이 코딩해야합니다.


scanf("%[^\n]s",input);



 [^\n]에 의미는 다음 개행문자(엔터)가 오기 전까지 문자열을 다 받겠다는 뜻입니다. 이처럼 다양한 인풋형식에 대해 자신이 사용하는 언어로 어떻게 처리해야 하는지 확실히 숙지해야 다음 문제를 풀 수 있습니다.




평가 환경


 진행하는 평가가 어떤 환경에서 진행되는지도 확실히 알고 가야 합니다. 온라인으로만 진행하는지, 오프라인에서 진행하는지, 인터넷 연결이 되는지, IDE를 사용할 수 있는지 등, 여러 가지 개발환경이 문제를 푸는 데 영향을 주게 됩니다.


 코드파이는 오프라인으로 진행되며 외부인터넷에 접속할 수 없습니다. 즉, 구글링이 불가능합니다. 툴은 기본적으로 이클립스와 비쥬얼스튜디오가 있지만 실제 문제를 푸는 것은 웹브라우져상에서 진행되기 때문에, IDE를 사용해 코딩을 하고 웹브라우져에 업로드해서 결과를 확인하는 방법으로 진행됩니다. 


 타 코딩테스트의 경우 웹브라우져로만 진행되는 경우도 있고, 인터넷이 가능한 경우도 있습니다. 하지만 인터넷이 가능한 경우에 문제가 더욱 어려운 경향이 있습니다. 왜냐하면, 특정 알고리즘에 대한 정의나 구현방법을 검색해서 사용할 수 있기 때문입니다. 대부분 인터넷이 가능한 평가의 경우 문제를 읽고 “어떤 로직을 어떻게 적용하면 이 문제가 풀릴까?”와 같은 문제해결 능력을 보는 것 같습니다. 반대로 인터넷이 안 되는 환경에서의 평가는 “이런 이런 방법으로 로직이 구성되는 데 이걸 코드로 구현할 수 있냐”와 같은 문제가 출제되는 경향이 있습니다.


 정리하자면 평가환경에서 사용 가능한 IDE 여부, 인터넷사용 가능 여부, 시간, 개인장비사용 여부(키보드, 마우스 등)를 확실하게 알아보고 준비해야 합니다.





문제 난이도, 문제에 대한 연습


 아마 가장 준비하기 까다로운 것이 문제에 대한 것들이 아닐까 싶네요. 위에도 언급했지만, 인터넷이 되는 환경이라면 비슷한 유형의 문제를 인터넷에서 찾아볼 수 있기 때문에 복잡한 문제들이 출제됩니다. 반면 인터넷이 안되는 경우는 문제에 주어진 지문을 이해하고 코드로 구현할 수 있는지를 테스트하는 문제들이 출제됩니다.


 음.. 코드파이 같은 경우는 인터넷 연결이 안되기 때문에 문제가 그렇게 어렵지는 않습니다. 물론 복잡한 알고리즘을 사용해야 하는 문제도 출제되기는 하지만 대부분 주어진 지문을 읽으면 로직이 금방 떠오르는 문제들이 대다수입니다. 


 문제에 대한 준비로 가장 좋은 방법은 많이 풀어보는 것입니다. 현재 인터넷상에는 많은 알고리즘 문제풀이 사이트들이 있습니다. 

생각나는 곳으로는 …


프로그래머스 - https://programmers.co.kr

백준 알고리즘 - https://www.acmicpc.net

hackerrank - https://www.hackerrank.com


 정도가 있네요. 접속하셔서 쉬운 문제를 풀다 보면 어느 정도 어떻게 문제를 풀어야하는지 감이 오실 겁니다. 문제를 풀 때는 최대한 자신이 알고 있는 지식만으로 풀려고 노력해보는 것이 도움이 될 것 같습니다.





시간 엄수


 사회생활에 기본이 되는 부분입니다. 평가의 경우 주어진 시간이 지나면 자동으로 접속이 끊기기 때문에 말이 필요 없고, 오프라인 평가 테스트의 경우 평가 시간을 지켜야 합니다.


 실제로 감독을 하다가 평가 시작 시간보다 1분 늦게 도착해서 문 앞에서 돌아가시는 분들도 있습니다. 감독관으로써 정말 아쉽기는 한데, 개인적으로는 시간약속조차 지키지 못하는 사람이라면 평가를 안 봐도 될 것 같습니다. 시간약속은 정말 정말 중요합니다.(진지)





마치며..

 이제 곧 2017 하반기 코드파이가 진행됩니다. 준비자분들 모두 열심히 준비하셔서 원하는 목표를 이뤘으면 좋겠네요~ 혹시 지원하시는 분들은 코드파이때 뵙겠습니다. ㅎ_ㅎ


 아 그리고, 코드파이가 아니라 다른 코딩테스트를 준비하시는 분들은 파이썬을 꼭 배우라고 하고 싶네요. 문제 풀 때는 파이썬이 짱입니다. 배열처리나 문자열처리, 반복문 처리 등등 거의 모든 문제를 한 줄로 풀 수 있을 정도로 언어가 잘돼있습니다.

파이썬에는 이런 명언이 있지요. 


Life is too short, You need Python.






2017-10-26 추가

IDE 사용법 숙지 

 코드파이에서는 비쥬얼스튜디오와 이클립스를 제공합니다. 간혹가다가 비쥬얼스튜디오에서 콘솔(Console)창 띄우는법을 몰라서 코드를 실행시켰는데 결과가 안나온다고 질문하시는 분들이 있습니다. 코드파이 진행중에는 평가 진행에 관한 어떠한 질문도 받지 않습니다. (시스템적인 오류 제외)

IDE에 대한 기초적인 설정법이나 디버깅하는 방법 등은 가급적이면 숙지하고 평가에 임하셨으면 좋겠어요~

반응형

댓글

Designed by JB FACTORY