다양한 분야의 선생님들에게 듣는 독특한 이야기, 강연과 함께하는 하루를 즐기며 여유 시간에 사소한 즐거움을 느껴보세요!

 

구재현 학우 제공
구재현 학우 제공

KAIST 전산학부 17학번 학생이자, 여러 온라인 저지 사이트에서 구사과라는 이름으로 활동하고 있는 구재현 학우를 만났다. 구재현 학우는 본인의 알고리즘 풀이 경험과 관련 지식을 바탕으로 블로그 및 온라인 저지 사이트 게시판에서 알고리즘에 대한 해설 및 응용법에 대한 글들을 작성하고, 문제를 출제하는 등 다양한 방향으로 왕성하게 활동하고 있다. 뿐만 아니라, 2015년과 2016년에 국제정보올림피아드에서 수상했던 경험을 바탕으로 2017년부터 국가대표 학생들을 가르치는 코치 역할을 맡기도 했다. 이번 인터뷰에서는 구재현 학우의 경험이 담긴 답변을 바탕으로 프로그래머를 꿈꾸는 다른 학생들이 도움을 얻어갈 수 있는 시간을 가져보았다.

간단한 소개 부탁드립니다! 

백준 온라인 저지(이하 BOJ), Codeforces 등 여러 온라인 저지 사이트에서 “구사과”라는 이름으로 활동하고 있는 전산학부 17학번 구재현입니다. 과거에 MOLOCO에서 2년간 소프트웨어 엔지니어로 근무했었고, 오는 9월부터 MIT에서 순수 알고리즘 분야로 박사 과정을 이수할 예정이에요.
 

소프트웨어 엔지니어(프로그래머)가 되기로 결심한 계기가 무엇인가요?

사실 전산학부로 진학하게 된 것에 큰 계기가 있었던 건 아니에요. 단순히 고등학교 때 알고리즘을 하다 보니까 재미를 느껴서, 조금 더 공부를 하고 싶어서 전산학부로 진학하게 된 경우죠. 소프트웨어 엔지니어로 넘어가자면, 저 같은 경우는 알고리즘을 위주로 공부를 했다 보니 과거에 같이 알고리즘을 공부했던 분들이 지금 어떤 기업에서 근무를 하고 있는지 살펴보았는데 MOLOCO에 근무하는 분들이 꽤 있더라고요. 그래서 관심을 가지고 살펴보니, 기업에서 요구하는 업무가 전반적으로 알고리즘 지식을 기반으로 두는 경우가 많았어요. 그걸 보고 저에게 잘 맞는 업무다 싶어서 MOLOCO를 선택하게 되었어요.
 

소프트웨어 엔지니어(프로그래머)란 어떤 직업이고, 어떤 일을 하나요?

제가 근무했던 MOLOCO 같은 경우에는 소비자들의 관심사와 기업이 가진 트래픽 정보를 바탕으로, 기업이 원하는 광고와 그 광고에 긍정적인 반응을 보일 수 있는 소비자를 매칭해주는 업무를 주로 하는 회사에요. 이 과정에서, 머신러닝을 바탕으로 최적의 광고 제공 과정을 자동화해서 이득을 효율성을 높이는 거죠. 

저는 고객사들의 데이터를 관리하고 해당 데이터가 머신 러닝에 어떻게 들어가는지를 분석하는 부분에 주로 관여했어요. 일반적으로 개발자라고 하면 프론트엔드와 백엔드로 나뉘는데, 둘 중에는 백엔드 개발자에 더 가까운 셈이죠.
 

소프트웨어 엔지니어로 활동하시면서 느낀 직업적 장점에는 어떤 점이 있었나요?

기본적으로, 프로그램을 짠다는 것 자체가 정확하게 업무를 정해두고 매뉴얼에 맞게 진행하기보다는 그때그때 상황에 맞게 효율적인 코드를 작성하는 경우가 많아요. 이렇게 업무 자체가 자유도가 높기에, 대개 회사들의 경우에도 재택근무나 유연근무제처럼 업무 시간의 자율성을 위한 복지 제도가 잘 보장되어 있는 편이라는 게 큰 장점이죠.
 

BOJ, Codeforces 등 여러 온라인 저지 사이트들에서 왕성하게 활동하며 상당히 많은 양의 문제를 풀었네요. BOJ에서만 거의 13,000문제인데, 이렇게 풀었던 문제들 중에 가장 기억에 남는 문제는 어떤 문제였나요?

BOJ에 <Bohemian Rhaksody>란 문제가 있어요. 제가 다른 대회에 출제했던 문제인데, 혼자서 한 3일 정도 고민을 거듭해서 풀어냈던 기억이 있는 문제에요. 
문제에 대해서 간단하게 이야기하면, 평평한 탁자 위에 무작위하게 점 N개를 놓고, 탁자에 직사각형을 그려요. 이 때, 직사각형은 탁자에 평행하고 직사각형 내부에 점이 포함되지 않도록 그려야 할 때, 이 상황에서 그릴 수 있는 직사각형의 최대 넓이를 구하는 문제에요.

풀이 자체는 상당히 알고리즘 테크닉을 요구하는 편이기에 쉽지는 않았어요. 그렇지만, 이 문제에서 제가 중요하게 생각한 요소는 어려운 문제 상황을 단계별로 쪼개서 쉬운 문제 여러 개로 변형하는 과정 자체에요. 알고리즘적으로 보면 분할 정복인 셈인데, 이 문제는 단계별로 쪼갠 문제들마다 고민을 거듭해서 풀어냈던 순간들과 그 순간들을 이어서 전체 문제를 풀어내는 과정 자체가 기억에 남았던 문제에요. 조금 덧붙이자면, 문제가 제시하는 상황 자체도 활용할 수 있는 곳이 많을 것 같아요. 간단하게는 탁자를 공사 부지로 보고 건축이 가능한 지점들 중에서 어느 위치가 건물을 지었을 때 가장 넓은 부지를 확보할 수 있는 경우인지를 찾는 상황으로 바꾸어 생각할 수 있어요. 이런 상황처럼 활용 방안이 많다는 점도 기억에 남았던 이유 중 하나라고 할 수 있겠네요.
 

저도 BOJ에서 알고리즘 문제를 종종 풀어보는 편인데, 대개 평소에 자주 쓰던 알고리즘을 먼저 떠올려서 문제에 접근하다 보니 상황을 제대로 분석하지 못해 난항을 겪는 경우가 많았었어요. 선배의 경우에는, 문제를 풀 때 적합한 해법을 찾기 위해 어떤 과정을 거치나요?

저도 문제를 풀다 보면 먼저 떠오르는 알고리즘에 매몰되는 경우가 많았어요. 그런 매몰 상황을 해결하기 위해서 메타적으로 해석해 보면, 문제 풀이 상황을 일종의 지도처럼 생각해 보는 방식이 도움이 되었어요. 내가 지금 풀고 있는 문제에 적용하는 알고리즘을 지도에 표시된 하나의 길로 보고, 이 알고리즘이 제시하는 길을 따라 계속 들어갔을 때 적합한 해답을 찾을 수 있는지를 계속 생각해 보면서 문제를 풀다 보면 매몰 상황을 조금이라도 빨리 탈출할 수 있었던 것 같아요
 

온라인 저지 사이트에 올라온 문제들에 대해, 선배님이 문제에서 사용한 여러 개념들을 저지 사이트의 게시판이나 개인 블로그에 추가로 해설해 주는 걸 몇 번 읽어보았던 기억이 나네요. 
선배는 문제에서 사용한 개념을 해설할 때, 어떤 부분을 가장 중점적으로 두는 편인가요?

문제를 해설하는 경우에는 일단 문제에 대한 풀이를 최대한 정확하게, 제 설명을 듣고 오개념 없이 이해할 수 있도록 작성하는 걸 최우선으로 둬요. 그 다음으로 다른 사람의 설명을 듣다 보면 “이 풀이를 어떻게 떠올렸지?”라는 생각이 드는 경우가 많은데, 제가 하는 설명에 대해서도 이 부분을 고려하면서 제가 이 문제에 대한 해답을 찾기 위해 어떤 고민과 과정들을 거쳤는지에 대해서 덧붙여 이야기하는 편이에요.
알고리즘에 대한 설명도 문제 해설과 동일하게 정확하게 설명하는 부분을 최우선으로 두지만, 2순위로는 알고리즘을 왜 배워야 하는지에 대한 걸 많이 이야기하는 편이에요. 이 알고리즘을 배우면 어떻게 활용할 수 있고, 또 다른 알고리즘들과는 어떤 연관성이 있고, 이걸 바탕으로 어떤 문제들을 풀 수 있는지에 대한 설명을 해요.
 

앞선 답변에서 언급된 부분이긴 하지만, 과거에 MOLOCO에서 근무했다고 들었어요. 알고리즘 문제를 풀어보았던 경험들이 실무에서는 어떤 방식으로 도움이 되었나요?

사실 문제를 풀 때 쓰는 고급 알고리즘들 자체는 자주 쓰이지는 않았어요. 다만, 알고리즘 문제를 푸는 것 자체가 문제를 보고 떠올린 해법을 코드로 옮겨내고, 디버깅하는 과정을 거치기 때문에, 이 과정 전체가 실무에서 하는 일을 연습하는 것이기에 문제 풀이 경험 자체는 꽤나 도움이 되었네요.
 

알고리즘 문제 풀이 외에, 또 어떤 경험들이 실무에 도움이 되었나요?

자기 상황을 팀원들에게 지속적으로 공유하고, 교류하는 커뮤니케이션 능력이 실무에서 많이 요구되기도 하고, 프로젝트를 같이 하다 보면 각자 짠 코드를 설명하는 경우가 많다 보니 제가 짠 코드를 다른 사람들한테 설명했던 경험들이 꽤나 도움이 되었어요.
 

한 명의 소프트웨어 엔지니어로써, 업무에 가장 중요하다고 느꼈던 부분이 무엇인가요?

앞서 답변한 내용과 이어지는 부분이지만, 기본적으로는 커뮤니케이션 능력이 가장 중요해요. 다만, 커뮤니케이션 능력은 프로젝트들을 하다 보면 자연스럽게 배우게 되지만, 코드를 짜는 능력의 경우에는 스스로 공부하고 얻어내야 하는 부분들이 있다 보니 코드 짜는 능력이 주로 언급되는 편인 거죠.
 

여담이지만, “다른 학과 학생들도 이 알고리즘은 배워보면 좋을 것 같다” 하는 알고리즘이 있을까요?

저는 DP(Dynamic Programming)를 추천하고 싶어요. 어떤 학문을 공부하던 간에, 완전탐색을 할 수 있는 능력은 굉장히 중요하다고 생각해요. 공부를 하다가 특정한 문제에서 어려움을 느꼈을 때, 그 문제를 여러 개로 쪼개고, 상황을 분석하면 놓치는 부분이 없이 문제에서 요구하는 모든 상황을 체크하기가 더 쉽기 때문에 개인적으로는 DP처럼 완전 탐색을 요하는 상황에서 도움을 주는 알고리즘들을 추천해요.
 

프로그래밍에 관심이 있는 독자들에게 전해주고 싶은 말이 있다면 적어주세요!

CP(Competitive programming)건 PS(Problem Solving)건 문제풀이를 할 때 풀이를 틀리거나 대회에서 지는 걸 두려워하지 않으면 좋겠습니다. 지면 부족하다고 느낀 부분을 잘하는 사람들을 보고 배우면 되고, 문제를 틀리면 틀린 부분이 어딘지 파악하고 스스로 고쳐보는 과정에서 배우는 점이 또 있기 때문에, 기회가 될 때마다 도전해 보시기를 추천드려요.
 


 

저작권자 © 카이스트신문 무단전재 및 재배포 금지