# 초심자를 위한 알고리즘
# 공부 전략
# 공부 방법의 선택
- 언어가 익숙치 않을 때
- 일단 쉬운 문제부터 무작정 풀기
- 언어는 익숙한데 공부를 시작한 지 얼마 되지 않았다
- 기초 주제에 관한 문제들 풀기. (DFS, BFS, DP)
- 기초 주제들을 어느정도 공부 했다.
- 무작정 풀다가 모르는 주제가 있으면 공부하자.
- 문제 해결의 재미를 느껴가면서 차근차근
- 책을 한번에 다 보려고 하면 안된다. 필요할 때마다 한 주제씩 정복 (훏어보기 -> 한 주제 정복 -> 훏어보기 사이클)
# 같이 공부하기
- 동아리나 스터디 그룹
- 온라인 저지의 커뮤니티 (BOJ, 알고스팟의 슬랙)
- 접할 수 있는 정보의 양이 다르다.
- 같은 문제를 놓고 토론하며 공부하기.
- 동반자 & 라이벌
# 깊게 공부하기
- 여러 자료로 공부하자.
- 같은 주제도 설명이 다른 경우가 많다.
- 어떤 설명이 내게 더 와 닿을지 모른다. 특히 코드의 경우.
- 구글링
- 책
- 종만북
- 프로그래밍 콘테스트 챌린징(노란 책)
- Competitive Programming 3 by Steven Halim
- Introduction to Algorithms (CLRS)
- 나의 언어로 설명해보자.
- 글로 써본다던가 (블로그)
- 혼자 생각하는 것과 설명하는 것의 차이
- 자신이 직접 코드를 짜서 AC를 받고 넘어가자.
- 해답을 보고 이해했다고 해서 풀 줄 아는 문제가 되는 게 아니다.
- 짜보지 않으면 같은 문제가 나와도 못 풀 확률이 높다.
- 복사 + 붙여넣기를 하지 말자.
- 비슷한 문제를 풀어서 재사용 가능한 코드가 있다고 해도 다시 짜자.
- 반복 숙달
- 막힘 없이 코딩할 수 있는 능력
- 디버깅 능력
- 문제의 유형을 세분화해두자. (당연히 풀이도)
예
- DAG 에서 최장경로 구하기
- 트리에서 최대 독립 집합 구하기
- 트리의 지름 구하기
- 이분 그래프 판별하기
# 효율적으로 문제 풀기
- 한 문제에 오래 매달리지 말자.
- 시간을 정해놓고 그 시간을 넘겨도 풀지 못하면 답을 보자.
- 고민하는 과정에서 배우는 것도 있지만, 처음에는 일단 많은 풀이와 사실을 아는 게 더 중요하다.
- 적정 난이도의 문제 풀기.
- 보자마자 풀 수 있는 문제는 나중에도 그럴 가능성이 높음.
- 어느 정도 생각해야 풀 수 있는 문제.
- 교훈이 있는 문제
- 난이도가 보이는 문제들을 풀면 좋다. USACO를 추천.
- 나와 비슷한 실력을 갖춘 사람이 몇 번 틀리고 푼 문제를 풀어보자.
- 다른 사람의 코드를 보자
- 다른 풀이 & 좋은 코딩법을 발견할 수 있다.
- 코드를 읽고 이해하는 능력을 키울 수 있다.
- 풀이에 확신이 들 떄 코딩을 하자.
- 풀이를 논리적으로 설명할 수 있어야 한다.
- 증명하는 습관.
- 어중간한 상태에서 코딩하면 코딩이 말리는 경우가 많다.