카카오 2021 인턴 코딩테스트, 면접 후기

·2021년 9월 16일
52
post-thumbnail

인턴 끝나기 전에 면접 후기 써야지 했는데 두 달 동안 미루다가 끝나버렸다.
그래서 이제야 쓰기로 했다.

인턴 지원기

사실 나의 첫 번째 합격이었다. 이전에 말하는 감자의 개발자 인턴 도전 광탈 썰 이라는 글에도 썼었는데, 하도 많이 떨어져봤고 면접도 대답 너무 못해서 떨어지겠거니 했다.
와 근데 붙어서 합격 메일보고 눈물 좔좔😭😭😭


코딩테스트

코테는 1번 2번은 맞았고 3번은 효율성 테스트에서 하나였나 통과 못했다. 4번은 풀다 실패. 5번은 빠이

면접 준비하면서 코테 리뷰

문제가 뭐였는지, 내가 어떻게 풀었는지 기억 되살려가면서 정리를 했다. 그리고 틀린 건 다시 풀어봤다. (근데 끝난 시험이라 확인해볼 방법은 없었다.)
그리고 내가 사용한 자료구조나 알고리즘에 대해서 얘가 정확히 뭔지, 왜 이걸 썼는지 등등 파고들었다.

내가 정리해둔 거 붙여넣자면..

1번) one2three → 123

  • map에 미리 다 저장해둠 (key="one", value=1)
    → std::map이 뭐냐면....
  • input 처음부터 하나씩 받는다. ctype 라이브러리에 isdigit() 써서 숫자아닌거 맵에서 검색
    • 있으면 숫자로 바꾸고 다음 input부터 다시시작, 없으면 마저 받기
  • 시간도 넉넉하고 길이도 짧길래 한글자씩 완전탐색함. 문자들이 다붙어있으니까 어디서끊어야될지 판단하려면 미리 딕셔너리를 만들어두고 그안에 들어있는지로 확인함.

2번) 거리두기 자리배치

  • bfs 하듯이 두번으로 지금 자리 기준 주위 두 칸까지 탐색
    → bfs가 뭐냐면...
    • dx[4]={-1,0,1,0}, dy[4]={0,1,0,-1}로 상하좌우 네방향 넣어둠. 두 번 움직이니까 첫번째때 갔던 인덱스 반대꺼는 두번째때 안 감. (0번-2번, 1번-3번)
  • 사람=P, 칸막이=X
    • P 기준으로 dx,dy 움직여서 탐색
      • 빈칸이면 다음탐색진행
      • P만나면 안되는 거니까 0 리턴
      • X만나면 탐색 ㄴㄴ (옆에 누가있든없든 상관없으니까)

3번) 행 위아래로 움직이면서 지웠다가 다시넣었다가 하는거

  • 스택 이용. 지웠던 거 스택에 쌓아두고 다시 복구하라하면 스택 위에서부터 하나씩 빼면서 복구
    → 스택이 뭐냐면.....
  • 행 길이만큼 OOOOO 표시해두고 현재 idx를 움직여가면서 그 인덱스 빼라하면 X로, 복구하라하면 O로 바꿈
    • X로 바꾸면 그 밑에 행으로 현재 idx를 바꿔야되는데 지금께 lastidx면 (밑에 행이 없으면) 위에꺼 봐야함 → lastidx를 계산해야함
  • 처음에는 업, 다운할 때마다 그 값만큼 idx를 움직였는데 시간이 너무 오래걸렸음.
    • 그래서 move 변수를 만들어서 저장함. (+면 아래로, -면 위로 그만큼 가라)
    • 그리고 지우기, 복구하기 할 때 move값 만큼 반영해서 현재 idx값 받아오고 move=0 초기화
int getlast(int k){
    for(int i=k-1;i>=0;i--){
        if(v[i]=='O') return i;
    }
    return 0;
}

int getidx(int k, int move){
    int n=v.size();
    int cnt=0;
    
    if(move>0){
        for(int i=k+1;i<n;i++){
            if(v[i]=='O') cnt++;
            if(cnt==move) return i;
        }
    }
    else if (move<0){
        for(int i=k-1;i>=0;i--){
            if(v[i]=='O') cnt++;
            if(cnt==-move) return i;
        }
    }
    return k;
}
  • k에서 move만큼 움직여서 새 idx받아오는 함수
    • move값 +면 아래로, -면 위로 가면서 O인 거 개수가 그만큼 채워질 때 인덱스 리턴
  • k가 없어질 때 마지막 idx 받아오는 함수
    • k 위에있는 제일 먼저나오는 O의 인덱스 리턴

→ 여기서 시간 오래걸려서 효율성 틀린 것 같음. 그래서 O를 하나하나 확인하는 방법 말고 펜윅 트리랑 이분탐색 써봄
→ 펜윅트리가 뭐냐면,,,, 이분 탐색이 뭐냐면,,,,

  • sum: 맨 위부터 idx까지 O인 거 개수 누적합
  • update: 변경사항 생기면 걔가 포함되는 구간들 갱신
  • l~r의 구간합이 move가 되도록 이분탐색함
// 이전까지의 합
int query(int idx){
    int ret = 0;
    while (idx){
        ret += map[idx];
        idx -= idx & -idx;
    }
    return ret;
}

// index 번째의 값 수정
void update(int index, int value){
    while (index <= 100000){
        map[index] += value;
        index += index & -index;
    }
}

// move index
int getidx2(int k, int move){
    int n = v.size();
    if (move == 0) return k;
    else{
        int now = k - query(k);
        int l = 0;
        int r = n;
        int m = (l + r) / 2;
        while (l < r){
            m = (l + r) / 2;
            if (m - query(m) >= now + move) r = m - 1;
            else l = m + 1;
            return r + 1;
        }
    }
}

아무튼 대충 2.5개 풀었다고 생각했는데 붙어서 놀랐다. 주변에도 이쯤 풀었는데 떨어진 친구들이 있었던 걸보면 커트라인이었나보다.

서류는 그냥 적당히 밤새서 자소서 썼다.


면접

사실 질문들을 미리 적어놨어야 했는데... 면접 끝나자마자 너무 기운 빠져서 + 아무 생각 안 나서 못 적었다.
그래서 지금와서 생각나는 것만 적어보려 한다.

맨 처음엔 코딩테스트 질문

기억나는 문제 있냐고 물어보셔서 2번 거리두기 문제랑 3번 표 넣다뺐다 하는 문제 기억난다고 대답했다. (4,5번은 못 풀었으니까)
그랬더니 그 문제들에 내 코드를 화면공유로 보여주시면서 왜 이렇게 했는지 설명해보라고 하셔서 쭉 얘기했다. 위에 정리해둔 게 도움이 많이 됐다.
꼬리 질문은 안 하셨다. 잘 설명해서 넘어가겠다는 말을 하셨다. (내가 좀 하나하나 다 짚어가면서 말하긴 했다.)

자기소개랑 지원서 질문

코테 질문이 15분? 정도 걸렸던 것 같고 그 다음에 짧게 자기소개 해보라고 하셨다. 내가 했던 프로젝트나 활동 같은 거 같이 얘기해달라고 하셨다.
내가 미리 준비해간 자기소개에는 지원동기가 스며들어있고 + 작년에 안드로이드로 넣었다가 떨어졌는데 왜 이번엔 iOS로 넣었는지도 스며들어있어서
아 그래서 iOS로 넣으셨구나~ 이런 대답도 해주셨다. (아마 내가 말 안 했으면 다음 질문으로 하지 않으셨을까)
프로젝트 얘기는 살짝만 했는데 그게 지원서에 파일첨부했던 이거냐 물어보시고 끄덕끄덕 하고 넘어가는 정도..

그리고 기술적인거, 인성(?) 질문들을 하셨다.

여기서 제일 중요한 점은
내가 검색해서 봤던, 친구에게 들었던 iOS 면접 후기들과 완전 달랐다. 엄청난 부바부, 면바면이다...
그래서 이 글을 보는 누군가도 이 질문들을 준비한다기 보다는 그냥 그렇구나 해줬으면 좋겠다. 그리고 잘 기억도 안 나고 순서도 뒤죽박죽이다.

기술 질문

  • 가장 자주 쓰는 언어가 뭐인지? → C++ 라고 했다. (코테를 C++로 봤으니까)
    • STL map, set, vector에 대해 짧게 설명해보기
    • 추상화 (abstraction) 란 뭔지?
    • 가상함수 (virtual function) 란 뭔지?

그 외에도 C++ 이나 객체지향 관련된 거 이거저거 물어보셨다. 근데 다 구체적으로는 안 물어보셨고, 간단하게 뭔지만 얘기하고 넘어가는 정도였다.

  • iOS 관련 질문
    • objective-C 써본 적 있는지? 쓸 줄/ 읽을 줄 아는지?
    • ARC가 뭐고 왜 필요한지?
    • Xcode 쓸 때 이런저런 설정들 (뭐 번들id 라던가 certificate나 그런 거) 건드려봤는지? 어떻게 해결했는지?

솔직히 Swift 관련된 거만 엄청 공부해갔는데 하나도 안 물어보셔서 약간 억울하고 아쉬웠다 ㅠㅠ (나중에 알게된 거지만 이 부서에서는 Swift 안 쓴다,,)

  • 만약 합격한다면 면접관님 부서에서 일하게 될 거라고 하셨다.
    • 네트워크에 대해 아는 게 있는지? + TCP, UDP 에 대해 아는지?
    • 암호화/복호화에 대해 아는 게 있는지?

아니요 밖에 대답을 못 했다. 정말 아는 게 하나도 없었다...... (사실 여기서 떨어질 줄 ㅋㅋㅋㅋㅋ...)

💡결론: 다양하게 다 공부하자!

그 외 질문들

  • 나한테 어떤 task가 주어졌는데 내가 못 하겠다면 어떻게 할 것인가?
  • 상사(?)가 잘못된 방향으로 진행한다면 어떻게 할 것인가?
  • 지금 서비스처럼 동작하는 앱을 만들어야하는 과제가 주어진다면 뭐부터 시작할 것인지? (얘랑 비슷한 질문 세 개 주시고 하나 골라서 답변하면 된다고 했는데 내가 고른 하나 밖에 기억이 안 난다)

대충 이런 뉘앙스의 협업, 동료, 방향성에 관한 것들도 물어보셨다.


면접 때 엄청 긴장했었고, 아는 것도 못 말하고 그랬다. 근데 하나 확실했던 건 그냥 솔직하게 생각나는 대로 말했다.

합격한 후에 (정식 입사 전에) 내가 일할 부서에 내 담당 멘토님과 한 시간동안 얘기 나눠보는 행사가 있었다.
내 직속 상사(?)이자 면접을 봐주셨던 분인데, 그때 나한테 얘기해주셨던 거 중에 가장 기억에 남는 게 카카오에서 같이 일하기 더 적합하다는 생각이 들었다고 하셨다.

이 말을 입사하고 나서도 되게 오래 생각해봤는데, 영입 홈페이지에 명시된 '카카오스러움'을 읽어보니 내가 그냥 평소에 추구하던? 생각하던? 그런 방향이랑 거의 다 맞아 들어갔다. 이걸 생각하면서 면접 때 대답하진 않았는데, 어쨌든 그렇게 운이 좋아서 붙은 것 같다.

앞으로 열심히 살 거다.

profile
안녕제인

11개의 댓글

comment-user-thumbnail
2021년 9월 24일

축하드려요! 이전 글에 아쉬움이 한방에 싹 가시네요! 잘 모르지만 응원할게요

답글 달기
comment-user-thumbnail
2021년 9월 25일

축하드립니다~~
인턴생활 화이팅하세요!!

답글 달기
comment-user-thumbnail
2021년 11월 4일

축하드려요 ㅠㅜㅠ 지금 2학년인데 어떻게 해야 이렇게 멋진 사람이 될지 막막하네요 ㅠ,,

답글 달기
comment-user-thumbnail
2021년 12월 25일

I found that solution is very popular and helpful: https://youtu.be/D8sgTFbag-U

답글 달기
comment-user-thumbnail
2022년 1월 8일

안녕하세요! 제인님의 글 정말 잘 읽었습니다!

혹시 제가 개인프로젝트로 개발 활동 리뷰글을 모으는 프로젝트를 진행하고 있는데
제인님의 게시물들이 너무 마음에들어서 제 프로젝트에 올려도 될까요!?
https://github.com/junghyeonsu/awesome-dev-activity-review
에서 해당 프로젝트를 보실 수 있습니다!

1개의 답글
comment-user-thumbnail
알 수 없음
2022년 5월 15일
수정삭제

삭제된 댓글입니다.

1개의 답글
comment-user-thumbnail
2022년 6월 14일

안녕하세요. 혹시 인턴 전환의 경우 20~30%정도만이 전환이 되었다는 썰을 들었는데 진짜인가요..? 정확한 수치는 모르시겠지만 느끼기에 얼마나 전환되었다고 느끼시는지 궁금합니다..! 그리고 전환되는 사람과 안되는 사람의 차이가 있다면 무엇인지 도움주신다면 정말 감사하겠습니다 ㅠㅠ

1개의 답글