YepBt
1k
2020-04-21 19:28:43 작성 2020-04-22 11:47:37 수정됨
16
4799

왜 회사들, 특히 대기업들이 알고리즘 테스트를 시행할까?



저번에 글 쓴거의 반응이 생각보다 좋아서 그냥 좀 더 제 생각들을 이것저것 올려보려고 합니다.


이런 글을 어디다 올릴지 몰라서 일단 사는얘기에 올립니다. 사는 얘기가 아니라 다른데 올릴 만한 곳 있으면 수정하겠습니다.


--

왜 회사들, 특히 대기업들이 알고리즘 테스트를 시행할까?


IT 직종의 대기업들은 대부분이 알고리즘 테스트를 하고 있습니다. 그러다 보니 많은 분들이 알고리즘을 공부 해야함을 알지만 어떤 식으로 공부를 할지, 어떤 알고리즘을 공부해야 할지, 갈피를 못 잡는 경우를

자주 보았습니다.


과연 왜 이 놈의 회사들은 알고리즘 테스트 같은 것들을 보는 것일까요?


[주의] 글 시작에 앞서 포트폴리오 관련 글을 보신 분들은 아시겠지만, 이 글 역시 저의 지나친 개인적인 생각을 기반으로 한 글임을 강조드립니다.


제 기억이 맞다면 알고리즘 테스트를 가장 먼저 도입한 곳은 삼성일 것입니다. 최초는 아니더라도 초기 정도에 시행했다고 생각이 듭니다. 그리고 우리나라의 회사들은 삼성의 트렌드를 따르는 경향이 있습니다. 너도나도 있어보이기 위해 알고리즘 테스트를 시행하기 시작했습니다.


그렇다면 왜, 그 놈의 알고리즘 테스트를 볼까요? 그에 앞서 대기업과 중견, 중소의 차이에 대해 생각해 보겠습니다.


***

## 대기업과 중소기업 무슨 차이가 있을까?

과연 대기업과 중소기업의 차이는 무엇이 있을까요? 연봉? 맞습니다. 대우? 맞습니다. 맞는 말이지만, 이 글에 주제와 관련된 가장 큰 차이는 바로 "신입을 키울 능력이 있는가 vs 실무 능력이 있어 바로 투입이 되는가"

라고 저는 생각합니다.


대기업은 신입을 키울 능력이 있습니다. 개발의 장점이 무엇인가요? 너도, 나도, 우리 모두 할 수 있습니다. 막 코딩을 해서라도, 누더기같은 인형 꿰맨 것 마냥 난리난 코드라도 누구든 짤 수 있습니다.

막말로, CS를 정확히 몰라도, 운영체제가 어떻게 돌아가는지, 시분할 시스템이 무엇인지, 세마포어가 무엇인지, OSI 7 계층이 무엇인지 몰라도, 우리는 개발을 할 수 있습니다.(말 그대로 막말입니다. 몰라도 된다라고는 안 했습니다)


하지만 대기업 입장에서 조금 개발을 해본 사람들?이 몰립니다. 그러나 그런 사람들이 절대 메리트를 가지고 우세하다고 저는 절대 생각하지 않습니다. 중소기업에서 spring으로 개발 1년 해보았다구요? 제가 대기업 임원이면 "그래서요?" 라고 답할 것 같습니다.

대기업 입장에서 사람들은 널렸습니다.


앞서 말한대로 대기업은 신입을 키울 능력이 있습니다. 그렇기 때문에 실무경험이 있다?가 대기업한텐 엄청 큰 메리트는 아닙니다. 그러면 대기업은 무얼 보고 신입을 뽑을까요? 제 생각이 맞다면 "가능성"이라고 생각합니다.


개발은 특별한 것이 아닙니다. 누구나 할 수 있습니다. 무식하게, 또는 지저분하게, 또는 평범하게, 다양한 성향의 사람들, 그 중에서 비범해 보이는 가능성을 가진 사람을 뽑아다 키웁니다. 그러면 그 사람은 더 많은 포텐을 가지고 결과를 내올 가능성이 있거든요


그럼 이 가능성을 어떻게 판단을 할까요? 저는 18년도에 졸업한 시즌이라 그 전의 대기업들이 어떤 채용 절차를 거쳤는지는 모릅니다. 그저 기억하는 것은, 3학년 때 LG 공채에 영어 최저 자격증 제한이 있었는데, 4학년이 되니 그 자격 제한마저 사라졌다는 것입니다.

흔히 이전에는 스펙의 시대였겠구나라고 추론을 할 수 있습니다. 예전의 유명한 단어죠, 고스펙, 인턴십도하고 해외 봉사활동도하고 이런저런 활동을 하는 것으로 그 가능성을 평가 했을거라고 생각합니다.


하지만 고스펙이라고 다 똑부러지고 일을 잘하고 그런게 아니구나라고 느꼈는지 가능성의 척도를 스펙에서, 바로 이것, "문제 해결 능력"으로 갈아 탔다라는 것입니다.


이런 대기업과는 반대로  중소기업은 바로 실무에 투입이 되어야하니 당연히 먼저 개발을 해본 사람, 이것저것해본사람, 자기 회사와 기술스택이 맞는사람이 우선적이 되는 것 입니다.


***

## 문제 해결 능력은 무엇을 말하는가?

저는 알고리즘을 조금 공부해본 경험이 있습니다. ACM 대회도 준비를 해보았었고, 물론 본선도 가진 못하게 되었지만(문제를 3개나 풀었지만 1문제를 팀원 중 풀어줄 사람이 없었습니다. 팀탓입니다.)


제가 알고리즘을 처음 공부 할 때 왜 알고리즘을 공부해야하는지를 느낀 문제를 간단히 보여드리겠습니다.


"아나그램이란. APPLE - LEPPA 와 같이 같은 문자열로 구성된 단어를 아나그램이라고 합니다. 그렇다면 우리가 코드를 통해 두 개의 단어를 입력 받아서 애나그램 관계인지를 출력하고자 할 때,

어떤 방법이 있을까요? "


1. 보통 많은 사람들이 생각 할 방법으로 2중 반복문을 통해 왼쪽 단어 A와 오른쪽단어 전체를 비교, 그 이후 왼쪽단어 P와 오른쪽단어 전체를 비교, 이런 식으로 비교해가며 탐색 할 수 있습니다.

2. 왼쪽 단어를 퀵소트를 통해 AELPP로 정렬하고, 오른쪽 단어역시 정렬하여 AELPP로 정렬한 뒤 1중 반복문으로 각 배열 인덱스를 비교 할 수 있습니다.

3. 초짜였던 저는 저는 이 방법에 감탄했습니다. char 배열을 만들어 A=0, B=1, C=2 이런식으로 인덱스를 생각하고 각 값에 카운트를 넣습니다.


1번 방식은 2중 반복문을 사용하고, 2번 방식은 정렬과 1중 반복문을 통해 효율을 개선하였습니다. 3번은 심지어 정렬하는 기능도 없습니다.


저는 처음엔 당연히 1번 밖에 생각을 못했습니다. 그리고 친구의 3번 해답을 듣고 정말 충격을 먹었습니다. 똑같이 뇌를 가지고 있는데, 효율이 극적으로 차이나는 두개의 대답이 나온 것입니다.


예, 대기업은 이런 똑똑한 친구들을 뽑고 싶은 것입니다. 그냥 코딩이요? 말씀드렸듯 누구나 합니다. 하지만 문제를 어떻게 효율적으로 개선할지, 이것은 정말 천재가 아닌 이상 꾸준히 공부해야합니다.

그래서 삼성에서는 사내에서도 알고리즘 문제풀이로 능력을 매기는 시스템이 있다고 하죠.


제 생각엔 결국 개발자로 문제 해결 능력이라 하면 문제가 주어질때 이 사람이 어떻게 해결 할 것인지입니다. 사고 능력을 판단하기 위한 척도가 지금의 알고리즘 테스트가 되었습니다.


***

## 대기업 입사 알고리즘 테스트, 정말 어려울까요?

NHN은 서류를 100% 합격하고 코딩테스트를 보는걸 알고 계신가요? 삼성도 서류에서 탈락하기 의외로 어려운거 아시나요? 카카오는 서류도 심지어 보지 않는 다고 블라인드 공채를 하고 있습니다.


스펙이 의미가 없다는 말입니다. 삼성은 코딩테스트로 2문제 정도를 출제합니다. 2문제에 3시간, 인터넷에 보면 보통 1문제 맞으면 면접은 간다고 합니다. NHN의 경우 1차 코테로 알고리즘테스트를 보는데 보통 3문제 이상 맞으면 2차까지는 간다고 합니다. 대신 NHN는 CS 관련 2차 테스트가 있습니다.

이런 회사들 스타일에 따라서 몇몇 한 번쯤 이름을 들어본 유명 기업들도 열심히 따라서 서류는 뒷전이고 알고리즘 테스트를 1차, 2차 이런식으로 많이 봅니다.(1차, 2차 다 풀었지만 서류로 떨어뜨린건 안 비밀)


그러면 이런 알고리즘 테스트, 정말로 어려울까요?


저의 대답은 "그렇지 않다." 입니다. 대기업에서 진행하는 알고리즘 테스트는 ACM-ICPC와 같은 알고리즘 경진대회가 아닙니다. 조금 공부한 사람들도 많이 어렵다고 느끼는 네트워크 유량 문제, 이분 매칭 등의 문제는 나온 것을 본 적이 없습니다.

나오더라도 한, 두 문제로 대회 순위권자 정도 되는 사람이 아니라면 못 푸는 문제라고 생각합니다. 그러니 예외로 치겠습니다.


그런 문제를 제외하고는 백준의 시뮬레이션 문제 - 주어진 문제를 그대로 코딩만 할 수 있는지를 판단하는 류의 문제, 정말 기초적인 알고리즘, BFS, DFS, 다이나믹 프로그래밍 정도로 나옵니다. 이 부분은 제가 취준을 안 한지 2년되어 최신 트렌드는 정확히는 말씀드리기 어렵습니다.

그렇기 때문에 기본적인 구현 능력과 위에 언급한 알고리즘 정도만 꾸준히 공부하셔서, 관련 문제들을 막힘없이 풀 수 있다면 대기업 알고리즘 테스트를 통과는 할 수 있다고 생각합니다.


***

## 그렇다면 CS를 안 중요한가요?

중소기업에서 알고리즘 테스트를 중요하게 하나요? 보통은 잘 안합니다. ACM-ICPC 대회를 못 들어본 사람이 더 많습니다. 사실 운영체제 달달 안 외워도 코딩만 좀 할 줄 알면 개발 잘 하긴 하니까요.


하지만 대기업은 말씀 드렸듯 다릅니다. 

쉽게 생각해봐도, 운영체제에 대해 잘 알고, 네트워크에 대해 잘 알고, 알고리즘에 대해 잘 아는 사람 VS 개발만 잘 하는 사람을 비교하면, 같은 문제를 주어졌을 때 전자의 경우 운영체제적으로, 네트워크 관련 관점에 따라 문제를 해결 할지 방법들을 고민 할 수 있습니다.

하지만 개발만 잘 하는 사람이라면 네트워크적인 부분을 고려하기 힘들 수 있고, 다양한 문제 해결 방법을 제시하기가 전자보다는 힘들 것이라고 생각합니다. [개발 != 당장 기능 동작하도록 스피디 코딩]이기 때문에 이 관점에서 CS도 당연히 중요하다 생각합니다.


지금까지 매우매우 주관적인 스토리였습니다. 감사합니다.


--


글 쓴다는 것이 생각보다 재밌어서 깃허브 정적 블로그를 만들었습니다.

보여줄만한 프로젝트가 아직은 없어서 일단 칼럼이나 평소 생각했던 개발 관련 글을 남길 예정입니다.


물론 모든 내용은 okky에서 보실 수 있도록 전문을 올릴 예정입니다.

https://spellofstar.github.io/post/why_company_ask_algorithm/

17
17
  • 댓글 16

  • 아카즈
    2020-04-22 00:48:58

    공감이 많이 가는 좋은 글이네요~ 추천드립니다.

  • sisidjeje
    10
    2020-04-22 01:01:45

    추천!

  • 스칼라가좋아
    2020-04-22 05:45:31

    하나를 더 보충하면 좋을 것 같아 짧게 글을 씁니다. 한국과 북미가 다른 건지 아니면 이 글에서 빠진 건지는 모르겠습니다. 그래서 북미로 전제를 하고 이야기 하겠습니다. 

    현재 캐나다 모 대기업에서 코업 과정에 있습니다. 시니어 개발자 분께 코딩 인터뷰를 볼 때 어떤 걸 보는지 듣고 이야기 하는 것이니 이점 참고하시기 바랍니다. 

    코딩 인터뷰를 단순히 문제해결능력이라고 정의 한다면 상당히 포괄적이고 추상적으로 들립니다. 어떤 문제를 주먹 구구 식으로 해결하는 사람도 있을테고 운이 좋아 해결하는 사람도 있을 것이며 사전에 문제를 달달 외워서 푸는 사람도 있을 것이며, 적절한 논리를 바탕으로 해결하는 사람도 있습니다.

    예를 들어, 입문용 문제인 two number sum 같은 문제는 (target = 8, array = [1,3,4,5,6,10], result = twoNumberSum(target, array) )


    1. nested loop를 사용할 한다. (O(n^2) time, O(1) space)

    2. hash table을 이용한다 ( O(n) time, O(n) space )

    3.left, right index를 사용한다. ( O(nLog(n)) time O(1) space)


  • 스칼라가좋아
    2020-04-22 05:51:58

    이 때 많은 분들은 2나 3 방법을 바로 쓸지 모르나 사실 1의 방법부터 시작하셔도 무관합니다. 그 후 이것의 시간, 공간 복잡도를 설명하고 그것을 시간 복잡도를 개선하는 방법으로 2를 제안해도 되고 시간 복잡도의 개선을 면접관이 요구한다면 3을 말할 수도 있습니다.

    그러나 중요한 것은 이 문제에 접근하는 과정들이 매우 체계적이고 논리적이어야 한다는 것입니다. 2번의 방법이 좋다고 2번부터 시작한 후 문제는 해결했으나 접근의 장단점이나 논리적 과정에 대한 설명이 없다면 면접관은 이 사람이 문제 해결 능력을 가진게 아니라 좋은 기억력을 가졌다고 생각할 것입니다. 

    문제를 해결 해도 자신의 풀이 과정을 잘 설명하지 못한다면 어떨까요? 상대방은 이해하지 못할테고 이는 커뮤니케이션 능력이 부족으로 생각될 것입니다. 개발 환경에서 커뮤니케이션은 상당히 중요하고 자신의 아이디어나 코드를 상대에게 설명할 수 없다면 혹은 자신의 이해하는 코드만 짜내는 사람이라면 같이 일하기 힘들어지고 이는 생산성의 저하로 이어집니다. 


  • 스칼라가좋아
    2020-04-22 05:58:25

    실제 시니어 개발자 분은 면접을 보시면서 많은 개발자들이 커뮤니케이션 능력의 부족으로 떨어진다고 말씀하셨습니다. 한 예로, 중국인이나 아시안 구직자들 중에 알고리즘을 푸는 능력은 매우 뛰어나지만 상대를 이해시키는 능력이 부족해 채용하지 않는 경우가 꽤 있었다고 합니다. 


    기업이 사람을 채용할 때는 비록 짧은 코딩 인터뷰라도 여러 가지를 평가하는 셈이죠. 


    https://youtu.be/XKu_SEDAykw

    여기 링크의 영상은 구글이 원하는 인터뷰는 어떤 건지 가상의 예로 보여줍니다. 많은 도움이 되니 면접을 앞두신 분이라면 꼭 한 볼 것을 추천합니다. 

  • 스칼라가좋아
    2020-04-22 06:04:32

    만약 영상을 보셨다면 저 인터뷰를 보는 사람이 매우 나이브한 접근부터 시작함을 알고 있습니다. 즉, 처음에 nested loop를 사용하여도 차근 차근 해결해 다른 단계로 넘어갈 수 있다면 괜찮다는 것입니다.


    한 편으로 외워서 2, 3 번으로 푸는 사람들을 기업이 원치 않는 것도 알 수 있습니다. 기업이 원하는 능력은 단순히 기존의 문제를 해결하는 능력이 아니라 복잡한 상황에서 새로운 문제를 논리적으로 해결하고 이를 상대방에게 이해시키는 것이기 때문입니다. (물론, 제가 한국에서 일한 적이 없어서 한국은 어떤 방식으로 면접을 보는지 모르겠습니다. 다만, 문제만 풀고 적합함 검증이 이루어지지 않는다면 반쪽짜리 채용과정일 것이라 생각합니다. )

  • YepBt
    1k
    2020-04-22 10:59:21

    스칼라가좋아 좋은 내용 감사합니다.

    저는 우선 한국에서 취업을 해보았기 때문에 해외 기업들은 고려를 못 했습니다.

    미국행을 준비를 하고는 있기 때문에 대략 어떤 스타일로 면접을 보는지는 알고 있으나 경험을 해보지 못해서요 ㅎㅎ

  • 채원아빠
    24
    2020-04-22 16:01:25

    3번 방법 무슨말인지 모르겠는데 설명좀 ..


  • YepBt
    1k
    2020-04-22 16:08:21

    채원아빠 


    ACDC, ABCD라는 단어가 있으면

    왼쪽단어

    LeftAlphabet[0] = 1

    LeftAlphabet[1] = 0

    LeftAlphabet[2] = 2

    LeftAlphabet[3] = 1


    오른쪽단어

    RightAlphabet[0] = 1

    RightAlphabet[1] = 1

    RightAlphabet[2] = 1

    RightAlphabet[3] = 1


    인덱스 넘버를 A -> 0, B -> 1, C->2, D->3이라 가정하고 그냥 카운팅하는 방식을 말한거였습니다.


    그리고 

    모든 인덱스에 대해(알파벳이니 index 크기 26)

    LeftAlphabet[index] = RightAlphabet[index]를 비교해서 모두 일치하면 애나그램인지 아닌지 확인 할 수 있습니다



  • 잡캐
    2
    2020-04-24 14:32:52

    YepBt


    댓글을 어캐 다는지 모르겠으나

    그럼 그냥 문자를 ASCII 코드값으로 해도 되겠네요 ..

     A가 ASCII로 65이니


    ACDC => 65+ 67+ 68 + 67  = 267

    ABCD => 65 + 66 + 67 + 68 = 266


    267 != 266

    에나그램이 아님!


    이렇게 이해해도 되는건가요?

  • YepBt
    1k
    2020-04-24 14:54:44

    잡캐 새로운 방법이네요 네 맞습니다. 제 생각에도 그 방법도 통용 될 것 같습니다.

  • 모나리자몽
    95
    2020-04-24 19:09:35

    이방법도 정답일까요?

    배열을 왼,오로 두는게아니라

    하나만둬서

    각각 채워진요소가 모두 짝수기만한다면

    그것도 애너그램일것같다는...

  • 모나리자몽
    95
    2020-04-24 19:16:17
    아스키로 값을바꾸면 A + Z = 65+90 = 175
    K + P = 75 + 80 = 175
    이렇게 값이 같은 다른문자열이 생기지않나요??
  • freekun
    171
    2020-04-26 07:30:22

    대기업에서 코딩 테스트를 보는 것이 아니라 좋은 인사 프로세스를 갖춘 곳에서 여러 검증 방식 중에 코테를 보는 것이겠죠. 너무 이분법 적으로 안봤으면 합니다. 대기업이라고 다 좋은 건 아닙니다.

  • 김모씨
    3k
    2020-04-28 17:02:14

    전 무식한듯. 

    if (a.length == b.length) 로 우선 걸러내고. 

    int fulllength = a.length

    boolen chk = true;

    for fulllength  i++;

    if (a[i] != b[fullLength -i) {

      chk = false;

      break;

    }

    if(chk)sysout("아나그램이군요.")

    이렇게 생각했는데..


  • 무명소졸
    6k
    2020-04-28 17:36:53
  • 로그인을 하시면 댓글 을 등록할 수 있습니다.