코딩 테스트/기타

코딩테스트 공부, 나는 잘 하고 있는걸까?

셩잇님 2023. 5. 24. 00:25
반응형

 

 

 본 포스팅은 유튜브 '류호석'님의 '코딩 테스트 공부, 나는 잘하고 있는 걸까?' 영상을 참고하여 작성한 포스팅입니다. 영상의 원 저작자인 호석님에게 포스팅 허락을 맡은 게시글임을 미리 밝힙니다. 

 

영상 출처 : https://www.youtube.com/watch?v=J0P9MvGcFgQ&ab_channel=%EB%A5%98%ED%98%B8%EC%84%9D 

 

 해당 영상은 다른 영상과는 달리 기업의 코딩테스트 해몽(=풀이) 영상이 아니다. 호석님이 많은 사람들에게 많은 지식을 전달하면서 느꼈던 점을 영상에서 전하고자 한다. 호석님은 사람들에게 백날, 천날 말해봤자 자신의 말을 제대로 전달받지 못하는 사람이 종종 있다고 한다. 그런 사람들이 공통으로 하는 실수는 무엇인지, 또 나 자신에게도 스스로 나 또한 그러고 있지 않은지?를 진단하기 위해 알려주시고자 한다.

 


 

 > 첫 번째 콘텐츠인 호석님 프로필 소개 및 연혁은 생략한다.

 

 두 번째 콘텐츠는 호석님이 개인 1:1 카톡방 및 다양한 알고리즘 오픈 카톡방에서 질문받았던 것들 중에 가장 많이 질문을 받은 것들에 대해서 얘기한다. 그중 첫 번째로는 "무슨 언어를 써야 하나요?"이다. 호석님은 이에 대한 대답을 하기 전에 꼭 드리고 싶은 말이 있다고 말씀하신다. 이는 무엇을 공부하든 염두에 두었으면 했으면 좋겠다고 하셨다. 

 

 사람이 살면서 한 번쯤 공구함이 필요해서 만납니다. 이때 드라이버의 주요 목적은 나사를 조이는 행위입니다. 또는 무엇을 고정시키기 위한 행위가 목적입니다. 근데 그 목적을 달성하기 위한 드라이버의 종류가 엄청 많죠. 이렇게 뭔가 같은 목적을 위한 수단이 여러 가지 일 때 꼭 염두에 두어야 할 것이 있습니다. 왜 여러 가지일까?라는 생각을 한 번만 해보세요. 대답은 항상 똑같습니다. 대답은 뭐 하나 완벽한 것이 없기 때문에 여럿인 것입니다.

 

 예를 들어 드라이버 하나가 모든 면에서 가격도 좋고, 내구도도 좋고, 목적에 대해서도 엄청 하나가 높은 스코어를 달성하고 있으면 다른 드라이버를 만들 필요가 전혀 없잖아요. 그럼에도 불구하고 여러 드라이버가 있다는 것은, A라는 드라이버는 가격이 좋은데 내구도가 낮고, B라는 드라이버는 가격은 안 좋은데 내구도는 높아요. 또 C라는 드라이버는 내구도도 가격도 어느 정도 되는데 힘이 세요. 즉 '목적에 따라 장/단점이 다르기 때문에 여러 드라이버가 존재한다.'라고 이해하시면 될 것 같아요. 만약 엄청나게 완벽한 드라이버가 나와서 모든 드라이버를 대체할 수 있다? 그럼 드라이버를 이렇게 여러 종류로 만들지 않을 것입니다. 마찬가지입니다. 언어도 똑같아요. 한국어가 있고, 영어가 있고, 프랑스어가 있고, 일본어가 있고 중국어가 있지만, 이 중에 진짜 모든 면에서 가장 월등하게 좋은 언어가 없기 때문에 전 세계 언어가 통일되지 않고 있는 거잖아요. 이는 파이썬과 C++, 자바에도 해당하는 개념입니다.

 

  그러면 본문으로 돌아가서 "코딩테스트를 어떤 언어로 공부해야 하나요?" 하실 수 있어요. 그렇지만 그러한 질문을 하실 때에 분명히 목적이 중요하다고 생각해요. "나는 진짜로 눈 딱 감고 코딩 테스트 합격만 하고 알고리즘은 안 할 거야", 혹은 "어? 난 공부하다 보니까 재밌는데 이거 취미로 하고 싶어. 백준에 온라인 대회 같은 거 심심하면 오프로 참가해서 지적 취미를 도모하고 싶어", 혹은 나이가 어리신 분이라면 "겁나 열심히 해서 상하나 따서 인생 창창하게 살고 싶어." 목적이 있으시잖아요.

 

 결국 목적에 따라 달라요. 여기에서도 만약에 진짜 만약에 눈 딱 감고 코테만 합격하고 하실 분들이라면 두 가지로 나뉘어요. 만약에 첫 번째 "만약에 하고 싶은 언어가 있다." 혹은 "하고 싶은 직무가 분명하다", 예를 들어 백엔드 프런트, 이런 분들이라면 그 직무에 맞는 언어를 사용하세요. 직무에 맞는 언어라는 것은 현재 직무에서 사용되는 언어를 추천드립니다. 예를 들어 "스프링 백앤드를 하고 싶어." 하시면 자바나 코틀린을 하시는 것이 맞고, "프런트 엔드에서 리엑트 전문이 되고 싶어." 하면 JS를 하시면 좋습니다. 혹은 나는 "임베디드 전문가가 되고 싶어." 혹은 "게임을 만들고 싶어." 하면 C++을 하시는 것이 좋습니다.

 

 이렇게 목표가 있는 분들은 하던 언어를 하세요. 하던 언어가 제일 좋습니다. 왜냐면 알고리즘 문제를 푸시다 보면 아시겠지만 생각보다 문법적인 면을 많이 배울 수 있습니다. 파이썬으로 예를 들면 변수와 스코프(Variable & Scope) 이런 것들을 배울 수 있는데 이런 것들은 언어의 특성화된 개념은 언어를 많이 쓸수록 어쩔 수 없이 부딪히면서 많이 배울 수밖에 없거든요? 그걸 공부할 겸 제발 하시던 언어 하세요. 제발~ 제발~ 눈 딱 감고 코테만 합격하실 건데 파이썬이 다들 좋데~ 자바를 하시던 분인데 파이썬이 좋데, 파이썬으로 옮겨서 하시는 것은 정말 비추천합니다.

 

 물론 능력이 좋아서 파이썬을 금방 배우고 폴리 글랏(=여러 언어를 능수능란하게 사용하는 사람)이 될 수 있는 똑똑한 사람이면 OK. 근데 생각보다 언어 하나를 알고리즘을 잘 풀 때까지 실력이 좋아지는 게 힘들어요. 여기 오시는 사람들이 코딩테스트에 대해 시간을 얼마나 준비하시는 모르겠지만 생각보다 시간이 많이 들어요. 그 언어를 코테 볼 수 있는 데까지 실력을 올리기까지는요.

 

 그래서 직무에 있는 것을 쓰시고. 만약 직무도 아직 못 정했다. 나는 대학교 1학년이다. 아니면 비전공생인데 전공생으로 넘어오서 코테를 보고 싶다 개발자를 해보고 싶다는 것이라면 직무가 없으신 것이라면 파이썬을 추천드립니다. 제가 이러한 생각을 언제 하게 되었냐면요, 패스트캠퍼스 강의를 찍을 때 엄청나게 많은 문제를 풀었는데 모든 문제를 3가지 언어로 풀었어요. 파이썬, 자바, C++ 풀면서 느낀 건데 파이썬이 넘사벽입니다. 파이썬이 코딩테스트만 합격하실 목적인 분들한테는 좋은 언어인 것은 맞아요. 쉬워요. 다만, 파이썬을 미래의 직무에 쓰시지 않을 분들이라면 굳이 파이썬으로 코테를 볼 필요는 없습니다. 언어를 바꿔가면서까지 달라질 것은 없어요. 왜냐면 언어는 구현하는 수단일 분이지 문제를 풀 수 있는 뇌는 언어랑 관계없습니다.

 

 정리하면 직무가 정해져 있다 > 하던 것을 하세요, 그렇지만 나는 코딩이 처음 혹은 코테가 처음이야. 아직 나는 이렇다 할 언어를 배워본 적이 없어 > 파이썬으로 생각하시면 되겠습니다. 많은 분들이 아직도 고민하실 거예요. 내가 지금 하고 있는 언어가 좋은 걸까 조급하실 거예요 처음 하시는 분들이면 혹은 직무가 있으신 분들이면 조급하실 거예요. 자바를 하고 있는데 사람들이 다 파이썬이 좋데요, 아씨 나도 파이썬 가야 하나? 그렇다고 가지 마세요. 그냥 하던 거 꾸준히 묵묵하게 꾸준하게 하시는 것을 추천드립니다. 이것이 첫 번째로 눈 딱 감고 코테 합격할 사람들에게 할 조언입니다

 

 조금 더 멀리 코테 너머를 보고 싶다고 하시는 분들이라면 C++ 하세요. 그에 대한 근거는 명확합니다. 이는 바로 코드포스라는 사이트입니다. 이 사이트는 전 세계에 알고리즘 잘한다는 사람들이 롤이나 오버워치처럼 서로 랭킹전 하는 사이트예요. 탑 레이팅이라고 랭킹을 볼 수 있어요. 랭킹에 있는 사람들이 무슨 언어를 쓰는지 봐볼게요. 전 세계 1등 C++ 씁니다. 2등 C++ 씁니다. 3등 C++, 4등 C++, 이미 C++ 밖에 없습니다. 자 이것만 보면 무슨 생각이 드세요? 이 사람들이 다른 언어를 못해서 C++ 하는 것이 아니겠죠. 이 사람들은 이미 저보다 혹은 전 세계 통틀어서 대부분 사람들보다 코테를 잘 보는 사람이에요 이런 사람이 C++ 쓴다? 알고리즘에는 C++이 유의미하게 유리하다는 의미입니다. 그래서 코테 너머를 본다 > C++을 하시고 코테만 한다고 하시는 분들은 아까 말하는 것처럼 하면 되겠습니다.

 


 

 현우님 질문이네요. "코테를 보면 머리가 하얗게 변해요. 어떤 카테고리인지를 알면 푸는데, 거기까지 도달하지 못한 것 같아요. 어떻게 헤쳐나가야 하나요?", 제가 진단 하나 할게요. 현우님이 최근에 푸신 문제가 무엇인가요?, 나 이거 잘 이해하고 내 힘으로 다시 풀라 해도 풀 수 있어하시는 문제가 뭔가요?

 

 여러분들이 제일 처음으로 와~ 이걸 내가 맞았습니다를 받았네, 하는 문제가 무엇인가요? 다 하나씩 있으시죠? 제가 나중에 드릴 질문들에 대해서 스스로 한번 대답해 보세요. 여러분이 뿌듯하게 이해했다고 하는 것들을 어떻게 판단하는지 좋냐면, 한번 설명해 보세요. 설명은 어떤 내용을 포함해야 하냐면 그 문제를 처음 보는 사람에게 문제부터 풀이까지 완벽하게 이해시킨다고 생각하고 하세요. 

 

0단계 > 고수한테 설명해 보고 피드백받기 (주변에 고수가 있어야 한다 -_ㅠ)

1단계 > 스터디원에게 (= 같은 문제를 고민한 사람)에게 풀이를 설명해 보기

2단계 > 문제를 모르고 읽어보지도 않은 사람에게 문제와 풀이를 전부 이해시키기.

3단계 > 고수의 풀이 그대로 따라서 말해보기

물론 설명해도 관심이 있으셔야 합니다. 부모님에게 설명하면 그래 너 대단하다.. 하고 말 테니.. 🤣, 아무튼 이걸 왜 해보면 좋냐면, 하다 보면 "내가 이걸 진짜 잘 알고 있는가?"라는 생각이 들면 좋은 것입니다. 잘하고 있는 거예요. 

 

 예를 들어 BFS랑 DFS는 알고리즘 공부한 사람들은 모두 아는 개념입니다. 그렇지만 BFS랑 DFS가 뭐야?라고 물어봤을 때 얼마나 많은 분들이 잘 대답할 수 있을지 궁금합니다. 물론 제가 이러한 질문에 답을 듣는 것에 대해서 깐깐하게 듣는 편이지만, 조금 양보해서 유순하게 들어도 적어도 필요한 정보는 다 있어야 된다고 생각해요. 블로그나 유튜브를 보면 너무 많은 사람들이 포스팅을 하다 보니 잘못된 정보가 너무 많아요.

 

 여러분이 저에게 BFS랑 DFS를 설명하실 때 답변들을 보다 보면 "이걸 어디서부터 고쳐줘야 하지?"라는 생각이 종종 있어요. 물론 여러분은 '듣는 사람들이 BFS랑 DFS가 뭔지 아니까 이 정도만 말하면 되겠지?'라고 생각하는데 이러면 안 돼요. 왜냐하면 저는 여러분은 잘 공부하셨으면 좋겠다.라고 생각하는 싶은 사람이에요. 잘 공부하려면 '왜?'라는 질문을 잘하셔야 해요. 설명을 주로 연습을 해야 해요. BFS랑 DFS가 뭔지 설명을 하라는 것은 임의의 알고리즘을 설명하는 것과 같아요. 그래서 저는 아마도 지금 여기 계시는 여러분들 중 자료구조랑 알고리즘이 뭔지 설명할 수 있는 코테 준비하시는 취준생이 얼마나 있을지 궁금해요.

 

 만약 여러분들이 면접을 보고 있다고 가정해 봐요. 근데 면접관으로 들어갔는데 팀 면접자가 자료구조에 대해 대답했는데 "자료구조는 자료를 담고 있는 구조입니다. 알고리즘은 그 자료를 이용해서 데이터를 처리하는 것입니다."라고 생각을 하고 공부를 하면 쉽지 않습니다. 이렇게 생각하고 푸시면 안 돼요. 전 그렇게 생각합니다.

 

 자료구조에 대해서 설명을 하라 했을 때 추상 자료형(abstract data type)을 말하면 정말 잘하는 사람이라고 생각합니다. 그게 아니라면 자료구조는 저는 이렇게 말하는 사람 좋아해요. 자료구조란 "자료를 담고 있으며, 사용자가 원하는 연산을 수행할 수 있는 구조." 적어도 이렇게는 말해야 한다고 생각해요.

 

 이 내용을 알고 자료구조를 공부하시면 더 좋아요. 무슨 말이냐면 드라이버와 똑같아요. 자료구조도 마찬가지로 "자료를 담고 있기만" 하면 되는데 엄청 많아요. 배열도 있고, 리스트도 있고, 큐, 스택, 힙 등. 자료를 담고 있기만 하면 된다면, 여러분 중 누군가가 자료구조란 "자료를 담고 있는 것"이라고 대답을 한다면, 왜? 굳이 이런 많은 종류가 있어야 하는지에 대한 고민을 안 해본 것처럼 보일 수 있어요. 배열도 자료를 담을 수 있고, 큐, 스택, 힙 모두 자료를 담을 수 있는데 네가 대답한 자료 구조대로면 자료를 담고 있으면 자료구조이면 왜 저렇게 여러 가지 일까?라고 생각해 볼 수 있겠죠. 아마 단순하게 자료구조의 정의를 가르치는 학교는 없을 것입니다.  

 

 만약 제가 자료구조를 가르쳤다면 첫 강의에서 이와 같이 얘기했을 것 같아요, "연산의 종류가 여러 가지이기 때문에 자료구조도 여러 가지 일 수밖에 없다."라고요. 이 말이 무슨 뜻이냐? 예를 들어 사용자가 원하는 연산이 1. 삽입, 2. 최댓값 제거, 3. 최댓값 반환일 경우 사용자가 자료 구조애게 이런 기능을 원한다면 이런 것을 이제 추상자료형(ADT)라고 해요. 위키백과에 따르면 추상 자료형(=ADT)은 컴퓨터 과학에서 자료들과 그 자료들에 대한 연산들을 명기한 것이다.라고 적혀있어요. 보통 자료와 연산은 항상 묶여있어요. 이는 위키백과 첫 번째 줄부터 나와있는 내용이에요. 제가 방금 적은 사용자가 원하는 연산이 바로 추상적 자료형의 연산에 속하는 종류라고 생각하시면 돼요. 정말 추상적이에요. 저 연산을 해주는 자료구조가 있을 거야.라고 상상하는 것이에요.

 

자료구조는 무엇이냐면 이 연산들을 실제로 수행할 수 있어야 하며, 명확한 시간복잡도를 가져요. 예를 들면 제가 원한 위 3가지 연산을 배열로 구현할 수 있어요. 즉, 이런 ADT를 가지고 배열을 만들 수 있고, 힙을 만들 수도 있어요. 그렇다면 똑같은 ADT인데, 왜 자료구조형이 여러 가지냐면 원하는 연산마다 처리하는 시간이 다르기 때문이에요. 배열과 힙을 이용하면 시간복잡도가 다르기 때문에 원하는 연산을 할 때에 힙이 빠르기 때문에 배열보다 더 좋아요. 즉 내가 문제를 풀 때 어떤 연산을 할지 정해지면 이를 통해 자료구조를 결정할 수 있는 것이에요.

 

 그래서 제가 진짜로 드리고자 하는 말은 "문제를 어떻게 푸셨으면 좋겠냐?"예요. 이는 문제를 푸는 순서예요.

 

1번 논리적 순서 확정,

2번 관련 카테고리 혹은 문제 끌어오기.

3번 필요한 자료연산 리스트업,

4번 이에 제일 유리한 자료구조 선택,

5번 구현

 

 이 순서로 문제를 자기 힘으로 풀 수 있다? 그렇다면 어딜 가서 든 강의 구매 없이 코테 공부는 혼자 할 수 있어요. 그래서 제가 아까 여러분들에게 감명 깊은 문제를 여쭤보았잖아요?, 여러분들은 이 순서대로 문제를 다시 한번 풀 수 있으실까요?, 아마 저는 힘들 것이라고 생각해요. 왜냐하면 이는 누군가 한번 하는 것을 봐야 알 수 있는 행동이기 때문이에요. 이 행동을 하려면 자료 구조는 이미 설명해 드렸으니, 알고리즘에 대해서 알아야 해요. 알고리즘은? 문제를 푸는 방법을 찾는 행위예요. 그래서 알고리즘을 설명할 때에는 자료구조가 등장할 이유가 굳이 없어도 돼요. 나는 이러한 방식을 통해 문제를 풀 거야~라는 것이죠. 

 

 만약 알고리즘만 설명한다고 하면 단지번호 붙이기로 예를 들어서 설명해 볼게요.

> 문제 설명 생략

여기서 알고리즘은 연결 요소를 찾는 행위예요. 위 문제를 풀어보신 분은 알겠지만, 제가 방금 설명드리는 것에 대해서는 알고리즘 이름이 나오지는 않아요. 먼저 격자형 그래프를 만들 수 있어.라는 풀이를 설명해야 해요. 예를 들어 그래프를 만들기 위해서, 격자의 각 한 칸이 하나의 정점에 대응이 되고, 인접한 두 정점이 전부다 1이라면 간선을 만들어 줄 수 있어. 그래서 제일 먼저 해야 할 행동은 입력이 들어왔을 때, 그것으로 격자형 그래프를 만들 거야. 가 첫 번째 풀이의 도입부여야만 해요. 그다음에, 격자형 그래프를 만들면 단지 하나가 곧 이 그래프에서 연결 요소에 해당하니까 문제가 원하는 단지에 개수는 연결 요수에 개수와 같고, 각 단지의 크기는 각 연결요소의 정점 개수와 같아. 즉 우리는 격자 그래프에서 연결 요소가 몇 개인지를 세고, 각 연결요소마다 몇 개의 정점이 있는지 셀 수만 있으면 이 문제를 풀 수 있어.

 

 문제를 설명한다고 했으면 여기까지를 진행하셔야 해요. 근데, 코테 준비하시면서 이 문제를 푸시는 분들 중에 이 문제를 설명해 보라고 했을 때 이렇게 설명한 사람은 저는 본 적이 없어요. 다들 시작하실 때 "이거 BFS나 DFS 쓰면 돼"라고 시작하세요. 이렇게 대답하는 사람들은 뭐가 문제냐면 알고리즘이 뭔지 제대로 이해하지 못하는 사람이라고 생각해요. 그렇지 않으면 설명을 못하거나, 알고리즘은 문제가 있어야 그 문제를 해결하는 방법을 알고리즘이라고 생각해요. 근데 BFS랑 DFS는 알고리즘을 배우실 때 분명, 어떤 내용이 쓰여있을 것이냐면 "그래프와 시작점이 존재한다."라는 내용이 있을 거예요.

 

 제 자료로 예를 들어보면 그래프에 대한 설명만 해요. 그래프가 뭔지 알아야 하니까요. 그다음에 BFS, DFS가 나오는 것이 아닌 그래프에서 탐색이 무엇인지 말해요. 탐색이란 "시작점에서 간선을 0개 이상 사용해서 갈 수 있는 정점들은 무엇인가?"예요.라는 문제예요. 탐색이라는 것은 입력은 그래프와 시작점, 출력은 어디를 갈 수 있느냐 예요. 이 개념이 문제예요. 이 문제를 해결하는 알고리즘 중에 깊이 우선 탐색과 너비 우선 탐색이라는 것이 있다.라고 배우실 거예요. 

 

 알고리즘은 이렇게 문제가 명확하게 있어요. BFS와 DFS를 써야 된다고 하시는 분들은 이미 머릿속에 그래프가 다 만들어져 있고, 출력이 그래프에다가 BFS를 쓰면 어떤 결과를 쓰면 나오는지 아니까 풀 수 있어요라고 대답할 수 있지만, 단지번호 붙이기에는 그래프라는 단어가 나오지 않아요. 격자만 있을 뿐이에요. 

 

 BFS랑 DFS를 논하려면 그래프가 뭔지를 설명해야 해요. 그래서 이러한 내용을 먼저 해야 된다고 말씀드린 것이에요. 이를 먼저 설명해야 이다음에 이제 격자형 그래프에서 연결 요소를 세는 방법은 뭐냐? 이 연결요소라는 것 자체가 특정한 것에서 간선들을 타고 이동할 수 있는 점을 찾는 행위를 해야 하니 그걸 위해서 BFS를 사용하자. 혹은 탐색 알고리즘을 사용하자. 탐색 알고리즘에 들어갈 그래프와 시작점은 어떻게 결정이 되냐면 우리가 만든 격자형 그래프랑 그중의 한 정점을 시작점으로 줄 것이다. 그럼 그 탐색 알고리즘의 결과로 나온 한 연결요소마다 정점의 개수를 계산할 수 있으니 그렇게 계산한 연결요소의 개수와 연결요소의 개수를 출력하는 것이 곧 이 문제가 원하는 단지 개수와 각 단지의 크기를 출력하는 것과 동일하다.라고 말하면 저는 100점을 줄 수 있어요. 만약 제가 면접관이고 피면접관이라고 해당 문제를 보고 "BFS, DFS 하면 됩니다."라고 하고 한다면 그러면 "BFS와 DFS가 뭐죠?"라고 친절하게 다시 물어볼 수 있겠지만, 처음부터 잘하면 더 좋잖아요. 문제를 이렇게 이해하셔야 해요.

 

 아무 블로거나 들어가서 해당 문제에 대한 풀이를 볼게요. "단순히 DFS 문제이다."로 시작해요. 나쁘지 않지만, 격자형 그래프 언급을 했으면 더 좋았을 거예요. 물론 기록용이긴 하지만, 실제 면접장이었으면 이런 대답은 별로 좋지 않아요. 그래서 드리고 싶은 말씀의 요점은 문제를 설명하실 때 이러한 방식으로 철저하게 설명해 보세요. 내가 누군가에게 설명할 때 '내가 하는 말만 다 이해하면 이 문제를 완벽하게 이해할 수 있어'라는 생각이 들 정도로 설명을 하다 보면 스스로 "왜?"라는 질문이 생길 것입니다. 

 


 

 오늘 받았던 질문 중의 '벨만 포드 알고리즘 중 왜 라운드에 대해서 v - 1 한 번을 해야 하나요?라는 질문이 있었어요. 이 질문이 좋다고 생각하는 이유는 보통 대부분의 벨만 포드 알고리즘 설명을 보면, 증명이 잘 없어요. 그래서 과정은 있는데 이게 왜? 이렇게 동작하는지에 대해서 궁금해하시는 분이 있었어요. 그래서 전 그게 너무 신기했어요. 아 아직은 잘 공부하시는 분이 계시는구나.라고요.

 

 포스팅 제목이 벨만-포드 알고리즘이란? 거창한 제목인데, 왜? 저러면 되는지에 대한 내용이 없는 거예요. 그래서 실제로 여러분이 공부하시는 내용들이 다 좋은 자료이기는 하지만, 생각보다 완벽하게 모든 내용을 설명하지는 않아요. 만약 이러한 자료를 통해 공부하다 보면 어? 이거 왜 v -1번 반복하지?라는 질문이 읽을 때에는 안 떠오르더라도 스스로 공부하다 보면 이러한 것들이 떠올라요. 이는 무엇을 배우든 간에 직접 설명을 하다 보시면 이거 왜?, 왜 이 자료구조를 쓰지?, 왜 시간복잡도는 이렇지?, 왜 공간복잡도는 이렇지?라는 질문이 생길 거예요.

 

 예를 들면 BFS 배우신 분들 중에, 왜 BFS는 그래프 탐색뿐만 아니라 간선의 가중치가 모두 동일할 때 최단거리를 찾아주는 것이 보장이 될까 라는 질문을 해보신 적이 있나요? 왜 최단거리가 보장이 되나요?라는 질문을 스스로 던져보셨다면 이는 잘 공부하고 계신 거예요. 왜 간선의 가중치가 다 같아야만 해?, BFS 최단거리를 검색해 보면 증명이 있는 글은 좋은 글이에요. BFS가 찾은 경로가 정말 최단경로일까?라는 스스로 질문은 정말 좋은 거예요. 그렇지만 증명이 없는 글을 보고 배운다면 그냥 탐색 구현 방법만 있을 뿐. 이런 걸 보고 공부하는 건 아무런 문제가 없지만 꼭 한번 다시 자기가 자기의 언어로 설명을 하시다 보면 어 왜? 최단거리 보장 확실히 돼? 증명 돼?라는 생각이 떠오르면 이는 좋은 거예요.

 

 그 증명을 굳이 스스로 하지 마세요. 이런 질문이 떠오를 때  그 질문을 검색해 보세요. 증명 키워드를 붙여서. 이렇게 하시면 좋은 이유가 설명을 하면서 문제의 부분 부분을 잘 이해하시면 새로운 문제를 만났을 때 가지고 오기 쉬워요. 예를 들어 현우님 질문처럼 이와 비슷한 거예요. 예를 들어 코테에서 어떤 문제를 만났는데 키워드를 봤는데 최단거리, 격자로 이루어져 있다.라는 키워드를 보았다면 왜?라는 질문으로 공부했다면 이유들을 잘 판단했다면 이전에 푸셨던 다른 문제들 중에서 최단거리라는 키워드가 등장했던 문제가 있을 것이고 그 문제에서 다익스트라 알고리즘을 사용했다면 이때 질문을 혼자 잘 던져서 최단거리가 왜 다익스트라로 해결되지?, 이 알고리즘이 이 문제를 해결해 주는 이유가 뭔지라고 스스로 생각해 보면 어 내가 과거의 최단 거리 문제 키워드를 구할 때 어떤 알고리즘이 주로 쓰였지 라는 생각이 돼요. 그중에 하나를 이 문제에 대입해 보면 되는 거예요. 

 

 그래서 저는 문제를 꼼꼼히 읽어보시면서 키워드를 잘 판단해 보고 문제를 푸는 과정을 설명해 보고 문제가 원하는 정답이 어떻게 도출되는지 그 과정을 잘 이해하시면 도움이 될 것 같아요. 문제를 푸는 순서를 예로 들어달라고 하셨는데 물통이라는 문제로 예를 들게요. 이 문제에서는 그래프라는 내용이 하나도 없는데 왜 그래프 탐색이지?,라고 생각하면 좋은 것이에요. 키워드에 그래프 탐색이 적혀있다고 그냥 "아~ 그래프 탐색이구나." 하고 넘어가시면 안 돼요. 일단 임팩트를 받아야 기억에 남아요. 임팩트를 받으면 문제가 그래프 탐색으로 바뀌는 과정을 이해하게 돼요. 그렇다면 이 문제를 설명해 드릴게요. 이 문제를 설명을 들었을 때 넓이 우선 탐색이라는 과정이 도출될 때 이질감이 없어야 해요. 중간에 갭이 없어야 올바르게 문제를 풀었다고 볼 수 있어요.

 

 > 문제를 어떻게 풀어야 하는지, 어떤 알고리즘을 써야 하는 과정은 생략

 


 

여러분도 누군가에게 설명을 해보면서 과정을 알아보는 것을 추천해요. 제가 여러분에게 해드리고 싶은 말은 알고리즘 단톡방에 설명을 시도해 보시면 제가 도와드릴게요. 제가 제 입으로 말하기는 그렇지만 고수한테 설명해 보고 피드백받기가 있었잖아요? 제가 용기를 내시는 분들에게 해드리겠습니다. 설명을 해보시면 비어있는 부분에 대해서 캐치를 해드릴게요. 이런 부분은 생략되었네요 등 제가 한번 도와드릴게요. 채팅으로 하기 그러시면 블로그에 작성하고 저에게 링크를 보내주시면 도와드릴게요. 만약 여러분이 이렇게 공부하고 있지 않다면 코테를 잘 공부하고 있지 않다고 생각합니다. 

 

 직접 해보시고, 저한테 뚜까 맞아보시면 느껴지실 거예요. 비싼 기회입니다. 공짜로 해드릴 때 잡으세요. 오늘의 결론! 나는 잘하고 있는 걸까?, "왜?"라는 질문이 없으면 잘하고 있는 것은 아닙니다. 문제만 주야장천 풀면 현업에 가서 다시 쓸데없는 사람이 되는 거예요.

 

 알고리즘이 현업에 잘 안 쓰이는 것이 사실이지만, 알고 있는 지식을 새로운 것에 적용한다는 연습 자체를 알고리즘으로 많이 할 수 있어요. 현업에 가셔서 내가 맞닥뜨렸던 문제들을 새로운 문제의 해결책에 가져다 쓸 수 있는 능력을 키우려면 이러한 행동을 하셔야 해요. 멀리 보시더라도 이런 식으로 공부하시는 것을 추천드립니다. 전 19년째 이렇게 공부하고, 이 공부법에 의심은 없습니다. 꼭 자기가 스스로 설명을 해봐야 정말 제대로 된 이해를 할 수 있다고 믿어 의심치 않아요.

 


 

[기타 QnA]

1. 백준 문제를 풀고 다른 사람의 풀이를 볼 때 어떤 풀이가 좋고, 어떤 사람의 코드를 봐야 하는지에 대한 기준이 뭔가요?

A. 랭킹이 높은 사람의 것을 보는 것이 좋아요. 자신이 사용하는 언어를 필터링하고, 코테에 유명한 사람들의 이름을 외우면 좋습니다. 또한 임의의 사용자분들의 정보를 보면 티어가 나와요. 예를 들어 루비, 골드, 다이아라고 하면 루비와 다이아 유저의 풀이를 보는 것이 좋습니다. 보다 보면 많은 것을 배울 수 있어요. 모르는 문법, 나랑은 이런 부분이 다른데 왜 이렇게 짰을까? 등을 공부하면 좋습니다.

 

 


 

[결론]

언어

직무가 정해져 있다 > 하던 것을 한다.

코딩 혹은 코테가 처음이야. 언어를 배워본 적이 없어 > 파이썬

 

학습

"왜?" 라는 질문을 스스로에게 하면서 학습하기.

다른 사람에게 설명하면서 공부하기.

 

 

 

반응형