2022년 6월 10일 금요일 카카오 인턴 Data Engineering 분야 합격을 통보받았다. 그동안 실질적으로 혹은 정신적으로 도움받았던 수많은 후기글들을 생각하며 대학시절부터 취준과정을 정리해보았다.
1. 대학시절
이 글은 특히 대학시절을 정말 열심히 놀았고 꿈이 생겨 다시 시작하는 사람들에게 바치는 글이 될 것이다. 그 이유는 내가 그랬기 때문이다. 기둥이 약하면 집이 흔들리듯이 1학년때 너무 열심히 놀아버리니까 2학년이 힘들었고 군대를 갔다온 후에도 쉽지 않았다. 그렇게 졸업때 받은 학점은 3이 조금 못미치는 2점대.. 정말 내놓기 부끄러운 수준의 학점이다.
꿈이 생기기 시작했던건 졸업과제 프로젝트였다. 표정인식을 통한 이모티콘 생성기라는 CNN 알고리즘 기반 딥러닝 프로젝트를 하게 되었는데 데이터 수집과 전처리, 증강부터 딥러닝 모델링까지 도맡아서 했다. 처음으로 주도적으로 프로젝트를 진행하면서 "나도 할 수 있구나"하는 자신감을 얻었고 학습시킨 모델이 원하는 결과를 내는 모습을 보며 재미를 느꼈다. 그렇게 AI 혹은 데이터 관련 분야에서 일하고 싶다는 꿈이 생겼다.
대학시절을 다시 돌아갈 수 있거나 대학다니는 친구들에게 조언해달라고 하면 다음과 같은 조언을 하고 싶다.
1) 놀 땐 놀되, 추후에 커버가 가능할 정도로 놀자. 선수과목이 안되면 당연히 그 뒤의 과목이 커버가 되지 않는다. 보통 1학기때 이론수업을 들으면 2학기때 그에 대한 실습 혹은 실험을 하곤 한다. 언어를 제대로 배우지 않으면 당연히 자료구조 수업도 이해가 되지 않고 그러면 알고리즘 수업도 이해가 가지 않는다. 너무 많은걸 하라는건 아니다. 기본은 챙기자. 기본을 안 챙겨본 사람이기에 더욱 뼈져리게 느꼈다.
2) CS관련 기초과목 소홀히하지 않기 면접에서 물어보는 중요한 CS과목들이 있다. (자료구조, 알고리즘, 네트워크, 운영체제, 데이터베이스 등등) 해당과목들의 수업은 특히나 열심히 듣자. 때에 따라 어느정도 선택과 집중이 필요할 수도 있겠다. 혹시나 시험기간때 힘들다면...취준 미리 한다고 생각하고 열심히 공부하길 바란다. 나의 경우 거의 제로베이스에서 공부하는 느낌이었기 때문에 쉽지 않았다.
3) 알고리즘 스터디 하기 혹은 동아리 들기 어떤 회사를 들어가던 코딩테스트는 필수이다. 대학시절부터 대비했더라면 더 수월했지 않았을까 싶다.
2. 취준시절
코딩테스트 준비
어떤 회사를 가든 어떤 교육 프로그램(네이버 부스트캠프, 싸피, 소마, 우테코 등)을 참여하든 요즘 코딩테스트는 필수관문이다. 따라서 다른건 제쳐두고 코딩테스트부터 준비하기 시작했다. 제대로 시작한건 2021년 1월정도였다. 언어는 파이썬으로 정하였다.
왜 파이썬인가?
예전에 기초를 배웠던 점과 AI 혹은 데이터 분야에서 일하고 싶다는 생각, 코딩테스트를 치루기 쉬운 언어에 속한다는 점 등 다양한 요소를 고려하여 파이썬을 선택했다. 또한, 파이썬을 선택하는 사람들이 많아지는 추세이기도 했다. 언어별로 장단점이 있고 원하는 직무별로 다르니 각자 상황에 맞는 선택을 하길 바란다.
이것이 취업을 위한 코딩 테스트다 with 파이썬
처음 시작할 때는 나동빈님의 이것이 취업을 위한 코딩 테스트다 with 파이썬으로 시작했다. 솔직히 처음에는 BFS, DFS과 같은 개념들이 너무 어려웠고 책에 있는 문제들을 풀어내기 쉽지 않았다. 하지만, 유튜브에 있는 나동빈님의 강의를 참고하면서 개념정립을 하였고 관련 개념에 해당하는 백준 문제를 매일 적게는 1문제 많게는 10문제 정도까지 풀었다.
백준에서 푼 문제 수에 대한 월별 누적 그래프 (출처: solved.ac)
위의 그래프를 보더라도, 초반 2~3개월은 굉장히 열심히 한걸 볼 수 있다.
백준 온라인 저지
코딩테스트와 관련된 다양한 문제가 있다. 타 사이트(프로그래머스)와 다른 점은 인풋까지 설정해주어야 한다는 점이고 다소 지엽적인 문제나 비슷한 문제가 많긴 하지만 그 덕분에 알고리즘 연습하는데는 많은 도움이 된다고 생각한다. 그리고 그와 연계된 solved.ac를 활용하면, 푼 문제 수에 따라 티어가 올라가는 걸 볼 수 있어서 꽤나 동기부여도 된다.
한편, 백준에서는 알고리즘 카테고리별로 문제를 검색할 수 있어서 개념 공부 후, 그 개념에 해당하는 문제를 풀기 좋았다. 물론, 코딩테스트라는 시험은 어떤 알고리즘인지 알려주지 않으므로 문제를 보고 어떤 알고리즘을 써야하는지에 대한 감각도 기를 필요가 있을 것이다.
본인의 백준 활용법은 다음과 같다.
1. 책이나 강의 등으로 필요한 알고리즘 학습 후, 그에 맞는 문제 풀기 위에서 언급했던 방법이다. - 처음 알고리즘 공부를 할 때 - 추후에 부족한 알고리즘에 대한 학습이 필요할 때 - 코딩테스트 직전에 원하는 유형을 찾아서 연습 (회사별로 유형이 다르기 때문) 위와 같이 상황에 맞게 활용하였다.
2. 문제집 활용 문제집 현황 (인기순 정렬) 기초를 다질 수 있도록 문제집이 많이 구성되어 있다. 그리고 백준 강의 사이트를 보면 아래와 같이 문제집처럼 문제가 엮여있다.
이를 참고하여 문제를 풀어도 좋고 강의까지 들으면 더 도움이 될 것이다. (필자는 강의도 들었는데, 좋았다.) 한편, 어떤 알고리즘인지 알고 문제를 풀게 되면 코딩테스트 준비에 도움이 되지 않기 때문에 최근에는 알고리즘 스터디원들과 날짜별로 랜덤하게 문제를 정해놓고 풀었다.
3. 다른사람의 풀이보고 비교하기 문제를 해결했다하더라도 내가 짠 코드는 항상 부족하다. 다른 사람이 쓴 코드를 보고 배울 수 있는 점은 배우자. 특히, 내 코드보다 수행시간이 짧거나 코드길이가 짧은 코드를 주로 확인해보라. 수행시간이 짧다면 더욱 최적화(ex. 백트래킹에서 pruning, 더 효율적인 알고리즘 사용 등)된 코드일 것이고 코드길이가 짧다면 더욱 pythonic한 코드일 확률이 높다. (물론 변태적으로 짧은 코드 제외)
파이썬 알고리즘 문제풀이 (코딩테스트 대비)
그 후, 김태원님의 파이썬 알고리즘 문제풀이 (코딩테스트 대비)를 수강하였다. 개인적으로 DFS(특히, 재귀)에 대한 개념이 부족했는데 이 강의를 통해 부족한 부분을 채울 수 있었다. 특히, 백트래킹과 관련해서 큰 도움을 받았던 강의이다. 파이썬뿐만 아니라 자바, JS, C++도 있으니 참고하시라.
파이썬 알고리즘 인터뷰
한편, 파이썬 알고리즘 인터뷰라는 책도 좋은 책같아서 소개드리고 싶다. (개인적으로는 반정도밖에 못했지만..!)
다음과 같은 분께 추천드린다.
1. 리트코드라는 사이트의 문제로 책이 구성되어 있다. 따라서 기존에 백준이나 프로그래머스를 많이 풀어서 새로운 사이트가 필요하신 분 2. 문제별로 다양한 풀이를 접해보고 싶으신 분
그리고 위의 내용들과는 별개로 프로그래머스의 카카오 문제는 level1 ~ level3까지는 꼭 풀어보시길 권장드린다. (본인도 대부분 풀었다.) 개인적으로는 어느정도 알고리즘 실력이 올라왔다고 느꼈을 때 혹은 카카오 코딩테스트를 앞두고 있을 때 카카오 문제를 풀면 더 도움이 되지 않을까 생각한다.
코딩테스트에 대한 개인적인 소감
취준하면서 제일 열심히 했던 순간을 꼽는다면 이 때였던것같다. 하지만 힘들지 않았던 이유는 어릴적 수학문제푸는걸 좋아하던 나의 모습과 흡사했고 재밌었다. 이 길이 적성에 맞다고 느끼는 순간이었다. 특히, CS와 같은 이론 공부하다가 힘들면 알고리즘 문제를 풀곤 했다. 알고리즘 문제를 풀면 공부를 안하는 느낌(?!)인데, 실제론 공부를 한거니까 두 발뻗고 잘 수 있었다.
그렇게 백준기준으로 300문제정도 가까이 풀게 된 2021년 5~6월쯤부터는 대부분의 코딩테스트(네이버, 카카오, 라인, SK ICT, 11번가 등)에서 떨어진적이 없었다.
코딩테스트는 완벽을 요구하는 시험이 아니다. 수능에서 최저를 보는 것처럼 면접보러올 자격을 테스트하는 시험이다. 따라서 시험칠 때 모든 문제를 완벽하게 풀려고 하기 보다는 한 문제 한 문제를 신경써서 풀기 바란다. (실제로도, 동점자를 제외하고는 부분 점수는 주지 않으므로 한 문제라도 제대로 풀어야 한다.) 회사마다 그 때의 난이도마다 다르겠지만 보통 반정도 넘게 해결한다면 붙을 확률이 높다고 생각한다.
개인적으로는 카카오같은 감독없는 시험이 좋았다. 평소에도 음악들으면서 코딩이나 공부하는 걸 즐기는 편이기 때문에 음악들으면서 시험칠 수 있었기 때문이다.
아! 그리고 속된말로 자다가 일어나더라도 DFS 혹은 BFS를 풀어라고 하면 5분안에 작성할 수 있도록 풀어야 한다고 생각한다. 그정도 각오는 가지고 시작하자.
코딩테스트 준비 팁
1. 다른 사람과의 코드 비교 위에서도 서술했지만 백준의 경우 문제를 맞추면 다른 사람의 풀이를 볼 수 있으므로 다른 사람의 코드를 보면서 배울 것은 배우자. 또한, 스터디를 한다면 스터디원들의 코드를 보면서 배울 점은 배우자.
2. 회사별로 자주 나오는 유형 혹은 최신 경향 익히기 회사별로 자주 나오는 유형이 있다. 물론, 시험마다 다를 수도 있겠지만 카카오는 문자열을 좋아하고 네이버는 구현을 좋아하는 등 회사별로 특징이 있다.
그리고 요즘은 확실히 어려운 알고리즘을 외워서 활용하기보다는 빡구현 위주로 많이 나오는 것같다. 개인적으로 추천하는 문제는 아래와 같다. 배열 돌리기나 상어문제같은 경우 시리즈가 다양하다. 빡구현 추천 문제: 삼각 달팽이, 배열 돌리기, 삼성 기출문제(ex. 상어 시리즈)
3. 블로그 혹은 깃허브 레포지토리에 정리하기 그냥 문제만 풀고 넘기기보다는 블로그나 깃허브에 정리해두자. 그것만으로도 그동안 열심히 해왔다는 포트폴리오가 되지 않겠는가.
4. IDE 적응 요즘 대부분의 코딩테스트는 프로그래머스에서 진행되므로 프로그래머스 기준으로 설명하겠다. 당연히, 프로그래머스에서 연습을 많이 하자. 그리고 회사별로 외부 IDE를 사용할 수 있는지 없는지 여부가 다를 것이다. 만약 사용할 수 없는 환경이라면 주의해야 한다. 프로그래머스에서는 어떤 부분에서 에러가 났는지 알려주지 않기 때문에 직접 문제를 풀어보면서 디버깅 연습을 하자.
5. 코드 리뷰하기 면접을 가더라도 코딩테스트에 대한 얘기를 할 때가 많다. 특히, 카카오처럼 감독을 하지 않는 시험에서는 풀었던 코드를 백업해두자. 그리고 코드에 대한 리뷰를 하자. 시간제한에 있는 시험이기 때문에 나중에 다시보면 당연히 고칠게 산더미다.
6. DFS 혹은 BFS 바꿔풀기 이제부터는 개인적인 팁이다. 대부분의 브루트포스 문제는 대개 DFS나 BFS중 하나를 선택하게 된다. 따라서 DFS문제중에서도 BFS로 해결할 수 있는 문제가 있고 BFS문제 중에서도 DFS로 해결할 수 있는 문제가 있다. 본인은 어떤 문제를 풀 때 DFS나 BFS 두 방식으로 풀면서 DFS와 BFS에 익숙해지려고 노력했다.
물론, DFS와 BFS는 성격이 다른 알고리즘이다. 예를 들어, 최단경로 문제같은 경우 DFS로 풀면 모든 경로를 탐색해야하므로 쓰이지 않는다. 따라서 BFS를 통해 매번 depth를 체크하고 목표지점에 도달하면, 값을 리턴하고 종료하는 식으로 해결한다. 이러한 경우에는 굳이 DFS로 바꾸어 풀지 않아도 된다.
DFS와 BFS에 익숙해지기 위해서 서로 바꿔가면서 풀어본다는 점이 포인트이다.
7. 문제 풀이 시나리오 설계 개인적으로 중요하다고 생각하는 부분이고 알고리즘 공부를 어느정도하면 느낄 수 있다고 생각한다.
문제를 보고 어떤 알고리즘을 써야하는지 안다면 문제를 빠르게 풀 수 있을 것이다. 하지만, 쉽지 않다. 따라서 문제를 풀 때 다음과 같은 시나리오를 거치자.
1) 브루트포스(완전탐색)으로 해결하자. 2) 브루트포스로 풀었는데 시간초과가 난다면 백트래킹 문제일지도 모른다. pruning을 놓친 부분이 없는지 체크하자. 3) 그래도 문제가 있다면, 아예 다른 방식이 필요하다. DP 혹은 이분탐색으로 풀 수 있는지 생각해보자.
물론, 위의 과정을 따르지 않는 경우도 있고 바로 어떤 알고리즘을 사용할지 안다면 베스트 일것이다. 사실 몇가지 알고리즘들은 하나의 세트라고 생각한다. (브루트포스(완전 탐색)문제는 보통 DFS, BFS로 해결이 가능하고 여기서 pruning을 하면 백트래킹이 되므로...)
한편, 백준 사이트나 카카오 코딩테스트처럼 시간초과를 바로 알려주는 경우에는 위와 같은 방법이 도움이 될것이다. 다만, 다른 코딩테스트시험은 몇가지의 간단한 예시만 주어지는 경우가 많기 때문에 스스로 엣지 케이스나 알고리즘을 생각해야 한다. 현재 생각나는 시나리오는 다음과 같다.
1) 제약조건에서 고려해야 할 N의 범위가 넓다면 이분탐색을 고려한다. 2) 제약조건에서 A와 B가 적당히 작은데 브루트포스로 풀면 안될것 같다면, A와 B 크기만큼의 DP 배열을 생성해보면 문제가 풀릴것인지 고려해보자.
개인적인 파이썬 팁
1. 입출력
백준문제를 풀다보면, 입출력을 직접해야 하는 경우가 생긴다. 처음시작할때는 입출력조차도 제대로 들어갔는지 몰라서 매우 힘들다. 필자는 다음과 같은 방식으로 입출력을 진행하였다.
import sys
# 그냥 input을 사용할 수도 있지만, sys를 통해 선언하면 시간초과에 도움이 된다.
input = sys.stdin.readline
# 4 5
# 위와같이 숫자를 띄워서 인풋 받아야하는 경우
a, b = map(int, input().split())
# 4 5
# 만약 리스트로 만들어야 한다면, 위에다가 list만 씌워주자.
arr = list(map(int, input().split()))
2. 재귀
파이썬의 기본 재귀 깊이 제한은 1000으로 매우 얕은 편이라고 한다. 따라서 백준 문제를 풀거나, 코딩 테스트를 칠 때 에러가 날수가 있다. 따라서, 재귀 문제에서 다음의 코드를 활용하여 제한을 늘리자.
import sys
sys.setrecursionlimit(10 ** 6)
3. 파이써닉한 코드
파이써닉하다는 뜻은 말그대로 파이써닉하다는 것이다. 아직 나도 부족해서 많은 것은 알지 못한다. 다만, 코딩테스트를 준비하면서 기억나는 부분만 소개한다.
1) 리스트 컴프리헨션
리스트 컴프리헨션을 사용하면 짧으면서도 기본 for문보다 속도가 빠르다.
# 리스트 컴프리헨션을 사용하지 않은 예
numbers = []
for n in range(1, 10+1):
numbers.append(n)
# 리스트 컴프리헨션을 사용한 예
numbers = [x for x in range(10)]
2) map 함수 활용
문제를 풀다보면, 이중 리스트에서 여러가지 연산을 해야하는 순간이 온다. for문을 여러번 돌리기보다는 각 리스트에 같은 함수를 적용하는 map함수를 사용하면 어떨까? 훨씬 깔끔하다.
arr = [[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14]]
# 리스트별로 최소값을 구하고 그 중 최대값을 반환해야 하는 경우
# 답: 11
ans_1 = max(map(min, arr))
# 리스트의 길이중 최소를 반환해야 하는 경우
# 답: 4
ans_2 = min(map(len, arr))
4. for ~ else 구문
많은 사람들이 잘모를 것이라고 생각한다. 필자도 백준 문제를 풀다가 다른사람코드를 보며 알게되었다. 구체적인 예시는 기억이 안나지만, 정말 많이 쓰인다. 원래는 변수를 두고 그 변수에 if문을 추가해서 break를 거는 식으로 해결하였었는데, for ~ else 구문을 활용하니 코드가 훨씬 직관적이고 깔끔해졌다.
arr = [1,2,3,4,5,6,7,8,9,10]
# for 문 진입
for k in arr:
if k == 11:
break
# break없이 모든 for문을 진행하게되면 else문 진입
else:
print("else 진입 !!!")
5. defaultdict 활용
해쉬문제에서 딕셔너리를 활용해야 하는 경우가 많다. 경험상으로는 1~2번문제에서 많이 나왔다. 그냥 딕셔너리보다 defaultdict을 활용한다면 더욱 유용한 점이 많다.
int로 인자를 두게 되면, 어떤값을 key로 넣어도 0으로 value가 나온다. 그냥 딕셔너리의 경우에는 keyerror가 발생한다.
따라서, 보통 개수를 세어야 하는 문제에서 많이 사용한다. 0으로 초기화되어 있기 때문에 따로 값을 넣어주지 않아도 +1만 해주면 되기 때문이다.
2) 다양한 인자 활용
위에서 int와 같은 인자를 줄 수가 있는 것처럼 int나 list, set 등 다양하게 인자를 줄 수 있다. list같은 경우에도 빈리스트로 초기화를 시켜주기 때문에 유용하다.
CS 준비
이제 코딩테스트에 대한 준비는 되었다. 면접을 위해서
B 혹은 C로
스터디, 강의, 책
포트폴리오
사이트
깊게 공부하다보면 봐도봐도 이해가 안될 때가 있다. 그럴땐 아무리봐도 시간만 낭비다. 그 시간에 좀 더 가벼운 내용이나 다른 공부를 하였고 다음과 같이 스티커 메모에 적어놓고 나중에 다시 볼 수 있도록 했다.
멘탈 관리
개인적인 생각
요즘은 유튜브, 인프런, KOCW, 다양한 블로그, 깃허브 등 무료 혹은 유료로 공부할 수 있는 사이트가 너무 많다. 따라서 자료가 없어서 공부를 못한다는 것은 핑계라고 생각한다.
그리고 개인적인 생각은 분야별로 차이가 있고 운칠기삼이라고 얘기를 많이 하지만, 한가지만 바라보는 사법고시, 행정고시, 임용고시 등을 준비하는 분들에 비해서는 어느정도 갈 수 있는 회사도 많고 노력만 한다면 충분히 해낼 수 있는 분야라고 생각한다.
특히 코딩테스트의 경우, 직접 부딪히고 느껴보았으면 한다.
3. 그 이후
개인적인 사정으로 빠르게 퇴사를 했었습니다. 그 후, 시간을 거쳐 현재는 다른 회사에서 일을 하고 있네요. 오래전에 썼던 글이고 요즘과는 경향이 다를 수도 있습니다. 하지만, 이 글을 쓸 당시에는 굉장히 신경써서 썼던 글이고 누군가에게 도움이 될 수 있었으면 하는 마음으로 비공개에서 공개로 전환합니다. 감사합니다.