알고리즘

삼성 Expert Programmer 후기

머리큰개발자 2022. 9. 21. 16:57

목차
21.11 ~ 22.09 내 소중한 토요일을 모두 바쳐가며 공부했던 Expert 가 마무리 되었다.

감상과 회고


SCSA16기로 합격하여
공채 SW검정 수준인 Advanced를 준비하면서
친구들과 스트레스 오지게 받던게 엊그제 같은데 뿌듯하다.

SCSA 6개월 과정 중,
고향집 침대에 누워서도 끊임없이
문제만 생각하고 고민했던 시간들이 새록새록 떠올랐다.
아침 8시부터 머리를 돌리면서 점심/저녁 시간에 잠시 숨을 돌리고,
다시 야간 자율학습을 시작하여
12시, 1시까지 알고리즘을 풀었었다.
거의 고3임
그게 한 3주 정도 됐었나?

다른 교과과정이 있어서 C, JAVA, NETWORK 등등 배우면서
알고리즘을 계속 풀었던 것이라서 더더욱 쉽지 않았다.
대학교 4년에 해당하는 내용을
(실제로 4년어치는 아닌 것 같지만, 알고리즘은 체감상 4년 치임ㅋㅋ)
머릿속에 때려 박는 과정이라 굉장히 괴로웠었다.
정수리에 김내면서 공부하고
시험 결과 나오기까지 벌벌 떨었던 기억도 난다.
워낙 힘들었어서 그런지
동기들과 엄청난 동질감과 친밀감을 갖게 된 것 같다.

공채 시험 후 입사하면서
입문 교육 때 받은 프로 교육을 토대로 Professional을 취득하였다.


내부에서 사용하는 등급은 삼성 상시SW역량테스트에서 Advanced 는 A형, Pro 는 B형, Expert는 C형에 해당한다.


이제부터는 비전공자라는 타이틀을 뗄 수 있지 않을까 기대한 것도 사실이었다.
하지만,
어딜 가도 부족한 경험과 배경지식은 내 발목을 부여잡고
앞으로 나가는 것을 망설이게 만들었던 것 같다.

채용TF 로 6개월간 활동하면서,
개발과는 거리가 먼 일들을 했었고
그것이 나를 더 불안하게 만들었다.

전공한 친구들,
경험 많고 잘하는 친구들조차도
이미 현업에서 개발을 배우고 있는데
나는 이렇게 있어도 괜찮을까?
막연한 불안감이 6개월간 점점 지수함수로 커졌다.

그래서 TF가 끝나갈 때쯤부터 시작한 것이 Expert 준비다.
뭐라도 공부하고 싶었고 뭐라도 코드를 짜보고 싶었다.

문제 푸는 것은 재미는 있었지만
내 불안한 마음을 안정되게 만들어 준 것은 아니었다.
원부서로 돌아올 시간이 되었을 때,
면접 때의 자신감과 패기는 이미 보이지 않았다.
나에 대해 스스로 할 수 있을까 의심하는 지경이었다.

실제로 프로젝트에서
선배님들의 빠른 머리회전과 템포에 맞추기는 굉장히 어려웠었고,
집에 와서 혼자 습득하는 과정은 괴로웠었다.
선배님들은, 자신은 많은 경험을 했기 때문에 아는 것이라고 말씀해 주셨지만,
그걸 감안하더라도 실제로 잘 이해가 되지 않아서 머리가 아팠다.
구조화하고 컴포넌트를 빼고 모듈화 하고..
그럼에도 불구하고 SCSA에서 배울 수 없던
지식이고 경험이기에 좋았다.
성장은 했지만 힘들었다고

프로젝트에 참여하면서 얹혀가면서
내가 어떤 것을 잘하나 궁금해졌다.
스터디에서 만난 리더분은
"코드를 머릿속에 많이 외울수록
프로그래밍 능력이 좋은 것이 아닌가"
라고 하셨다.

어떤 함수가 어디에 있고,
어떤 기능을 했는지에 대해 많이 기억할수록
속도/질이 더 좋아진다는 뜻이었다.
분명 생각할만한 주장이었지만,
나는 여기에 자신이 없었다.
프런트앤드를 접하면서
내가 기억하는 것이 엄청나게 적다는 것을 알았기 때문이다.
이 view는 어떤 컴포넌트로 이루어져 있었고,
어떻게 꽂아 넣었는지도 기억이 나지 않아
계속해서 봐야 했다.
역시 쉽지 않았다.

(회사가 학교인 줄 알아!?)


하지만 나를 더 자극했던 것은 "신입사원"과 "비전공자"라는 방어막이었다.

"아직" 아무것도 모른다.
"아직" 안 해봐서 자신이 없다.
"아직" 안 배웠다.

돈을 받고 일하는 프로지만
위의 두 방어막은 나에게 큰 방어막이자,
부정적인 감정으로 인해 절벽에서 떨어질 때
밑에서 날 받아주는 안전망 같은 존재였다.

언제든 원하면 배울 수 있어.
언제든 할 수 있어.
라는 생각은 자기기만이고 지나친 낙관이다.

내 능력에 대한 증명이 필요했다.
물론 알고리즘이 실무 능력과는 거리가 있다는 것을 잘 알고 있다.
하지만 최소한 "하라면 할 수 있는 사람" 임을 증명하고 싶었던 것 같다.
처음 시작은 문제 풀이가 재밌다였지만,
붙고 싶다는 생각은 인정에서 비롯된 것 같다.
그리 좋은 동기가 아닐지도 모르지만 최소한 나는 그랬다.

준비 과정

SAMSUNG ELECTRONICS 에는 따로 문제풀이 사이트가 존재하는 것으로 알고 있다.
하지만 SAMSUNG SDS에서는 공식적으로 자료를 구할 수 없다!
(또한 보안 서약을 했기 때문에 시험에 관련된 어떠한 직접적인 정보도 주기가 힘들다)

모든 어려움은 여기에서 시작한다.

시험에 관련된 정보나 후기를 보고 싶으면
SDS 내부의 후기를 보는 수밖에 없다.
문제 또한 어디서 구할 수 있는 내용이 아니기 때문에
문제를 갖고 있는 사람과 스터디를 하거나
지속해서 시험에 응시하여 스스로 복기해 보는 수밖에 없다.

백준에서 어려운 문제를 푸는 것도 좋고
LeetCode, SW Expert Academy, 정보올림피아드
문제를 푸는 것도 좋다.
어떻게든 코드에 익숙해지고
컴퓨터적인 생각을 하게 되면 가능성이 점점 올라간다.

 

JUNGOL

 

www.jungol.co.kr

나와 같이 공부한 한 친구이자 스승님은 정말 대단한 사람이다.
본인의 공부를 위해서 2가지 방식으로 문제를 풀었다.

하나는 극한까지 최적화하여 최고의 결과를 낼 수 있는 풀이.
하나는 제한시간 안에 구현할 수 있는 현실적인 풀이다.

나에게는 이것이 가장 연습할 때 큰 영향을 준 것 같다.
실제로 나는 한 문제를 풀 때 엄청난 시간을 들였다.

c형을 보면 시간제한이 4시간이다.
하지만 나는 4시간 안에 구현은커녕
4시간 안에 아이디어를 짜기도 버거웠다.
그럼에도 불구하고 어쨌든 풀어나간다는 사실에 집중했고,
한 문제를 풀 때마다
부족했던 구현 능력과 최적화 능력을 길러나갔다.


구현 능력은 다음과 같은 것을 의미한다.

1. 자료구조에 대한 구현
2. 본인의 아이디어를 코드로 옮기는 구현

1번은 정말 기초다.
사실 Professional까지 있다면 자료구조에 대한 구현은
어느 정도 궤도에 올랐다고 볼 수 있겠다.
하지만,
생각하지 않고 Merge Sort를 구현할 수 있는가?
Tree와 Linked list에 대한 이해가 충분하여
그것을 약간 변형하여 Trie 같은 응용도 할 수 있는가?
물론 다 할 수 있겠지만, 요점은
'실수'없이 '빠르게' 시간 안에 구현할 수 있어야 한다는 것이고
많은 연습을 요구한다.

2번은 생각보다 기르기 힘든 능력이다.
본인의 아이디어는 머릿속에 있지만
코드로 어떻게 옮겨야 할지 모를 때,
시험장에서 발을 동동 구르고 식은땀이 뻘뻘 나는 경험을 할 수 있다.
본인 아이디어의 논리가 빈틈이 없고,
에러를 발생시키지 않게 구현할 수 있어야 한다.
물론, 문제를 많이 풀다 보면 길러지므로
많은 경험을 해보자.


최적화 능력은 다음과 같은 것을 의미한다.

1. 필요하다면 자료구조를 통해 공간/시간 복잡도를 줄일 수 있다.
2. 필요하다면 불필요한 연산을 줄여 실행시간을 줄일 수 있다.
3. 필요하다면 컴퓨터의 특성을 이용해 실행시간을 줄일 수 있다.

1번과 2번은 알고리즘의 핵심이다.
모두 알다시피 우리는 최대한 비용을 적게 들이고 싶어서
알고리즘을 공부한다.
가령
Sparse 한 List를 Tree를 통해 효율적으로 검사할 수 있는가?
아예 가능성이 없는 경우를 탐색하고 있지는 않은가?
중복된 계산을 하고 있지는 않은가?
기본을 모르는데 그다음을 할 순 없으니 차분히 준비했다.

3번은 조금 특이하다.
함수에 접근할 때 발생하는 오버헤드,
local 변수를 사용할 때 발생하는 오버헤드 등
다양한 부분에서 고민해 보면 좋다.

시험 언어인 C/C++ 특성상
컴퓨터의 물리적인 부분을 직접 제어하고 예측할 수 있다.

가령 컴퓨터에 대해 배웠다면
Register Memory와 Hard Disk 가 어떤 차이가 있는지 안다.
혹은 CPU의 CACHE 가 어떻게 작동하는지를 안다.
이런 특징을 이용하여 더욱 실행시간을 줄일 수 있다.

구글링을 통해 해당 정보들을 얻을 수 있다.
C++ 최적화 기법, 혹은 compiler를 최적화하는 기법
혹은 어셈블리어 수준을 최적화하는 기법 등이 다양하다.
0.1초라도 줄이고 싶다면 읽고 차이를 직접 보는 것도 좋다.
Software optimization resources. C++ and assembly. Windows, Linux, BSD, Mac OS X (agner.org)
Optimizing compiler - Wikipedia

마치며

실제로 내가 본 Expert 몇몇 분은
하루 종일 문제 풀이에 대해 생각하고
최적화에 대해 생각하고
복잡도와 새로운 접근에 대해서 생각한다.
진정 Expert의 자세가 아닌가.

울 학교 교수님께서는
항상 자신이 해결하고자 하는 문제를 생각하고
많은 시간을 쏟아야지 과학을 할 수 있다고 하셨었다.
진정 몰입하고 끊임없이 고심하여야
한 걸음 나아갈 수 있다는 얘기가 아닐까 싶다.

천재는 전혀 다른 방향으로 크게 한 걸음 내딛지만
그것을 발전시키는 사람들은
그 발걸음을 훨씬 넓히고
더 멀리까지 나갈 수 있도록 노력하는 사람들이다.

계속 생각하고 몰입해 보자.
Expert 문제는 당연히
수학의 난제를 푸는 것이나
우주의 암흑 에너지를 밝히는 것보다는
훨씬 쉬운 일이다!

누군가는 재능이라고 말하지만,
분명 노력하면 충분히 따고도 남을 영역이다.

물론 아직 나는 다른 Expert 분들에 비해
실력도 떨어지고 아는 것도 적다.
운이 좋아서 붙은 것도 맞다.
하지만 자신감을 얻었으니 앞으로 더 성장할 일만 남아있다.
가자!! 다 이겨버리자!! 내 인생 파이팅!@!!@!@!@!@

'알고리즘' 카테고리의 다른 글

백준9935 문자열 폭발 - C++  (0) 2023.02.22
백준 9372 상근이의 여행 - C++  (0) 2023.02.22
백준4354 문자열 제곱 - C++ / KMP  (0) 2022.03.06
백준 1786 찾기 - C++/KMP  (0) 2022.03.06
백준13510 C++ 풀이 - HLD  (0) 2022.02.18