알고리즘 문제해결기법 입문 (연재)
프로그래밍 기본

알고리즘 문제해결기법 입문 (연재)

알고리즘을 기반으로 프로그래밍 문제해결능력을 기르기 위한 기반을 다지는 입문 코스입니다

과목 소개

과목 소개

 이 과목은 프로그래밍 언어를 활용해 현실의 다양한 문제들을 해결하는 방법들, 즉 알고리즘 설계하고 구현하는 방법을 배웁니다. 이 과목에서는 문제란 단어를 아래와 같이 정의합니다.

문제란, 요구사항과 제한사항이 명확히 주어진 지시사항을 의미하며 우리가 소프트웨어적인 방법으로 해결해야 할 대상입니다.

그리고 문제 해결이란, 아래의 과정을 통해 주어진 지시사항을 완료하는 것을 의미합니다.

  • 일상의 언어로 표현된 지시사항을 분석하여 소프트웨어적인 방법으로 해결할 수 있는 이산적인 문제로 추상화하고
  • 이를 해결할 수 있고 실제로 현재 구현할 수 있는 알고리즘들을 설계한 후
  • 주어진 조건과 제한사항에 가장 적합한 알고리즘을 결정한 뒤에
  • 프로그래밍 언어를 통해 정확히 구현한다.

 이 처럼 하나의 문제를 해결하기 위해서는 기초적인 이산수학과 소프트웨어적인 지식뿐만 아니라 유명한 알고리즘과 자료구조 그리고 성능을 평가하는 방법, 구현과 디버깅 기법등의 종합적인 능력이 필요합니다. 이를 하나하나 개별적으로 공부하는 것은 당연히 많은 시간이 걸리며 또한 이를 함께 복합적으로 활용하는 것도 쉽지 않습니다. 또한 활용하는 속도는 경험적인 부분의 영향이 크기 때문에 많은 훈련이 필요합니다. 이에 반하여 아직 대부분의 책과 교육 컨텐츠는 처음 공부하기에는 요구하는 사전 지식이 많거나 유명한 알고리즘들을 나열하기만 한 경우가 많습니다. 이 과목에서는 하나의 언어를 정하고 기초적인 문법만 공부하였다면 충분히 공부를 시작할 수 있으며 기초적인 내용부터 단계적으로 배워나갈 수 있습니다.

 이 과목에서는 문제 해결에 필요한 지식들을 기초부터 하나씩 배워나가고 많은 문제를 실제로 풀어보며 자신의 것으로 만들어나갈 수 있습니다. 당연히 문제 해결의 최종 단계는 자신이 작성한 코드이기 때문에 이 과정에서 프로그래밍 문법에 익숙해지고 구현능력을 개발할 수 있습니다. 각 단원들의 순서들 또한 기초부터 시작하여 앞 단원과 문제들의 내용을 뒤에서 계속적으로 활용하는 식으로 전개되어 순서대로 따라가기만 해도 효율적으로 배울 수 있는 커리큘럼을 제공합니다. 추가적으로 필요시에는 각 문제를 하나하나 자세하게 풀고 직접 구현하는 동영상 강의를 수강하여 공부시간을 단축시킬 수 있습니다.


  • 주요 수업 언어
    • C++, Java
  • 보조 수업 언어
    • C, Python2, Python3
  • 채점/실행 가능한 언어
    • Go, Java Script


추천 수강대상

  • 프로그래밍 문법 이후에 구현능력과 논리적 사고력을 훈련하고 싶은 분
  • 입사/사내 프로그래밍 역량평가등 코딩테스트나 면접을 대비하시는 분 
  • 정보올림피아드, ACM ICPC등의 온라인 알고리즘 대회를 대비하고 싶으신 분 
  • 컴퓨터공학과 및 관련학과 대학(원)생


이 과목의 장점

  • 수 년간 저자가 알고리즘을 공부하고 이해해왔던 경험들을 바탕으로 최대한 쉽고 이해하기 수월한 방법으로 풀어 설명하였습니다.
  • 여러 강의/괴외 경험을 바탕으로 학생들이 어려워하던 내용과 쉽게 이해하던 설명 방법에 비중을 두고 과목을 제작하였습니다.
  • 프로그래밍 문법만 알고 있으면 완전 기초부터 차례로 따가기만 해도 공부에 지장이 없습니다. 또한 앞의 내용들이 단원이 진행될 수록 계속 재사용되기에 자연스럽게 복습해볼 수 있습니다.
  • 여러 사이트와 책을 옮겨다닐 필요 없이 한 사이트에서 순서대로 공부하고 또 바로 채점받아 볼 수 있습니다. 더 이상 수 많은 책과 프로그램과 인터넷 탭을 옮겨가며 공부하지 마세요.
  • 수 많은 책, 대회, 시험, 면접후기를 참조하고 아이디어를 종합하여 좋은 문제를 추렸습니다. 다양한 대회와 기업 시험들에 빈번히 사용되는 테크닉들을 골고루 활용해보고 복습할 수 있도록 문제들을 구성했습니다.
  • 너무 일반적이지 않은, 오직 그 문제만을 위한 해법을 요구하는 문제는 최대한 배제하였습니다. 불필요한 아이디어나 수학 지식을 공부하기 위해 많은 시간을 허비하지 않아도 됩니다.
  • 온라인 해설 강의로 도움을 받을 수 있습니다. 온라인 강의에서는 각 단원의 문제들을 하나하나 해설하고 직접 구현하며 이 과정에서 필요한 지식들을 정리해 나갑니다. 

 

과목의 목표와 구성

  현실에서 마주치게 될 문제들에 사용되는 수 많은 아이디어와 지식들을 이 한 과목에서 모두 다룰 수는 없습니다. 현실에서도 말 한마디 '아' 다르고 '어' 다른 것 처럼, 우리가 마주칠 업무와 문제들은 서로 비슷해보여도 서로 다른 지식과 아이디어를 요구할 수 있습니다. 이 과목의 목표는 수강하는 학생들에게 모든 지식을 주입하는 것이 아닙니다. 기본적으로 자주 활용되는 아이디어에 대해 가이드라인을 제시하고, 실제로 자신이 구현하고 적용해보는 과정을 통해 자신의 생각을 코드로 실체화 시킬 수 있는 능력을 갖추게 만드는 것을 목표로 합니다. 가장 이상적인 수강생의 모습은 특정 지식을 몰라서 구현하지 못할지라도 지금 필요한 것이 무엇인지 판단하고 스스로 습득하고 구현할 수 있는 능력을 가지는 것입니다. 각 챕터에 수록 된 문제들은 이 수업에서 다룬 내용과 간단한 아이디어들 만으로 해결할 수 있는 수준으로 구성됩니다. 

 

 이 과목의 세부 구성은 제작하는 과정에서 변경될 수 있습니다.

  • 알고리즘과 자료구조의 정의와 중요성
  • 알고리즘과 자료구조의 성능을 평가/비교하는 방법
  • 자신이 생각한대로 자연스럽게 코드를 전개하는 방법
  • 귀납적 추론으로 알고리즘을 구상하고 연역적인 방법으로 이를 증명하는 능력
  • 변수와 반복문 만으로 구현할 수 있는 기본적인 알고리즘들
  • 재귀함수에 대한 이해
  • 자주 활용되는 프로그래밍 패턴
  • 프로그래밍에서 빈번히 사용되는 최적화 기법들
  • 내가 원하는 결과를 찾아내는 기법들 - Linear Search, Parametric Search, DFS, BFS, Back Tracking 등의 기법들 
  • 문제에 접근해볼 수 있는 다양한 방법론 - Divide & Conquer, Brute Force, Greedy Approach, Dynamic Programming
  • (부록) 유용하게 사용할 수 있는 언어별 기능들 (STL, API, Collection 등)
  • (부록) 다양한 오류 해결하기
  • (부록) 실제 시험과 대회에서 꼭 알아야 할 지식들


 각 챕터의 연재 순서는 [강의 구성]을 참고해주세요. 각 챕터는 7~14일 간격으로 연재 완료됩니다. 단, 중간에 강의별로 업로드나 수정이 될 수 있습니다.


수강을 위해 알아야 할 내용들

  이 과목은 수학이나 프로그래밍 문법을 전반적으로 다루는 과목이 아니므로 원활한 수강을 위해서는 아래의 지식을 알고 있거나, 검색을 통해 학습할 수 있는 능력이 필요합니다. 본인이 충분히 검색등의 방법을 통하여 공부할 수 있다면 필요한 내용들만 병행하여도 좋습니다.

  • 변수, 배열, 조건/반복문, 함수, Class 선언 방법 등 
  • 코드를 작성하고 실행하는 방법
  • 중~고등학교 교과 수준의 수학적 용어 및 표기법
  • 필요한 지식을 구글에 검색할 수 있는 능력


이 과목의 제작을 위해 참고한 자료들 

 최대한 유용한 정보를 정확하고 이해하기 쉽게 전달하기 위하여 개인적으로 알고 있는 내용들 외에도 많은 자료들을 참고하였습니다.

  • <미 출간 된 저서> (김동이 저)
  • Introduction to algorithms 3/e (Thomas H. 외 저)
  • Introduction to the design and analysis of algorithms 3/e (Levitin 저)
  • 가장 쉬운 알고리즘 책 (미와 요시코 저)
  • 알고리즘 문제 해결 전략 (구종만 저)
  • 프로그래밍 콘테스트 챌린징 (Takuya Akiba 외 저)
  • 위키피디아

 

 이 과목에서 제공되는 문제들은 개인적인 아이디어 뿐만 아니라 위에서 언급한 책과 아래의 사이트/대회/시험을 참고하여 제작되었습니다. 아이디어가 아니라 문제 자체를 활용한 경우에는 문제별로 상세 출처를 기재하며 저작권상의 이유로 문제를 무료로 공개합니다.

  • ACM ICPC
  • COCI 
  • 한국 정보올림피아드
  • Codeforces
  • Google Code Jam
  • Lavida Online Judge
  • Baekjoon Online Judge


이 과목 제작에 도움을 주신 고마운 분들

 이 과목의 컨텐츠들을 만드는 과정에서 함께 고민해주시고 귀중한 시간을 투자하여 리뷰해주신 분들입니다.

  • 송명근 (연세대학교 물리학과 대학원생)
  • 박지현 (성균관대학교 전자전기공학과)
  • 정인섭 (연세대학교 컴퓨터공학과)
  • 이재범 (안드로이드 개발자)
  • 백창민 (자칭 코딩 공부하는 백수)
  • 이원우 (과목 제작 조교, 아주대학교)
  • 아주대학교 알고리즘 소학회 A.N.S.I.

교육과정

7. 재귀 함수와 분할 정복 (준비중)

8. DFS (준비중)

  • 열려 있는 수업이 없습니다.

9. BFS (준비중)

  • 열려 있는 수업이 없습니다.

10. 동적 계획법 (준비중)

  • 열려 있는 수업이 없습니다.

11. 동적 계획법 유형 (준비중)

  • 열려 있는 수업이 없습니다.

Appendix - Java

  • 열려 있는 수업이 없습니다.

Appendix - C++

  • 열려 있는 수업이 없습니다.

과목 평가

  • jieun kang

    jieun kang2017.8.23

    김동이 교수님 차근차근 설명 잘해주세요 ㅎ

  • 정진원

    정진원2017.8.18

    많이 배워갑니다

  • 김ᄅᄂ

    김ᄅᄂ2017.9.16

    좋아요!! ㅋㅋ

  • 류정현

    류정현2017.9.15

    화이팅하십셔

  • 김형호

    김형호2017.4.7

    Bery good

결제하기
난이도
보통
등록한 학생
660 명
강의 기간
10
50,000
35,000
(30%)
강사소개
김동이

김동이 교사

3
692
정경욱 (codigm)

정경욱 (codigm) 교사

49
5447
codigm

codigm 교사

61
3946
이원우

이원우 교사

0
0
코딩몬스터

코딩몬스터 교사

0
0
김현화(codigm)

김현화(codigm) 교사

9
7
과목 평가

5.09명이 평가함