# 초심자를 위한 알고리즘

# 공부 전략

# 공부 방법의 선택

  1. 언어가 익숙치 않을 때
  • 일단 쉬운 문제부터 무작정 풀기
  1. 언어는 익숙한데 공부를 시작한 지 얼마 되지 않았다
  • 기초 주제에 관한 문제들 풀기. (DFS, BFS, DP)
  1. 기초 주제들을 어느정도 공부 했다.
  • 무작정 풀다가 모르는 주제가 있으면 공부하자.
  • 문제 해결의 재미를 느껴가면서 차근차근
  • 책을 한번에 다 보려고 하면 안된다. 필요할 때마다 한 주제씩 정복 (훏어보기 -> 한 주제 정복 -> 훏어보기 사이클)

# 같이 공부하기

  • 동아리나 스터디 그룹
  • 온라인 저지의 커뮤니티 (BOJ, 알고스팟의 슬랙)
  • 접할 수 있는 정보의 양이 다르다.
  • 같은 문제를 놓고 토론하며 공부하기.
  • 동반자 & 라이벌

# 깊게 공부하기

  1. 여러 자료로 공부하자.
  • 같은 주제도 설명이 다른 경우가 많다.
  • 어떤 설명이 내게 더 와 닿을지 모른다. 특히 코드의 경우.
  • 구글링
    • 종만북
    • 프로그래밍 콘테스트 챌린징(노란 책)
    • Competitive Programming 3 by Steven Halim
    • Introduction to Algorithms (CLRS)
  1. 나의 언어로 설명해보자.
  • 글로 써본다던가 (블로그)
  • 혼자 생각하는 것과 설명하는 것의 차이
  1. 자신이 직접 코드를 짜서 AC를 받고 넘어가자.
  • 해답을 보고 이해했다고 해서 풀 줄 아는 문제가 되는 게 아니다.
  • 짜보지 않으면 같은 문제가 나와도 못 풀 확률이 높다.
  1. 복사 + 붙여넣기를 하지 말자.
  • 비슷한 문제를 풀어서 재사용 가능한 코드가 있다고 해도 다시 짜자.
  • 반복 숙달
  • 막힘 없이 코딩할 수 있는 능력
  • 디버깅 능력
  1. 문제의 유형을 세분화해두자. (당연히 풀이도)
    • DAG 에서 최장경로 구하기
    • 트리에서 최대 독립 집합 구하기
    • 트리의 지름 구하기
    • 이분 그래프 판별하기

# 효율적으로 문제 풀기

  1. 한 문제에 오래 매달리지 말자.
  • 시간을 정해놓고 그 시간을 넘겨도 풀지 못하면 답을 보자.
  • 고민하는 과정에서 배우는 것도 있지만, 처음에는 일단 많은 풀이와 사실을 아는 게 더 중요하다.
  1. 적정 난이도의 문제 풀기.
  • 보자마자 풀 수 있는 문제는 나중에도 그럴 가능성이 높음.
  • 어느 정도 생각해야 풀 수 있는 문제.
  • 교훈이 있는 문제
  • 난이도가 보이는 문제들을 풀면 좋다. USACO를 추천.
  • 나와 비슷한 실력을 갖춘 사람이 몇 번 틀리고 푼 문제를 풀어보자.
  1. 다른 사람의 코드를 보자
  • 다른 풀이 & 좋은 코딩법을 발견할 수 있다.
  • 코드를 읽고 이해하는 능력을 키울 수 있다.
  1. 풀이에 확신이 들 떄 코딩을 하자.
  • 풀이를 논리적으로 설명할 수 있어야 한다.
  • 증명하는 습관.
  • 어중간한 상태에서 코딩하면 코딩이 말리는 경우가 많다.

# 출처