블로그

홍정모

최적의 프로그래밍 공부 방법

*같은 글의 브런치 링크MZ 세대를 위한 가장 효율적인 프로그래밍 공부 순서 요약- 문법보다 활용- 뭘 하든 생각하는 방법부터지금 프로그래밍 공부를 시작하거나 하고 있는 분들은 정말로 한 분 한 분이 소중합니다. 누구나 얼마든지 무럭무럭 자라나서 창조성을 꽃피울 수 있는 잠재력을 가지고 있음에도 불구하고 C언어 문법 공부로 대표되는 옛날 방식으로 지쳐버리는 것을 보는 것은 안타깝습니다.​오프라인/온라인에서 오랜시간 동안 다양한 과목들을 다양한 학생들에게 가르치면서 프로그래밍 교육에서 고려해야할 점들을 정리해봤습니다.​1. 흥미를 끌고 매 단계마다 재미를 느낄 수 있어야 합니다. 지루함을 억지로 참게하면 안되고 짧은 템포로 강한 집중력을 유도해야 합니다.​2. 왜 필요한지를 먼저 알려줘야 합니다. 예전에는 그냥 알아두면 나중에 도움된다며 일단 압박하며 가르쳐야했던 내용들도 다양한 응용 분야가 내 미래에 직결된다는 것을 미리 알게 되면 강한 의지를 보입니다.​3. 클릭만 유도하는 미디어에 지쳐가는 새싹들에게 수명이 짧고 단편적인 기술이 아니라 생각하는 방법 자체를 배울 수 있는 기회를 제공해야 합니다.​여기에 맞춰 가장 효율적인 프로그래밍 공부 방법을 정리해봤습니다.​1. 안정적인 초중고 교육은 인생 자체를 지탱하는 뿌리가 됩니다. 이 시기에는 컴퓨터로 인해 바뀌어가는 인류의 미래에 대해 호기심을 갖는 정도면 충분합니다. 타의에 의한 강압적인 선행학습은 권장하지 않습니다.​2. 프로그래밍 입문 초반부터 다양한 응용 분야에 대해 가볍게 체험을 해보는 것을 권장합니다. 자신의 가능성에 미리부터 선을 긋고 특정 분야에 대해 단편적인 지식만을 습득하는 방식은 미래의 나에게 족쇄를 채우는 행위일 뿐입니다. 프로그래밍 언어로는 파이썬을 추천합니다. C언어와 달리 소소한 불편함이 없고 분야별로 사용하기 쉬운 패키지들이 미리 준비되어 있어서 빠르게 다양한 체험을 할 수 있습니다. 이 단계에서 주의해야할 점은 쉬운 것일수록 스스로 해결할 수 있도록 올바르게 지도받아야 합니다. 나의 두뇌가 크게 성장할 수 있는 기회를 강탈당하지 않도록 주의하세요.​3. C/C++언어를 최소한으로 공부합니다. 딱 자료구조 공부에 필요한 만큼만 공부하시면 됩니다. C/C++ 문법을 깊게 들어가는 것은 알고리즘 공부 뒤에 자신이 선택한 응용 분야에서 필요하다면 그때 하시면 됩니다. 한 언어를 공부한 후에 다른 언어를 공부하는 것은 쉽구나 하는 체험도 이 단계에서 거쳐가야겠지요.​4. 프로그래밍 연습으로써의 자료구조 공부를 진행합니다. 우리의 목표는 "생각하는 방법 = 알고리즘"이지만 프로그래밍 연습이 부족한 상태에서는 반쪽짜리 공부가 되어버릴 수도 있습니다. 생각하는 방법을 터득하면서 동시에 구현까지 할 수 있으려면 약간의 프로그래밍 연습이 필요합니다. 그렇다고 해서 "C/C++ 문법 공부"를 "프로그래밍 연습"으로 착각하면 안되기 때문에 문법은 최소로 줄이고 자료구조를 공부하는 것을 추천합니다. 파이썬으로 다양한 응용 분야를 체험해봤기 때문에 자료구조와 알고리즘의 추상적인 개념들도 필요성을 느끼고 하나씩 내것으로 만들어나갈 수 있습니다. 파이썬으로 아주 기초적인 문제풀이를 해봤다면 더 좋습니다.​5. 알고리즘 공부를 시작합니다. 보다 구체적으로는 인터넷에 답이 없는 문제도 해결할 수 있는 능력을 갖추는 것입니다. 어떻게 공부해야할까요? 이미 앞에서 쉬운 것부터 스스로 해결하는 습관을 갖추셨다면 약간의 훈련만으로 빠르게 성장하실 수 있습니다. 이 단계에서 주의해야할 점은 코딩테스트 통과를 위한 문제 풀이와 알고리즘 공부를 헷갈리면 안됩니다. 쉬운 것부터 스스로 해결해온 순간들이 모여서 이때부터 화려하게 꽃 피우기 시작합니다. 알고리즘 공부는 Java로 하는 것도 괜찮습니다. 저는 C->C++로 흐름이 자연스럽게 연결될 수 있다는 점에서 C++을 추천합니다. 앞에서 이미 한 번 경험해봤듯이 C++ 후에 자바를 공부하는 것은 빠르게 하실 수 있습니다. 다만, 전문 영역으로써 깊게 언어를 파고드는 것은 추가적인 노력이 필요합니다.​6. 코딩 테스트 문제 풀이를 천천히 시작합니다. 알고리즘에서 터들한 내용들로부터 직결되는 문제들부터 몇 개만 스스로 풀어보며 감을 잡으면 문법 공부 직후에 바로 문제풀이 시작한 사람들보다 오히려 진행 속도가 훨씬 빠를겁니다. 문제풀이는 일찍 시작하고 꾸준히 하는 것을 추천합니다. 대신에 이제부터는 전문/응용 분야와 병행해야 합니다.​7. 전문/응용 분야 공부를 시작하면서 자유와 창의성을 발휘해보세요. 웹을 HTML 사용법 익히는 정도로 생각하는 경우도 있는데 저는 웹 프로그래밍도 고도로 전문화된 응용 분야로 봅니다. 웹, 앱, 서버, 게임, AI, 비전 등의 다양한 분야가 여러분들을 애타게 기다리고 있습니다. 특정 언어의 문법을 깊이 파고 들어가는 공부도 이때 시작하시면 되는데 복잡한 문법도 이런 문법이 왜 필요한지를 깨달으면 쉽게 이해가 되기 때문에 훨씬 수월할겁니다.​당연히 저도 제한된 경험을 가지고 있는 개인이며 제가 제시한 로드맵이 모두에게 정답은 아닐 수도 있습니다. 그러나 앞으로 고도화된 현대사회에서 평생 직장이란 개념 없이 오랜 기간동안 경력을 이어나가야 하는 MZ 세대가 효율적이면서도 미래지향적인 공부를 해나가는 데에 약간의 도움이라도 되기를 바랍니다.​2023년 1월 17일​홍정모 드림

프로그래밍 언어프로그래밍공부순서프로그래머알고리즘문제풀이자료구조코딩테스트웹프로그래밍프로그래밍공부홍정모

왜 CS 전공지식은 ‘개발자 기본기’로 꼽힐까?

컴퓨터 구조, 자료구조, 알고리즘, 운영체제, 네트워크, 데이터베이스 등은 컴퓨터공학 및 컴퓨터과학, 소프트웨어공학 등의 전공에서 반드시 배우는 주제로 꼽힙니다. 학교나 학과마다 커리큘럼에 차이는 있더라도 내용 자체는 모두 동일한 개념을 배우게 되는데요.이러한 CS 전공 지식은 컴퓨터 관련 학과에서의 전공 이해를 좌우할 뿐만 아니라, 개발자 채용을 위한 기술 면접 과정에서 주로 검증하는 핵심 개념이기도 합니다. 가령 서비스 개발자라면 비즈니스 로직을 구축하는 등, 프로그램의 구조를 만들고 문제를 해결하는 바탕이 되기 때문입니다. 이미 실무에 진출한 개발자들조차도 CS 전공 지식을 강조하는 이유가 여기에 있죠.다시 말해 CS 전공 지식은 개발자로서 필요한 문제 해결 역량을 결정하는 기본기 역할을 합니다. 대학생, 취업 준비생, 주니어 개발자 등을 막론하고 실력 있는 프로그래머가 되기 위한 든든한 뿌리가 필요하다면 CS 전공 지식에 주목해야 합니다.•••기술 면접 전, 실무 프로젝트 전 빠르게 기초를 정리하고 싶으신가요?지금 인프런 프리즘 [CS 전공 지식 로드맵]을 통해 학습해보세요. https://www.inflearn.com/roadmaps/643•••인프런 프리즘 브랜드 스토리 읽어보기 >>

기타 (개발 · 프로그래밍)CS전공지식컴퓨터구조알고리즘자료구조운영체제네트워크데이터베이스컴퓨터공학인프런프리즘InflearnPrism

LV1 - 최소직사각형 만들기

<algorithm>의 min, max 함수에 대한 이해랑 숙련도가 부족했다.  min, max를 생각을 미처 못했다. - min(a, b) : a와 b를 비교하여 가장 작은 값을 반환한다. - max(a, b) : a 와 b를 비교하여 가장 큰 값을 반환한다.   내 풀이 int solution(vector<vector<int>> sizes) {   int answer = 0;   vector<int> W;   vector<int> H;   vector<int> temp;   int maxSize;   bool moreBig = false;   // 가로 세로 vector로 분리.   for (int i = 0; i < sizes.size(); i++)   {           W.push_back(sizes[i][0]);           H.push_back(sizes[i][1]);   }   // 가로 세로 오름차순으로 정렬.   sort(W.begin(), W.end());    sort(H.begin(), H.end());   // 가로 세로에서 가장 큰 수 찾고 가로에 큰 수 있으면 moreBig true 세로에 큰 수가 있으면 false.   maxSize = W.back() > H.back() ? W.back() : H.back();    moreBig = W.back() > H.back() ? true : false;   if (moreBig == true)   {       for (int i = 0; i < sizes.size(); i++)       {           if (sizes[i][0] < sizes[i][1])               sizes[i][1] = sizes[i][0];                 temp.push_back(sizes[i][1]);       }       sort(temp.begin(), temp.end());       answer = maxSize * temp.back();   }   else   {       for (int i = 0; i < sizes.size(); i++)       {           if (sizes[i][0] > sizes[i][1])               sizes[i][0] = sizes[i][1];           temp.push_back(sizes[i][0]);       }       sort(temp.begin(), temp.end());       answer = maxSize * temp.back();   }   return answer;} 잘한 사람 풀이 int solution(vector<vector<int>> sizes) {    int answer = 0;   int w = 0, h = 0;   for (int i = 0; i < sizes.size(); i++)   {       w = max(w, min(sizes[i][0], sizes[i][1]));       h = max(h, max(sizes[i][0], sizes[i][1]));   }   answer = w * h;   return answer;}

CPPC++알고리즘