코딩 테스트/기타

2022 코테 결산 및 공부 방법 추천 - 2

셩잇님 2023. 5. 26. 03:53
반응형

 

 > 이번 영상은 추천 공부 방법에 관한 포스팅이다.

 

혹시 나는 이렇게 공부 중인가?

1. 해설과 정답 코드를 보면서 문제를 해결하면 성공이라고 생각하는가?

2. Main 함수 하나에 모든 코드를 전부 작성 중인가?

3. 틀렸을 때 멘탈이 붕괴되어 아무것도 못하겠는가?

4. 시험만 보면 제 실력이 안 나온다고 생각하는가?

5. 한 번 풀었던 문제는 다시 풀 가치가 없다고 생각하는가?

 


 

이러한 방식을 추천합니다.

 

1. 정확히 이해하고 넘어가자.

 정확히 이해한다에서의 정확히의 개념은 '남한테 내가 설명할 수 있어야 한다.' 정도이다. 즉, 풀이 글을 써야 할 경우 막힘없이 문제 설명부터 코드까지 모든 것을 설명할 수 있어야 한다. 이렇게 해야 정확히 이해한다고 볼 수 있다. 그렇지만 '시간이 없는데 모든 문제에 어떻게 다 이렇게 적용하는가?'라고 생각할 수 있다. 그렇지만 3-4시간을 소요해서 한 문제를 완벽하게 이해해서 다음에 비슷한 유형의 다른 문제가 나와도 풀 것인가? 그렇지 않으면, 30분 만에 제대로 이해하지 못한 채 문제를 풀어서 다음에 약간 유사한 유형으로 나온 문제를 못 맞히고 넘어갈 것인가? 둘 중 선택하라고 하면 대부분 모두 전자를 선택할 것이다.

 

 그렇다면 어떻게 해야 정확히 이해하고 넘어갈 수 있을까?, 두가지 방법이 있다.

1-A. 짝을 이루어 서로에게 설명하라.

 코테 준비하시는 분들이 스터디를 종종 하시는데, 스터디가 잘된 그룹이 있고, 안된 그룹을 많이 보았습니다. 잘 된 그룹들의 공통점은 바로 개개인이 문제를 각자 푸는 것이 아닌 같은 문제를 서로 각자 풀고 다시 서로에게 나는 이렇게 풀었라고 설명하는 과정을 거치는 것입니다. 예를 들면 짝을 이루어서 한 명은 설명자 한 명은 청취자가 되는 것이에요. 설명할 때에는 문제 설명부터 풀이, 접근방식, 코드 전부 다 설명을 하는 것인데,  문제를 설명하는 사람은 최대한 디테일하게 설명하고, 듣는 사람이 이 문제를 전혀 모른다는 가정하에 디테일하게 설명을 해야 해요. 듣는 사람은 최대한 비판적으로 들어야 해요. '네가 지금 말하는 것이 논리적 결함은 없는지, 빈틈은 없는지 아니면 문장 구성은 잘 맞추고 있는지, 빠트린 설명은 없는지, 트집이란 트집을 다 잡겠다.'는 생각으로 들어야 해요. 또한 설명자는 중간중간 체크포인트를 잡아 궁금증이나 태글을 물어봅니다. 듣는 자는 "이해했습니다. 이해 못 했습니다." 디테일하게 대답해주어야 합니다. 문제 풀이도 설명과 같이 정답을 바로 얘기하지 말고, 어떻게 접근했는지 얘기해야 합니다. 이러한 방법은 면접에서도 유리한 방법입니다. 면접장에서 실제로 해야 하는 일이기 때문입니다. 또한 스스로 정확히 이해했는지에 대해 느낄 수 있습니다 :) 설명이 쉬운 것이 아니에요~ 처음에는 어렵지만 나중에는 분명 좋아집니다.

 

1-B. 주석을 정말 완전 최고로 열심히 달기

> 주석을 문장 형태로 대본을 작성한다고 생각하고 작성하기. 어색한 부분은 전부 제대로 이해하지 못한 것

- 변수들은 의미를 설명하기

- 함수들은 입력, 출력, 그리고 시간 복잡도를 설명하기

- 각 줄마다 문장으로 설명하기

 

 코드가 100줄이면 주석도 100줄이어야 합니다. 개인적으로 과외나 수업 때 사용한 방법입니다. 서로 이해도가 엄청 높아지는 작업이에요. 예를 들면 Q, N, M이 무엇을 의미하는지, 구조체 안의 변수는 무엇을 의미하는지 등 다 작성해야 해요. 주석이 없는 코드도 보여드릴게요. 

 

  

 주석이 없으면 제가 짠 코드인데 10년 뒤 보자마자 알 수 있을까요?, 아니면 출력을 했는데 틀렸어. 그러면 어디가 틀렸는지 금방 찾을 수 있을까요?, 저도 못해요. 이 코드를 주석 달면 코드 길이는 늘어나는 건 분명해요. 그렇지만 한 문장을 읽었을 때에 이 함수가 무슨 역할을 하는지 알 수 있어요. 이 코드는 10년 뒤에 봐도 알 수 있어요. if 조건도 다 나열해 놓으면 어떻게 처리할지 알 수 있으므로 나중에 문제 찾을 때에도 편해요. 또한 이해를 잘하고 있는지에도 알 수 있어요.

 


 

2. 시간을 정해 놓고 풀자.

 코테는 정해진 시간제한이 있기 때문에 시간을 정해놓고 풀어야 하는 습관을 가져야 해요. 무한정의 시간 혹은 너무 적은 시간을 쓰면 안 돼요. 어려운 문제라도 어려우니까 못 풀 거야 하고 풀이를 보지 말고 시간을 정했으면 정한 만큼 쓰고 덜 쓰거나 덜 쓰지 마세요. 

 

추천드리는 난이도에 맞는 유동적인 시간은 아래와 같아요.

* 삼성 기출 : 2시간

* ~Gold : 최소 30분 ~ 최대 2시간

* ~Silver : 최소 30분 ~ 최대 1시간

 

 최대 시간은 시험 환경에 익숙해지기 및 코테 이외에도 공부할 내용이 많기 때문에 설정해야 해요. 이렇게 하다 보면 실제 시험에서도 난이도에 맞는 만큼 시간을 쓸 수 있는 훈련이 될 것입니다. 만약 시간을 정하고 풀었는데 시간을 다 채우고 못 풀었다?, 하시면 못 풀었다 좌절하지 말고 바로 멈추세요. 아쉬워도 쓰던 코드도 멈춰야 해요. 그리고 내가 찾았던 방법 및 코드를 잘했는지 해설을 보고 확인하세요. 두 시간 동안 관찰하고 접근한 것을 실제 해설을 보니 더 많은 관찰이 필요했다.라는 말은 2시간 안에 내가 해야 하는 관찰을 못 한 것이기 때문에 과감하게 실패했다고 인정하시고 모든 과정을 처음부터 다시 하세요. 처음부터 한 문제를 10시간 동안 붙잡고 푸는 것보다 2시간씩 잘라서 5번 반복하는 것이 훨씬 더 좋습니다. 왜냐하면 첫 번째에 2시간 안에 못 풀더라도 해설을 보고 이해한 뒤에 재 도전하면 2시간 내에 할 수 있으며, 그때에도 실패하면 또다시 할 때 풀 수도 있을 거예요. 조금씩 자신의 이해도가 올라가면서 문제에 대해 농도 있는 이해도를 가질 수 있어요. 이것이 탄탄한 기본기가 될 거예요. 상한선은 중요해요. 시간을 정하지 않고 풀면 늘어지게 됩니다.

 

그렇다면 의문이 들 거예요. "2시간 동안 문제를 풀었던 것을 지우고 다시 푸는 것이 의미가 있나요?" 단언컨대 "그렇다."고 말씀드릴 수 있어요. 왜냐하면 사람들의 착각 중 하나가 다른 사람의 풀이를 보고 "아하~! 난 이해했어." 하고 넘어가는 것이에요. 그러면서 풀이 코드를 보고 내 코드를 수정하고 정답 맞으면 그냥 넘어가는 거예요. 이러면 안 돼요. 대부분의 사람들이 하는 착각이 내가 풀이 코드를 읽었다고 해서 내가 이 풀이를 정확히 이해했다고 생각하는 거예요. 대부분 이해했다고 착각하는 행위예요. 절대로 한번 보고 이해할 수 없습니다.

 

 그래서 다시 푸는 것이 의미가 있습니다. 다시 풀다 보면 내가 어디서 막혔고, 왜 오래 걸리는지 나는 알아요. 다시 풀었을 때 이런 부분이 셀프로 확인할 수 있어요. 또한 똑같은 실수를 또 했는지 확인할 수 있어요. 이러한 실수를 고쳐 잡아야만 코테를 합격할 수 있어요. 또 첫 번째 풀 때에는 2시간이 걸렸는데 두 번째 풀 때에는 1시간이 걸렸어요. 이렇게 정확히 이해하고 시간이 줄었는 지를 명확하게 측정할 수 있어요. 측정이 불가능하면 개선이 안 돼요. 개선을 하려면 측정을 해야 해요. 다이어트를 하려면 몸무게를 먼저 재야 해요. 몸무게를 안 재고 다이어트를 할 순 없어요. 코테에서 측정이 문제를 다시 푸는 행위 혹은 남들에게 설명하기라고 생각해요.

 


 

3. 다음 질문들에 대해 대답해 보자.

Q. 시간 복잡도는?

A. 스텝마다 계산하고 설명하기

Q. 공간 복잡도는?

A. 사용한 자료구조마다 계산하고, 설명하기

Q. 어려웠던 부분은?

A. 어떻게 해결했는지 설명하기

 

 라이브 코딩 테스트를 하다 보면 공통적으로 모든 회사가 위와 같은 질문을 해요. 어려웠던 부분은 문제가 어려웠던 것도 의미하고, 개선을 할 때에 곤란했던 부분일 수도 있어요. 모든 문제에 시간/공간 복잡도와 어려웠던 부분은 무엇인지 문제를 다 푼 뒤 스스로에게 꼭 물어보세요. 각 스텝마다 시간 복잡도가 얼마인지 계산하고 그렇기 때문에 전체 시간 복잡도가 얼마인지를 알아야 해요. 공간 복잡도도 마찬 가지예요. 자료구조를 명시하고 자료 구조의 연산도 명시하여서 이를 통 틀어 공간 복잡도가 얼마인지 계산해야 해요. 어려웠던 부분은 문제가 쉬워서 얘기할 것이 없다 그래도 쥐어짜 내서라도 말해야 합니다. 어려웠으면 어려웠던점을 얘기하면 되요.

 

 

 


[QnA]

 

Q. 그렇지만 하나에 5시간 걸리는데 또 문제를 쳐다보기 무서워요.

A. 그렇지만 처음에는 5시간 걸리더라도, 다음에는 2시간, 다음에는 1시간 걸릴 것입니다. 점점 더 문제를 푸는 데 빨라지실 거예요. 왜냐하면 풀이에 대한 이해도가 증가하기 때문이에요. 첫 번째 풀 때 5시간 걸린다면, 정확하게 이해 못 하신 거예요. 어떻게 한 문제를 푸는데 5시간 걸리나요. 그렇지만 일주일만 지나고 다시 풀어보면 문제가 새롭게 느껴지면서 동시에 훨씬 더 빨리 푸는 자신의 모습을 볼 수 있을 거예요.

 

Q. 서로에게 설명하기는 온/오프라인 상관없나요?

A. 네. 상관없습니다 :)

 

Q. 코테 언어를 통일해야 하나요?

A. 전혀 없어요. 문제 설명, 풀이 설명까지만 해도 충분해요. 코드까지 설명하려면 통일이 필요하지만 풀이 까지는 언어랑 전혀 관계없어요. 예를 들어 오프라인에서 면접관이 C++을 모르지만, 면접자가 C++을 사용한다고 해도 아무런 문제가 없습니다. 면접관이 보고 싶은 것은 문제, 풀이 설명 및 소통이에요. 코드는 잘 짜고 못 짜고는 정답으로 충분하기 때문에 코드 설명이 중요하지 않다고 봅니다. 코드 없이 사람의 말로 풀이 설명까지 해야 해요. 또 다른 예로는 제가 해몽을 파이썬으로 한다고 해서 여러분이 이해를 못 하시나요?, 마찬가지예요. 언어는 중요한 것이 아닙니다.   

 

Q. 주석을 달면서 문제를 풀면 주석도 고치고 코드도 고쳐야 해서 손이 더 많이 가요. 다 풀고 주석 작성하는 것은 쉬운데 풀면서 다는 것이 너무 번거로워요.

A. 어쩔 수 없어요. 번거롭다고 하지 않으면 디버깅할 때 힘들어요. 코드가 길어질수록 어디가 틀렸는지 찾기 힘들어요. 코드가 300줄인데 주석이 달려있다면 틀렸을지라도 어디가 틀렸는지를 코드를 읽어볼 때 훨씬 더 빠르게 찾을 수 있어요. 그래서 저 또한 코드를 작성하며 주석을 달아요. 

 

Q. 다시 풀 때는 언제 다시 풀어야 할까요?

A. 일주일 뒤에 푸세요! 모든 문제를 일주일 뒤에 풀 필요성은 없고, 어려웠던 문제, 내가 정한 시간 내에 못 풀었던 문제는 꼭 푸셔야 해요.

 

Q. 설명해 주시는 과정을 거치고 나면 답지를 봐도 몇 주 뒤에 다시 풀 필요는 없나요?

A. 과정의 문제가 아니라, 못 풀었을 때 다시 푸는 것을 얘기합니다. 어렵거나 내가 정했던 시간을 초과한 문제들을 우선적으로 다시 푸세요.

 

Q. 다시 푸는 과정은 완전히 이해할 때까지만 하면 될까요?

A. 네. 남한테 설명할 수 있을 만큼 잘 풀었으면 어차피 다시 풀어도 얻을 것이 없습니다. 반대로 다시 풀었는데 얻는 것이 있다면 내가 정확히 이해 못했다는 뜻입니다. 정말 이해했으면 다시 풀어봤자 얻을 것이 없기 때문입니다.

 

Q. 문제 풀 때마다 설계와 테스트 케이스 작성하는데 시간을 쏟는 편입니다. 푸실 때 설계 및 테케 작성에는 어느 정도 시간을 투자하시나요?

A. 엄청 많이 씁니다. 제 영상 중 삼성 기출을 푸는 라이브 영상이 있습니다. 라이브 영상은 어느 정도 레벨의 설계 및 시간을 얼마나 쓰는지 직접 보실 수 있어요. 시간 날 때 보시는 것을 추천합니다.

 

Q. 문제를 풀었다면 오케이인가요?, 그렇지 않으면 다른 사람코드 보면서 더 좋은 풀이를 배우는 게 좋을까요?

A. 문제를 풀었다면 오케이인 것은 아닙니다. 아까 말씀드렸던 것처럼 남들에게 설명할 수 있을 정도여야 오케이입니다. 또한 특정 알고리즘에 대해 공부 중이라면 다른 사람의 코드를 보는 것도 추천해요. 예를 들어 내가 그래프 탐색에 대해 공부하고 있어요. 넓이 우선 탐색을 이용해 코드를 짰는데 맞았어요. 근데 이러한 대표적인 알고리즘들은 테크닉적인 부분이 코드에 녹아들 수 있어요. 어떻게 짜야 쉽게 짜고, 빠르게 짤 수 있는지에 대한 것들은 다른 사람 코드를 보면 도움이 될 때가 있습니다. 그래서 어떤 알고리즘을 배우고 있다고 할 경우, 다른 사람의 코드 보는 것도 좋습니다.

 


 

[예시]

추천 공부방법을 어떻게 하는지 알려드리고 싶어 저와 짝을 이뤄서 설명하는 것을 해볼 예정입니다. 제가 말하는 사람이 되어 두 가지 문제를 설명하고 영상을 마치고 3부에서는 문제에 대한 풀이를 하겠습니다. 여기서 짝을 이뤄서 설명하는 방식을 제가 말하는 사람입장에서 해볼게요. 여러분이 스터디에서 이러한 방식을 쓰고 싶다면 제가 하는 그대로 해보시면 좋을 것 같아요. 실제 기출 기반 문제이며, 이 중 한 문제는 채점이 가능합니다.

 

 > 문제 설명에 대한 내용은 생략한다.

 


 

[결론]

1. 정확히 이해하고 넘어가자.

2. 시간을 정해놓고 풀자.

3. 시간/공간 복잡도와 어려웠던 부분에 대해 스스로 대답하자

 

 

반응형