알고리즘 문제해결기법 입문

알고리즘 문제해결기법 입문

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

과목 소개
난이도
보통
카테고리
프로그래밍 - 알고리즘
태그
프로그래밍 기본, 알고리즘, 자료구조, 프로그래밍, 취업준비, 대회준비, C, C++, Java, 코딩

과목 소개

 본 과목은 단순히 이론적인 내용을 배우는 과목이 아닙니다! 논리적으로 주어진 문제를 이해하고 알고리즘을 설계하는 방법들 그리고 프로그래밍 언어를 사용해 정확히 구현하는 방법을 다루고 있습니다. 이 과목에서는 문제란 단어를 아래와 같이 정의합니다.

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

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

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

 이 처럼 소프트웨어적으로 문제를 해결하기 위해서는 종합적인 능력이 필요합니다. 소프트웨어적인 지식, 프로그래밍 언어에 대한 이해, 이산수학과 알고리즘 그리고 자료구조, 추가적으로 문제를 읽고 분석하는 언어적인 능력까지. 이를 하나하나 개별적으로 공부하는 것은 당연히 많은 시간이 걸립니다. 하지만 무작정 한 번에 공부해나가기에는 너무 속도가 더디어 지치기 마련입니다. 게다가 책과 강의에서는 말해주지 않는 경험적인 센스가 필요한 부분도 많죠.

 이에 반해 대부분의 책과 같은 교육 컨텐츠는 너무 이론적이거나, 상당한 사전 지식과 경험을 요구하는 경우가 많습니다. 이 과목에서는 가장 기초적인 문법만을 사용하여 유명한 알고리즘이 아닌 가장 기본적인 로직구현부터 차근 차근 훈련할 수 있습니다. 내가 생각한 내용을 어떻게 정확히 프로그래밍 언어로 구현할 수 있는지, 왜 이런 구현이 가능하고 정확하다고 확신할 수 있는지, 가장 기초적이지만 가장 이해하기 힘들었던 내용을 함께 배워갈 수 있습니다.

 가장 단순한 반복문과 조건문을 설계하고 증명하는 방법부터 시작해서 어려운 알고리즘과 자료구조의 이론적인 내용과 그 활용까지, 앞서 배운 내용을 다시 활용해나며 체계적으로 커리큘럼이 진행됩니다. 



추천 수강대상

  • 프로그래밍 문법을 공부했지만 여전히 구현이 어려우신 분
  • 관련 과목을 수강하는 학생
  • 기업 사내 역량평가나 입사 코딩테스트를 대비하시는 분 
  • 프로그래밍 기술 면접을 준비하시는 분 
  • 정보올림피아드, ACM ICPC등의 온라인 알고리즘 대회를 대비하고 싶으신 분


이 과목의 장점

  • 프로그래밍 문법만 알고 있으면 충분합니다! 알고리즘이나 자료구조적인 사전 지식을 전혀 요구하지 않습니다!
  • 수 년간 저자가 알고리즘을 공부하고 이해해왔던 경험들을 바탕으로 최대한 쉽고 이해하기 수월한 방법으로 풀어 설명하였습니다.
  • 여러 수업을 통해 학생들이 어려워하던 내용과 쉽게 이해하던 설명 방법을 반영하여 제작 했습니다.
  • 한 사이트에서 공부, 코딩, 채점을 동시에 할 수 있습니다! 이제 여러 책과 프로그램을 옮겨다니지 마세요!
  • 너무 일반적이지 않은, 오직 그 문제만을 위한 해법을 요구하는 문제는 최대한 배제하였습니다. 불필요한 아이디어나 수학 지식을 공부하기 위해 많은 시간을 허비하지 않아도 됩니다.
  • 밑바닥부터 혼자 프로그래밍을 공부하면 좋지 않은 코딩 버릇이 생기기 마련입니다! 주어진 뼈대 코드와 모범 답안을 활용해서 좋은 코드를 작성하는 방법을 배울 수 있습니다.


과목의 목표

  현실에서 마주치게 될 문제들은 수 많은 아이디어와 지식 그리고 경험적인 센스를 요구합니다. 당연히 하나의 과목에서 이 모든 것들을 다룰 수는 없습니다. 말 한마디 '아' 다르고 '어' 다른 것 처럼, 우리가 마주칠 업무와 문제들은 서로 비슷해보여도 전혀 다른 해결 방법을 요구합니다. 이 과목의 목표는 수강하는 학생들에게 모든 지식을 주입하는 것이 아닙니다. 과목의 진짜 목표는 다음과 같습니다.

  1. 가장 기본적이고 자주 활용되는 아이디어와 테크닉을 이해한다.
  2. 직접 구현하고 적용해보는 과정을 통해 프로그래밍 사고력을 기른다.
  3. 결과적으로 자신의 생각을 코드로 실체화할 수 있는 능력을 기른다.

 이 과목을 수강한 가장 이상적인 수강생의 모습은 특정 지식을 몰라서 구현하지 못할지라도, 지금 필요한 것이 무엇인지 판단하고 스스로 습득하고 적용할 수 있는 능력을 가지는 것입니다. 각 챕터에 수록 된 문제들은 이 수업에서 다룬 내용과 간단한 아이디어들 만으로 해결할 수 있는 수준으로 구성됩니다. 하지만 앞서 배운 내용들 계속해서 활용할 것을 요구합니다.

 

과목의 구성

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


 각 챕터의 연재 순서는 [강의 구성]을 참고해주세요. 본 과목은 계속 연재중인 과목이며, 이 과정에서 새로운 컨텐츠가 추가되거나 변경될 수 있습니다.



대상 프로그래밍 언어

 기본적인 수업 자료와 예시는 가장 대중적이고 직관적인 Java를 기준으로 작성됩니다. 하지만 대부분 기초적인 문법을 사용하고 각 코드에 대한 설명이 충분하기에 Java를 몰라도 이해하는데에 지장이 없습니다. 

  • 주요 수업 언어
    • Java, C++
    • 수업 자료와 설명에 활용되는 가장 기본적인 언어입니다.
  • 보조 수업 언어 (준비중)
    • Python 3
    • 뼈대코드와 모범 답안을 제공 할 언어입니다.
  • 채점/실행 가능한 언어
    • 대부분의 프로그래밍 언어를 활용해 실습 문제를 풀어볼 수 있습니다
    • Python 2, Go, Java Script, Kotlin, C#, Ruby, ... 


수강을 위해 알아야 할 내용

  이 과목은 수학이나 프로그래밍 문법을 주로 다루는 과목이 아니므로, 원활한 수강을 위해서는 아래의 지식을 알고 있거나 검색할 수 있는 능력이 필요합니다. 본인이 충분히 검색과 독학으로 병행할 수 있다면 문제 없습니다.

  • 하나 이상의 언어에 대한 기초적인 문법
    • 변수, 배열, 함수, 클래스, 표준 입출력 사용 방법 등 
  • 코드를 작성하고 실행하는 방법
  • 중고등학교 교과 수준의 수학적 용어 및 표기법
    • 집합, 명제, 함수 등 
  • 필요한 지식을 구글에 검색할 수 있는 능력


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

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

  • <미 출간 된 저서> (김동이 저)
  • 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


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

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

  • 서병찬, 이원우, 박성준 조교 (아주대학교 소프트웨어학과)
  • 천민호 (PUBG 개발자)
  • 송명근 (연세대학교 물리학과 대학원생)
  • 박지현 (성균관대학교 전자전기공학과)
  • 정인섭 (연세대학교 컴퓨터공학과)
  • 이재범 (안드로이드 개발자)
  • 백창민 (자칭 코딩 공부하는 백수)
더보기
체험하기
모두 펼치기
교육 과정
모두 펼치기
  • 01
    About Course
  • 공부하는 방법
    문제 모범 답안
    수강생 전용 Slack
    공식 오프라인 강의
  • 02
    0. Introduction & Tutorial
  • 알고리즘과 자료구조
    문제 해결하기
    약속하기
    문제의 구성
    문제0A-출력해보기
    문제0B-입력받아보기
    문제0C-반복해보기
    문제0D-저장해보기
    문제0E-테스트케이스
  • 03
    1. 코드와 친해지기
  • 챕터1 강의노트 (임시)
    코드와 친해지기
    반복문과 친해지기
    문제1A-최대값 함수
    문제1B-배열의 최대값
    문제1C-카운팅하기
    문제1D-합 구하기1
    문제1E-합 구하기2
    문제1F-탐색하기1
    문제1G-탐색하기2
    문제1H-탐색하기3
    문제1I-선택정렬 구현하기
    문제1J-합 구하기3
    단원 되짚어보기 & 해설
  • 04
    2. 알고리즘의 연산량
  • 연산량과 시간복잡도
    챕터2 강의노트 (임시)
    실제 연산량 줄이기
    문제2A-도토리 키재기
    문제2B-오름차순인가?
    문제2C-다양성
    문제2D-문자열의 비교
    문제2E-소수의 판별
    문제2F-데스티니
    문제2G-버블정렬 구현하기
    문제2H-픽셀 수 세기
    문제2I-정주행
    문제2J-승부 조작
    단원 되짚어보기
  • 05
    3. 공간 활용하기
  • 배열의 특징
    챕터3 강의노트(임시)
    배열 활용하기
    문제3A-전화번호
    문제3B-페인트
    문제3C-응모
    문제3D-피보나치 나머지
    문제3E-색종이
    문제3F-과유불급
    문제3G-팬미팅
    문제3H-두 카드
    문제3I-세 카드
    문제3J-네 카드
  • 06
    4. 자주 사용되는 수학 알고리즘
  • 챕터4 강의노트(임시)
    문제4A-스도쿠 보드
    문제4B-Probing
    문제4C-최대공약수와 최소공배수
    문제4D-수열의 순환
    문제4E-소인수 분해
    문제4F-소수 세기
    문제4G-배열 흔들기
    문제4H-카잉 달력
    문제4I-골드바흐의 추측
    문제4J-공약수 게임
  • 07
    5. 구현 훈련하기
  • 문제5A-놀이 공원
    문제5B-거대 놀이 공원
    문제5C-레이저 타워
    문제5D-레이저 타워 건설하기
    문제5E-숫자 채우기1
    문제5F-숫자 채우기2
    문제5G-숫자 채우기3
    문제5H-두 직사각형
    문제5I-두 선분
    문제5J-로봇 청소기
    문제5K-고성능 로봇 청소기
    문제5L-NBA농구
    문제5M-와일드 카드
    문제5N-패턴 검사
    문제5O-단어 퍼즐
    문제5P-이름 짓기
  • 08
    6. 자료구조 활용하기
  • 챕터6 강의노트 (임시)
    문제6A-괄호 문자열
    문제6B-탑
    문제6C-히스토그램
    문제6D-조세퍼스 문제
    문제6E-폭탄 제거
    문제6F-폭탄 제거 순서 정하기
    문제6G-불안정 지역
    문제6H-중복 제거하기
    문제6I-정사각형
    문제6J-빈도수 세기
    문제6K-시장 추천하기
    문제6L-배열 합치기
    문제6M-이중 우선순위 큐
    문제6N-중앙값 큐
    문제6O-피자 하와이
  • 09
    7. 재귀 함수와 분할 정복
  • 챕터7 강의노트(임시)
    [문제07A] 모든 조합 출력하기
    [문제07B] 하노이의 탑
    [문제07C] 단지 번호 붙이기
    [문제07D] Merge Sort 구현하기
    [문제07E] Quick Sort 구현하기
    [문제07F] 히스토그램
    [문제07G] Counting Inversion Pairs
    [문제07H] Finding Closet Pair
  • 10
    8. DFS/BFS
  • 챕터8 강의노트(임시)
    [문제08A] - 그래프의 탐색 1
    [문제08B] - 그래프의 탐색 2
    [문제08C] - 그래프의 최장 경로
    [문제08D] - 그래프의 최단 경로
    [문제08E] - 바이러스
    [문제08F] - 미로 탈출하기
    [문제08G] - 토마토
    [문제08H] - 소수 경로
    [문제08I] - 스도쿠 보드 채우기
    [문제08J] - N Queen
  • 11
    9. 그래프 알고리즘
  • 챕터9 강의노트(임시)
    [문제09A] 해밀턴 경로
    [문제09B] 외판원 순회 문제
    [문제09C] 한 붓 그리기
    [문제09D] 그래프의 연결성
    [문제09E] 최소 신장 트리 1
    [문제09F] 최소 신장 트리 2
    [문제09G] 그래프의 최단 거리
    [문제09H] 그래프의 최단 거리 2
  • 12
    10. 동적 계획법
  • [문제10A] 가장 긴 부분 증가수열 (LIS)
    챕터10 강의노트(임시)
    [문제10B] 팬스 수리하기
    [문제10C] 아르바이트
    [문제10D] 회선 설치하기
    [문제10E] 2차원 누적합
    [문제10F] 퀼팅(Quilting)
    [문제10G] 가장 긴 공통 부분 문자열 (LCS)
    [문제10H] Ah-choo!
    [문제10I] 곱하기는 귀찮아
    [문제10J] 올바른 괄호 문자열
    [문제10K] 배낭 문제 (Knapsack Problem)
    [문제10L] 7 Segment Display
  • 13
    11. 문제를 푸는 다른 방법
  • 챕터11 강의노트(임시)
    [문제11A] 지하철을 빠르게 빠르게
    [문제11B] 감시 로봇
    [문제11C] 복도 통과하기
    [문제11D] Selling Cells
    [문제11E] 인구조사
    [문제11F] 그래프 최소 분할
  • 14
    12. 문자열 알고리즘
  • 챕터12 강의노트 (임시)
    [문제12A] Rabin Karp
    [문제12B] KMP
    [문제12C] 실패함수 계산하기
    [문제12F] Trie 구현하기
강의자 소개
user
김동이Teacher
과목 후기
  • 작성된 리뷰가 없습니다.

50,000


평균평점
4.6
난이도
보통
수강인원
794 명
수강기간
제한 없음
URL