안녕하세요. 컴퓨터학부 21학번 나정휘입니다.
알고리즘 문제를 풀기 위해서는 사전지식, 문제해결능력, 구현력, 이렇게 3가지 요소가 잘 갖춰져있어야 합니다.
사전지식은 DFS, Stack, 미적분학과 같은 수학적/전산학적 지식입니다. 다익스트라 알고리즘을 모르면 최단 경로 문제를 해결할 수 없듯, 문제를 풀기 위해서는 사전지식이 있어야 합니다.
문제해결능력은 주어진 문제를 잘 분석해서 풀기 좋은 형태, 즉 알고 있는 사전지식을 사용하기 편하게 문제를 분할/변형하는 능력입니다. 아무리 사전지식이 많더라도 문제해결능력이 부족하다면 문제를 조금만 비틀어도 해결하지 못합니다.
구현력은 생각한 로직을 코드로 작성하는 능력입니다. 알고리즘 문제를 푼다는 것은 주어진 입력에 대해 올바른 정답을 출력하는 코드를 작성하는 과정이기 때문에, 코드로 자신의 생각을 표현할 수 있어야 합니다.
사전지식은 인터넷에 있는 다양한 자료들을 보며 공부하면 쉽게 늘릴 수 있습니다. 유료 강의들도 대부분 사전지식에 초점을 맞추고 있습니다. 좋은 자료가 많이 모여있는 블로그를 소개해 드리겠습니다.
문제해결능력은 어느정도 지능에 영향을 받습니다. 똑똑한 사람들은 딱히 훈련하지 않아도 되지만, 저는 다른 분들에 비해 똑똑하지 않기 때문에 나름대로 다른 방법을 고민했습니다.
사실 어느정도 레벨 이하에서는 나올 수 있는 유형이 한정적입니다. 그래서 문제를 많이 풀어보고 접근 방법을 기억해놓으면, 비슷한 문제를 봤을 때 쉽게 해결할 수 있습니다.
하지만 이런 방법으로 모든 문제를 커버하지 못하기 때문에, 문제해결능력을 길러야 합니다. 저는 문제를 30분~2시간 정도 고민했는데 풀지 못했다면 풀이를 봅니다. 이때 풀이 자체보다는 풀이 작성자가 어떠한 사고 과정을 거쳐 풀이에 도달했는지에 주목하며 풀이를 읽었습니다. 작성자의 사고 흐름을 따라가는 훈련이 많은 도움이 되었습니다.
여러 사고 스텝을 거쳐가는 문제를 풀어보는 것이 중요한데, solved.ac 클래스 문제나 USACO 문제를 풀어보는 것이 좋습니다. 코딩 테스트가 목적이라면 USACO 브론즈~실버 레벨을 풀어보시면 됩니다.
구현력이 부족하면 키보드를 잡고 코드를 짜기 전에 종이와 펜을 이용해서 설계를 하는 것이 좋습니다. 각 함수의 입력과 출력을 정의해놓고 코드 작성을 시작하면 구현을 편하게 할 수 있습니다.
컴퓨터학부 18학번 권욱제님이 작성하신 글( http://wookje.dance/2019/04/16/how-to-study-algorithm/ )과 글 상단에 링크된 글을 읽어보시면 좋을 것 같습니다.
2022년 3월 28일 (월) 오후 4:45, Loui Minister <[email protected]>님이 작성: