수강 계기

 

지난 2년간 Web Frontend 개발자로 일하면서 typescript를 주 언어로 사용했습니다.  올해 4월 쯤 C++ 을 주 언어로 사용하는 회사로 이직하면서 빠르게 C++을 학습해야 했습니다. 또 C++ 11 이후의 최신 문법 사용법도 공부가 필요했습니다. 

 

강의를 통해 일반적인 문법 지식을 배우는게 목표면 공식문서나 책을 통해 배우는게 효율적입니다. 강의를 듣게 된다면 단순 문법 지식의 나열이 아닌, 실제로 현업에서 어떻게 쓰이는지, 일반적인 문법 지식이 나왔는지 등등 일반 책에서는 얻기 힘든 깊이있는 지식을 얻을 수 있어야 들어야 한다고 생각합니다.

 

포프님의 유튜브를 평소에도 즐겨봅니다. 영상을 보면서 설명하실 때 단순 지식 나열이 아닌 "왜" 에 대한 논리적인 설명이 항상 따라왔던 것이 정말 좋았습니다. C++ 강의에서도 같은 형태로 "왜" 를 이해하면서 학습할 수 있다면 효율적인 것을 넘어 강의를 잘 듣고 소화시킬 수 있으면 다른 차원의 실력을 가질 수 있을 것 같아 수강했습니다.

 

강의만 들을지, 정규 학기로 수강할지(과제, 시험, 일정관리 포함) 고민했습니다. 가장 큰 제약은 시간이었습니다. 이직한 회사에서 적응하면서 동시에 강의 수강을 해야 했습니다. 왠만한 난이도면 퇴근 후 적당히 공부해서 수강하면 됩니다. 하지만 정규 학기 설명이나 다른 블로그 글에서 "POCU 시험 정말 어렵습니다." 라는 글을 봐서 고민했습니다. 또 무작정 수료만 하면 끝이 아닌 강의였습니다. 최종 점수 85점이 넘지 않으면 Fail 이기 때문에 고민이었습니다.

 

하지만 전체적인 후기에서 실력향상에 큰 도움이 되었다는 글을 많이 봤습니다. 또 빨리 C++ 익숙해져서 회사 SW 개발에 참여해야 하는 상황이라 빡세면 오히려 좋다. 퇴근시간, 주말 정도 강의 수강에 투자하면 충분히 Pass 할 수 있겠다는 생각으로 정규학기를 선택했습니다.

 

수강 전 실력

POCU COMP 3200 수업의 선수 교과목은 
* 2200 : C 언매니지드 프로그래밍

* 2500 : 개체지향 프로그래밍 및 설계(Java)

수업 입니다.

 

C 프로그래밍은 대학생 때 깊이있게 공부를 했었고 COMP 2200 수업도 2년전 쯤 강의로 완강을 했었습니다.

개체지향 프로그래밍 및 설계는 체계적으로 공부한 적은 없고 그 때 그 때 필요하거나 궁금할 때 인터넷 공부로 학습했었습니다. 수강 신청 시점에선 잘 몰랐다고 보면 될 것 같습니다.

 

추가로 백준으로 알고리즘 문제를 풀었었습니다. C++ 언어로 문제를 풀었었고 600개정도 풀어서 solved.ac 기준 플레티넘 5 정도로 점수가 나왔습니다. 

 

고민하신다면

만약 기초 프로그래밍 능력, 포인터와 메모리 관리의 개념이 부족하다면 이 수업 이해와 과제수행하는데 큰 어려움이 있을 것 같다고 생각합니다. 2200 수업을 통해 얻을 수 있는 지식이 없으신 분이 바로 3200을 듣는 걸 고민하신다면 우선 2200 수업을 먼저 마치고 오시는 걸 추천합니다. 

 

개체지향이 무엇인지 모르시는 분은 크게 문제없이 수강 가능하다고 생각합니다. 저도 잘 몰랐지만 수업에서 충분히 언급해주시고 많이 배워갔었습니다. 또 개체지향 개념을 모르는 것 때문에 과제를 못하거나 시험을 치르는데 문제 없었습니다.

 

강의 후기

수업 전반적으로 "왜" 를 충분히 설명해주는 수업이어서 매우 만족했습니다. 평범한 강의는 단순히 기능을 나열하고 그에 대한 딱딱한 설명을 해주고 끝 입니다. 하지만 실제로 현업에서 C++ 을 오래, 제대로 사용하신 포프님께서 현업에서는 어떻게 쓰는지를 알려주니 기억에도 오래남고 수 많은 기능들을 그저 외우는게 아니라 충분히 이해해서 머리에 남길 수 있었습니다. 

 

특히 필요할 때 마다 메모리 구조를 그려주시고 어떤식으로 동작하는지 보여주는 부분이 가장 좋았습니다. 얕은 복사, 깊은 복사, virtual 키워드, 스마트 포인터 등 말로만 설명하면 이해하기 쉽지 않을 텐데 항상 메모리 구조 그림을 동반해서 설명해주십니다. 메모리 그림으로 이해하면 앞으로 모든 코드를 더 자신있게 분석할 수 있을 것 같아 따로 강의 없이도 포프님이 그리셨던 것 처럼 메모리 그림을 그려 분석할 수 있도록 훈련했습니다. 앞으로 코드 분석시 메모리를 시각화해서 더 제대로 이해할 수 있게 된 것 같아 매우 만족합니다. 

 

고민하신다면

C 언어에 대한 이해가 충분히 있으시다면 강의만 수강하셔도 남는 것 많습니다.

특히 만약 C++ 이전 문법은 익숙하고 C++ 11 이후가 궁금해서 듣고 싶은 분이 계신다면 추천 드리고 싶습니다. C++ 11 이후 정말 수 많은 기능이 나왔는데 나온 이유, 제대로 사용하는 방법, 주의해야할 점 등 단순히 강의를 보기만 해도 머리속에 많이 정리가 됐습니다.

개체지향에 대한 이해는 있는데 C++로 구현하는 방법이 궁금하시다면 역시 들으시면 큰 도움 됩니다. 단순히 키워드 설명 뿐만 아니라 특정 개체지향 개념을 C++로 구현하는 방법, 왜 이렇게 구현해야 하는지에 대한 설명이 자세해서 도움이 많이 됩니다. 

 

풀 코스 후기

 

5월 말부터 8월 중순까지 3개월 좀 넘게 코스가 진행됐습니다. 풀 코스에서 수업 수강을 위해 제공되는 건 실습/과제와 자동 채점, 중간/기말 고사, 궁금한 걸 질문하고 답할 수 있는 slack 방 참여가 있습니다.

실습/과제

강의만 봐도 많은 걸 얻을 수 있지만 실습/과제를 통해서 강의의 중요한 부분을 완벽하게 이해할 수 있습니다. 개체지향의 다형성 개념을 강의에서 배웠으면 과제에서 배운 내용을 바탕으로 과제를 수행하는 방식입니다. 단순히 따라 치는 실습/과제를 생각하시면 안됩니다. 주어진 문제에 따라 직접 코드를 구현해서 채점을 받아 만점을 받아야 합니다. 

실제로 구현 해보면서 얻는 건 강의를 보는 것 만큼 얻는 것 만큼이나 많았고 특정 과제는 강의보다 과제를 해결하면서 배우는게 더 많았습니다. 

가장 크게 얻은 것은 메모리 누수 방지 관리 습관, 노하우 였습니다. 초반에서 중반부 실습/과제에서 제가 가장 많이 겪었던 에러, 오답은 메모리 누수가 있는 코드를 작성한 것 입니다. delete 필요한 곳에 잘 해준 것 같은데, 소멸자 잘 호출한 것 같은데 하면서도 2~3시간 코드를 계속 들여다보면 결국 내가 실수한 부분이 있다는 걸 깨닫게 됩니다. 이 경험이 여러번 쌓이니 자주 실수할 수 있는 부분을 많이 경험했고 더 탄탄하게 메모리 관리를 할 수 있게 되었습니다. 이후에 스마트 포인터를 공부하게 되는데 이 과제를 수행하면서는 앞에서 했던 그 섬세한 메모리 관리를 알아서 해주니 너무 좋다. 스마트 포인터를 적극 사용해야겠다 하는 경험적으로 깨닫는 부분이 큽니다. 비싼 가격에 고민하신다면 그 값어치는 충분히 하고 남는다고 추천드리고 싶습니다.

중간/기말 시험

정해진 기간안에 공부했던 내용을 바탕으로 시험을 칠 수 있고 고득점을 하면 수료증을 받을 수 있는 시스템 입니다. 큰 돈을 내고 수강하는 만큼 수료증은 꼭 받고 싶은데 이 때문에 공부를 더 열심히 할 수 있는 동기부여가 됩니다.

 

중간/기말 시험을 준비하면서 그동안 공부했던 내용을 다시 강제로(?) 정리하고 복습할 수 있는 시간을 가질 수 있습니다. 시험 난이도는 충분히 어렵기 때문에 대충 공부하면 안되고 충분한 이해를 하도록 깊이있게 공부해야 했습니다. 너무 쉬웠다면 크게 얻는 게 없었을 것 입니다.

 

수료도 하고 싶었고 이왕이면 고득점을 받고 싶어서 열심히 했던 것 같습니다. 보통 시험엔 운이 작용한다고 생각하는데 포큐 시험은 충분히 실력으로 평가받을 수 있도록 잘 만들어져 있으니 시간만 충분히 투자하신다면 공부 충분히 하시고 고득점 받을 수 있습니다. 

slack 방 운영

질문을 하면 포큐님이 직접 답변 하실 때도 많고 조교, 다른 수강생끼리 서로 질문 답변 하며 많은 걸 배울 수 있습니다. 배웠던 개념에 대해 이야기하는 경우도 많고 실습/과제 힌트도 많이 얻을 수 있습니다. 특히 공부를 깊게 하시는 분들이 많이 계신데 하시는 질문/답변을 통해서 정말 많이 배울 수 있습니다. 

 

고민하신다면

실습은 보통 강의에 나와있는 부분을 잘 참고하면 어렵지 않게 해결할 수 있습니다. 저는 과제 당 평균 3~4시간 정도를 사용했습니다. 2시간 이내에 끝나는 쉬운 과제도 있고 5시간 이상 쓴 어렵고 복잡한 과제도 있었습니다. 혼자서 해결하기 너무 어렵다면 slack 방 질문을 통해 힌트를 얻을 수도 있습니다. 결국 시간 충분히 쓰고 끝까지 해내려고 하면 실습 100점은 모두 받으실 수 있다고 생각합니다.

 

과제는 그보다 더 어렵습니다. 총 4개가 나오는데 개체지향 개념을 다루는 2번 과제가 특히 어렵게 느껴졌습니다. 이 과제는 3주동안 해결하면 되는데 10시간 넘게 걸렸던 것 같습니다. 다른 과제도 5시간 이상씩은 모두 걸렸습니다.

 

과제나 실습은 하면서 괴롭기 보단 재밌습니다. 채점 봇을 통해 실시간으로 채점 받고 틀린 부분을 알 수 있습니다.
코드 수정하고 채점 받고 하는 과정이 재밌게 느껴졌습니다. 시간 압박 없이 미리 여유롭게 하신다면 즐겁게 하실 수 있습니다.

시험문제는 지엽적이고 필요없을 것 같은 건 나오지 않습니다. 수업, 과제에서 중요하게 다루었던 부분이 비중있게 나옵니다. 시험을 치면서 못 풀었던 문제들을 통해 제대로 이해하지 못한 부분을 파악할 수 있습니다.

시험도 단순히 어느 강의부터 어느 강의까지 이런 것이 아닌 시험 1~2주 전 나오는 개념을 다 나열해주시고 연습문제까지 제공해 주십니다. 그래서 어디를 집중해서 공부해야할 지 명확하기 때문에 즐겁게 공부할 수 있습니다. 수강 신청하면서 시험이 가장 걱정이었지만 범위와 주제가 명확하기 때문에 크게 걱정 안하셔도 됩니다.

 

추천합니다.

시간이 충분하고 깊게 공부하는 것 좋아하시는 분이시면 후회없는 선택입니다. 생각했던 것 보다도 더 깊이 배웠고 좋은 예시와 설명으로 쉽게 이해했습니다.

하지만 보통 직장인이든 대학생이든 시간이 부족한데요. 그래도 추천합니다. 저는 대부분 이동할 때 강의를 시청했었고 과제 수행시 어려울 때 다시 한번 보고 시험 전 시험나오는 부분 2배속으로 한번 보는 식으로 코스를 수강했는데 어느정도 C언어 이해가 있는 상황에선 충분히 따라갈 만 했습니다. 

수강을 고민하시는 분들께 도움이 됐으면 좋겠습니다😊

문제

https://app.codility.com/programmers/lessons/14-binary_search_algorithm/min_max_division/

풀이

블럭을 몇번 나눌 지를 이분 탐색으로 찾는다.

  1. 나올 수 있는 가장 최고의 경우는 원소 길이만큼 나누는 것 -> 배열의 최대값이 최소값
  2. 나올 수 있는 가장 큰 값은 배열 모든 원소의 합
  3. 이분 탐색으로 나올 수 있는 값을 정해가면서 block 몇개로 나누어지는지 체크 후 주어진 K만큼 나눌 수 있을 때가 정답

코드


function getBlocks(A, midValue) {
  let blocks = 1;
  let subSum = 0;
  A.forEach((el) => {
    if (subSum + el > midValue) {
      blocks += 1;
      subSum = el;
    } else {
      subSum += el;
    }
  })
  return blocks;
}

function solution(K, M, A) {
  // write your code in JavaScript (Node.js 8.9.4)
  let minValue = A.reduce((acc, el) => {
    return Math.max(acc, el);
  }, 0);

  let maxValue = A.reduce((acc, el) => {
    return acc + el;
  }, 0);

  while (minValue < maxValue) {
    let midValue = parseInt((minValue + maxValue) / 2, 10);
    let blocks = getBlocks(A, midValue);
    if (blocks > K) {
      minValue = midValue + 1;
    } else {
      maxValue = midValue;
    }
  }

  return minValue;
}

문제

https://app.codility.com/programmers/lessons/5-prefix_sums/min_avg_two_slice/

풀이

  1. 두 수의 평균은 두 수 중 작은 수보다 크거나 같다(같은 경우는 두 수가 같을 때)
  2. 이를 3개 이상의 N개의 수가 있다고 할 때 두 그룹으로 나눈다면 N개의 수의 평균은 두 그룹 중 합이 작은 것 보다 무조건 크기 때문에 N이 4개인 것이 답이 될 수 없다.
  3. 2개, 3개인 경우일 때 최소이므로 이 경우만 다 구해보면 답을 구할 수 있다.

코드

function solution(A) {
    let minAvg = (A[0] + A[1]) / 2;
    let minIdx = 0;
    for(let i=2;i<A.length;++i) {
        let avg = (A[i-2] + A[i-1] + A[i]) / 3;
        if(minAvg > avg) {
            minAvg = avg;
            minIdx = i-2;
        }
        avg = (A[i-1] + A[i]) / 2;
        if(minAvg > avg) {
            minAvg = avg;
            minIdx = i-1;
        }
    }
    return minIdx;
}

+ Recent posts