코칭 목표
- 수강생의 문제해결능력을 증진시킨다.(어떠한 처음 보는 문제라도 풀 수 있도록 한다.)
- Lev.20까지 도달하게 함으로써 다양한 알고리즘을 익히게 한다.
- 코딩 테스트에 합격할 수 있게 한다.
문제해결절차
- 문제를 이해한다. (문제에서 구해야되는 값을 정의하고, 해당 값이 나올 수 있는 모든 상황을 생각해본다)
- 풀이법을 개발한다. (문제를 해결하는데 필요한 절차 및 알고리즘을 설계한다, Bruteforce 부터 적용)
- 만든 풀이법이 문제를 제대로 해결하는지 검토한다. (이해한 문제를 풀이법을 통해 모두 구할 수 있는지)
- 제한된 상황에서 제대로 동작하는지 검토한다. (입력크기 제한, 시간복잡도, 공간복잡도, 메모리 제한)
- 코드로 구현한다. (풀이법을 코드로 옮긴다)
- 100점을 받는다.
코치 업무
- 코치가 목표를 이루기 위해 해야될 일은 크게 2가지이다.
-
질의 응답
- 코치는 질의 응답 과정을 통해 수강생이 문제를 해결함에 있어서 사고의 흐름 중 어느 부분이 약한지 빠르게 파악하여 해당 부분을 Develop 할 수 있도록 도와준다.
- 코치는 수강생이 만들어온 모든 질문에 대한 답변을 해줄 수 있어야하며 수강생은 답변을 얻음으로 스스로 문제를 해결할 수 있는 힘이 길러져야한다.(답변을 받음으로 고민해볼 수 있어야한다. 답변의 질이 수강생이 만족할 정도여야 한다.)
- 코치가 수강생이 만들어온 모든 질문에 대한 답변을 줄 수 있으려면 질문이 몇 개가 나올지 알고 있으면 좋다.
- 답변의 질은 질문에 대해 생각할 수 있는 시간이 많으면 많을수록 높아질 가능성이 있다. 따라서 코치는 수강생이 어떤 질문을 할 것인지 알고 있으면 좋다.
- 수강생의 질문은 수강생이 어떤 문제를 시도(a)하거나 풀어왔는지(b)를 알면 파악할 수 있다.
- 따라서, 코치는 코칭 전 수강생의 제출 기록(b) / 컴파일 기록(a) / 메모 기록(a) / 문제를 열었는지(a)에 대한 기록을 알면 어떤 질문을 하고 몇 개의 질문을 할지 예측할 수 있다.
- 문제를 열었는지
- 문제를 열었으나 풀어오지 않은 경우는
- 문제를 면밀히 보지않았거나,
- 문제를 면밀히 봤으나 문제에 원하는 것이 뭔지 이해(1)가 안된 것이다.
- 문제를 열었으나 풀어오지 않은 경우는
- 메모 기록
- 메모 기록이 있다는 것은
- 문제를 자기나름대로 이해하고(1), 풀이법을 개발했을 수도 있고(2), 검토(3, 4)까지 된 상황일 수 있다.
- 메모 기록을 읽어보면
- 문제를 잘 이해했는지(1), 풀이법을 개발했는지(2), 개발한 풀이법이 적절한지(3), 문제에 주어진 제한에 풀이법이 적절한지(4)를 알 수 있다.
- 메모 기록이 있다는 것은
- 컴파일 기록
- 컴파일 기록이 있다는 것은
- 문제를 자기나름대로 이해하고(1), 코드가 구현(5)된 상황이다. (풀이법이 완전한지(2), 검토(3, 4)는 했는지 모른다)
- 컴파일한 코드를 읽어보면
- 문제를 잘 이해했는지(1), 풀이법이 완전한지(2), 검토(3, 4)는 했는지 알 수 있다.
- 컴파일 기록이 있다는 것은
- 수강생의 제출기록
- 제출한 기록이 있다는 것은
- 0점
- 0점을 받은 경우는
- 예제만 돌려보고 제출을 해봤을 가능성이 높다.
- 문제를 자기나름대로 이해하고(1), 코드가 구현(5)된 상황이다. (풀이법이 완전한지(2), 검토(3, 4)는 했는지 모른다)
- 0점을 받은 경우는
- 0점 ~ 90점
- 시간초과의 경우는
- 시간 복잡도(4) 계산이 잘못되었거나, 계산을 할 줄 모를 수 있다.
- 메모리초과의 경우는
- 배열의 크기를 너무 크게 잡았거나(힙, 정적 메모리 합쳐서 256MB 초과(전역변수), 스택 메모리 1MB 초과(main 내의 변수)), 재귀가 너무 많이 돈다(함수 콜스택 메모리 초과).
- 런타임에러의 경우는
- 주로 배열 indexing이 잘못되었을때 발생하고, 수학 문제의 경우 0으로 나눌 경우 발생한다.
- 배열 최대 크기(4)를 주로 잘못 설정했다.
- 이외의 경우 다양한 상황은
- 문제해결절차 중 5, 4, 3, 2, 1 중에 어느 것이 잘못되었는지 파악해야한다.
- 시간초과의 경우는
- 91~99점
- 91~99점을 받은 경우는
- 손으로 해봐도 발견하지 못할 확률이 높다.
- 문제 이해가 잘못됐을 확률이 있다.
- 91~99점을 받은 경우는
- 100점
- 100점을 받은 경우는
- 1, 2, 3, 4, 5, 6 단계가 체계적으로 수립되어 문제를 해결해왔다.
- 해당 문제의 다양한 풀이가 궁금할 수 있다. 또한 자신이 풀어낸 풀이가 맞는지 검증하고 싶어할 수 있다.(사실 이 질문이 나와서는 안된다. 만약 질문이 나왔다면 수강생은 문제해결절차 중 4, 3 이 잘 안되는 것이다.)
- 100점을 받은 경우는
- 0점
- 제출한 코드를 읽어보면
- 5, 4, 3, 2, 1 중에 어느 것이 잘못되었는지 파악할 수 있다.
- 제출한 기록이 있다는 것은
- 문제를 열었는지
- 각 수강생 마다 나올 질문을 예측해서 미리 충분히 생각하고 답변을 준비해둔다.
- 코칭이 시작된 이후 미리 예측한 질문에 대한 답변을 수강생이 물어보기도 전에 코치가 먼저주는 것이 아닌 수강생이 물어봤을때 코치가 질문에 대한 답변을 적절하게 해줘야한다.
- 만약 예측한 질문이 나왔다면 미리 생각해둔 답변을 말이나 그림, 글로 표현하면 된다. 아니라면 듣고 바로 생각해내야한다.
- 예를 들어, 수강생이 궁금한 문제(a, b, c)에 대한 준비한 질문(x, y, z)가 있고 코치가 예측한 문제(a, b, c, d, e)에 대한 질문(x, y, w, o, p)에 대한 답변(i, j, k)가 있다면
- 수강생이 문제 a 에 대한 x 질문, 문제 b 에 대한 y 질문, 문제 c 에 대한 z 질문을 했다면
- 코치는 문제 a, b 질문 x, y 에 대해서는 준비된 질이 높은 답변(i, j)을 제공할 것이고, 문제 c 에 대한 질문 z 에 대해서는 바로 생각해낸 답변을 제공할 것이다.
- 여기서 코치가 예측한 문제 d, e 에 대해 질문이 없으신지 수강생에게 여쭤봄으로 한 번 체크를 하고 넘어가면 관리 받는 느낌을 제공할 수 있다.
- 이때 질문에 대한 Default 답변은 "어떻게 푸셨나요?"(2)가 시작이다.
- "어떻게 푸셨나요?" 에 대한 수강생의 답변을 통해 문제 이해를 잘 했는지(1), 풀이를 똑바로 개발했는지(3, 4) 알 수 있기 때문이다.
- 코치는 수강생의 질문을 통해 문제해결절차 6단계 중 어느 부분이 잘 안되는지 파악해야한다. 또한, 자신이 어느 부분이 잘 안되는지 인지시켜줘야한다.
- 1단계를 못한다
- 문제가 이해되지않는다 → desc 설명해준다.
- 문제에서 구해야되는게 무엇인지 모른다 → 문제를 읽고 구해야하는 값을 정의하는 과정을 보여준다. 문제 정의의 자세함은 0, 1 밖에 모르는 컴퓨터가 이해할 수 있는지로 하면 적당하다.(코드로 내가 컴퓨터에게 설명할 수 있는지)
- ex) 문제 정의 - 소수를 구하라
- 컴퓨터에게 바로 소수를 구하라고 하면 소수가 뭔지 모를 것이다. 좀 더 명확하게 써야한다.
- 그렇다면 소수는 무엇이고, 어떻게 판단할 수 있는가
- 소수 : 약수가 1과 자기 자신인 숫자
- 문제 재정의 - (약수가 1과 자기 자신인 숫자)를 구하라
- 컴퓨터에게 약수를 구하라고 하면 약수가 뭔지 모른다.
- 약수 : 숫자 x 가 있을때 x 보다 같거나 작은 나눠 떨어지는 수
- 문제 재정의 - ((숫자 x 가 있을때 x 보다 같거나 작은 나눠 떨어지는 수)가 1과 자기 자신인 숫자)를 구하라
- 나눠 떨어지는 수를 아직 모른다.
- 나눠 떨어지는 수 : 나눴을때 나머지가 0인 수
- 문제 재정의 - ((숫자 x 가 있을때 x 보다 같거나 작은 (나눴을때 나머지가 0인 수))가 1과 자기 자신인 숫자)를 구하라
- 이제 컴퓨터가 알아듣게 내가 설명할(코드로 표현할) 수 있다.
- ex) 문제 정의 - 소수를 구하라
- 2단계를 못한다
- 방법을 못떠올린다 → 문제 이해를 통해 풀이법을 개발하는 과정을 보여준다.
- ex) ((숫자 x 가 있을때 x 보다 같거나 작은 나눠 떨어지는 수)가 1과 자기 자신인 숫자)를 구하라
- 숫자 x 가 있을때 x 보다 같거나 작은 나눠 떨어지는 수를 어떻게 구할까?
- x 보다 같거나 작은 수를 알아내야한다. → for(int i=0;i<x;i++) 로 바로 나오면 정말 좋겠지만 현실은 그렇지 않다.
- 나눠 떨어지는 수 → 나머지가 0이여야 한다(문제 이해를 완전히 하지 않아도 여기서 다시 정의해 볼 기회가 있다) → % 를 이용한다 → x%i == 0
- ...
- 어려운 방법으로 문제를 푼다 → 일단 그 방법으로 한계점에 도달하게 한다. 그 이후 여러 다양한 방법을 소개시켜주고, 그 중 쉬운 것을 선택하도록 만든다.
- 방법을 못떠올린다 → 문제 이해를 통해 풀이법을 개발하는 과정을 보여준다.
- 3단계를 못한다
- 보통 문제 이해가 명확하지 않다. → 문제 이해하는 과정을 보여준다. (문제에서 발생할 수 있는 전체 상황을 떠올리는 연습)
- 4단계를 못한다
- N 제한을 검토하지 못했다 → 문제를 잘 읽도록 지적한다.
- 시간복잡도를 못구하겠다 → 구하는 방법을 알려준다.
- 시간복잡도를 구했으나 틀렸다 → 맞는 복잡도를 구해준다. 구하는 방법을 알려준다.
- 메모리 초과한다 → main 내에서 보통 int 형으로 1,000,000(1백만)까지 할당 가능하고 알려준다. (int data[100000] or int data[1000][1000]), 그보다 큰 배열을 선언하고 싶은 경우 전역변수로 선언하면 될 수도 있지만 거기서도 너무 크면 배열을 사용하면 안되는 문제라고 언급한다.
- 5단계를 못한다
- 코드로 못짜겠다
- 만든 풀이를 메모지에 적으면서 하지 않았다 → 글로 쓰면서 문제를 풀게 만든다.
- 만든 풀이를 메모지에 적으면서 했는데 보아하니 풀이법이 큼직 큼직하다 → 좀 더 상세하게 적을 수 있도록 한다. → 한글로 적은 풀이 과정 1, 2, 3, 4 가 각각 코드 한 줄로 표현될 수 있을 때까지 자세하게 쓴다.
- 만든 풀이 중 특정 단계를 못 짜겠다 → 다양한 구현 방법을 알려준다.
- 만든 풀이법이 맞다 → 프로그래밍 문제 해결 테크닉을 알려준다. ex. 2차원 배열 padding, counting array
- 코드로 못짜겠다
- 6단계를 못한다
- 디버깅을 할 줄 모른다. → 디버깅을 알려준다.
- 디버깅을 할 줄 모르지만 자기가 만든 예제를 넣어봤는데 다 맞다. → 디버깅을 알려주고, 문제에서 구해야되는 값이 나올 수 있는 모든 상황고려가 되지않았다고 알려준다.
- 디버깅을 할 줄 알지만 자기가 만든 예제를 안넣어봤다. → 예제 돌려보라고 한다;
- 디버깅을 할 줄 알고 자기가 만든 예제를 넣어봤는데 다 맞다. → 문제에서 구해야되는 값이 나올 수 있는 모든 상황고려가 되지않았다고 알려준다.
- 예외가 발생한다 → 풀이법을 만들때 brute force 부터 생각하지 않았다. 또는 문제에서 구해야되는 값이 나올 수 있는 모든 상황고려가 되지않았다.
- 모든 상황을 고려하는 모습을 보여준다.
- 예외를 줘서 스스로 문제를 해결하게 만든다. (문제 이해를 스스로 잘못했다고 깨닫는다)
- 1단계를 못한다
- 알고리즘을 알려준다는 것은
- Brute-force로 설계한 풀이법에서 더 효율적으로 만들 수 있는 부분을 찾아서 해당 부분에 자료구조나 알고리즘을 통해 시간복잡도를 줄이는 행위를 알려주는 것이다.
- 주어진 어떠한 상황에 대한 정해진 풀이법을 알려주는 것이다.
-
진도 관리
- 진도 관리는 다양하고 많은 질의 응답을 유도하기 위한 도구로 쓰일 수 있고, 최대한 짧은 시간에 다양한 알고리즘을 접할 수 있도록 하기 위함이다.
- 또한, 수강생이 학습적으로 도움이되는 순서로 풀 수 있도록 코치가 유도하기 위함이다.
- 수강생이 다양한 질문을 가지고 올 수 있도록 최대한 많은 문제를 할 수 있을 만큼 풀어오도록 말한다.(질문에 대한 만족도 높은 답변을 줄 수 없는 상황 + 모든 질문에 대한 답을 줄 수 없는 상황이라면 해서는 안된다.)
- 주어진 컨텐츠(문제, 영상)을 통해 문제해결능력 중 어느 것을 검증할 수 있을지를 고려하여 수강생이 어느정도로 문제해결능력을 갖췄는지 점검 해볼 수 있는 검증 수단으로 이용하게 된다. ex) k번째 큰 수 찾기 - 문제 조건 파악 후 검증(4), 시간복잡도 계산(4)
고오급 코치가 되어가는 과정
질의 응답을 진행할때 일어나는 상황을 잘게 나눠보면 다음과 같다.
- 질문을 해야되는 상황인지 모르겠다.
- 질문을 해야되는 상황인지는 알겠으나 질문을 뭘 해야할지 모르겠다.
- 질문을 했으나 답변이 부적절했다.
- 질문을 했고 답변이 적절했으나 이해하지 못했다.
- 질문을 했고 답변도 적절했고 이해까지 했으나 어떻게 할지 모르겠다.
위에 서술한 방식으로 숙달이 된 코치는 높은 확률로 3, 4, 5에 대한 상황 대응이 가능할 것이다.
수강생에게 좀 더 만족도, 질 높은 서비스를 제공하기 위해서는 수강생이 고민하는 시간 최대한 효율적으로 사용하게 만드는 것이다.
- 만약 3시간 고민해서 생각이 안떠오르고, 10시간 고민해서 생각이 안떠오르는게 똑같다면 시간을 가장 효율적으로 쓰는 방법은 3시간만 고민해보는 것이다. (파라매트릭 서치와 동일한 로직이다)
- 수강생 개별의 Minimum 고민 시간을 알아내서 수강생의 소중한 시간을 최대한 효율적으로 사용할 수 있도록 도와줘야한다.
- 이는 위 상황 중 1, 2 에 해당하는 상황인데, 코치가 현재로는 감으로 파악하여 코칭이 진행되어야한다.
- 만약 수강생 개인의 Minimum 고민 시간을 알아냈다면 다음과 같은 행위가 가능해진다.
- 예를 들어, A 수강생의 최소 고민 시간은 10분이다. 그렇다면 해당 수강생에게 고민해볼 수 있는 질문을 던진 다음, 해당 질문에 대한 답변을 생각하는데에 10분을 주고 10분 뒤에 다시 물어보는 것이다.
- 만약 시간이 더 필요하다고 말을 한다면 시간을 좀 더 주고, 주어진 시간내에 생각을 못했다면 알려주고 다음 고민을 하게 만든다.
또한 3, 4, 5 에 대한 심층적인 상황 분석이 되어져야 한다.
- 예를 들면, 수강생이 질문에 대해 제대로 이해했는지 못했는지 정확하게 파악할 수 있어야한다.
- 답변을 듣고 이해한 척 할 수도 있고, 이해한 줄 착각했을 수도 있다.
- 지속적인 질의응답 과정을 통해 정확한 이해 수준을 알아내야한다.
코치 레벨
답을 알려준다 (저급)
질문에 대한 답을 바로 알려주도록 답변이 가능하다.
질문에 대한 답이 바로 생각날 수 있게 답변이 가능하다.
질문에 대한 답이 고민해서 생각날 수 있게 답변이 가능하다.
방법을 알려준다 (고급)
물고기를 잡아주냐 잡는 방법을 알려주냐 차이인 것 같다.