ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 문제 해결 능력을 연마하는 방법
    Problem Solving/Memo 2020. 3. 6. 14:03

    문제 해결 능력은 프로그래밍 언어나 알고리즘 처럼 명확히 정의된 실체가 없는 추상적인 개념이다. 그렇기에 단순한 반복만으로는 연마하기 어렵다. 좋은 문제 해결자가 되기 위해서는 좀더 높은 차원의 수련이 필요하다. 이 수련의 목푠은 문제를 푸는 것이 아니라 문제를 푸는 기술을 연마하는 것이다. 이를 위해서는 자신이 문제를 어떤 방식으로 해결하는지를 의식하고 어느 부분이 부족한지, 어떤 부분을 개선해야 할지 파악해야한다. 문제 해결 과정을 여러 부분으로 나눠 보고 각 과정에 대한 검토를 하며 개선해 나가야한다. 각 단계에 대해 살펴보자.

     

    1. 문제를 읽고 이해한다.

    문제를 읽고 이해하는 것의 중요성은 아무리 강조해도 지나치지 않는다. 문제 설명을 공격적으로 읽으며 문제가 원하는 바를 완전히 이해하는 과정이 반드시 필요하다. 사소한 제약 조건을 잘못 이해하면 풀 수 없게 되는 문제들이 흔하다.

     

    2. 문제를 익숙한 용어로 재정의한다.

    자신이 다루기 쉬운 개념을 이용해서, 문제를 자신의 언어로 풀어 쓰는 것 이다. 요구하는 바가 복잡한 문제일수록 그 중요성이 커진다. 문제의 본질을 어떤 방식으로 재구성하느냐에 따라 어려운 문제를 쉽게 만들 수 있고, 쉽게 해결할 수 있는 문제를 오히려 어렵게 풀 수도 있다.

     

    3. 어떻게 해결할지 계획을 세운다.

    이 과정에서는 문제를 어떤 방식으로 해결할지 결정하고, 사용할 알고리즘과 자료구조를 선택한다. 사실상 문제 해결에서 가장 중요한 단계라고 할 수 있다.

     

    4. 계획을 검증한다.

    구현을 시작하기 전에 계획을 검증하는과정을 거쳐야 한다. 이 과정에서는 우리가 설계한 알고리즘이 모든 경우에 요구 조건을 정확히 수행하는지를 증명하고, 수행에 걸리는 시간과 사용하는 메모리가 문제의 제한 내에 들어가는지 확인해야한다.

     

    5. 프로그램으로 구현한다.

    프로그램을 작성하는 단계이다. 아무리 천재적인 알고리즘을 구현했더라도 그 구현히 부정확하거나 비효율적이면 프로그램은 정확히 동작할 수 없다. 따라서 구현 과정의 중요성은 아무리 강조해도 부족하지 않다.

     

    6. 어떻게 풀었는지 돌아보고, 개선할 방법이 있는지 찾아본다.

    문제 해결에 당장 직접적인 영향은 없지만 장기적으로 가장 큰 영향을 미치는 단계가 바로 회고이다. 회고란 자신이 문제를 해결한 과정을 돌이켜 보고 개선하는 과정을 말한다. 문제 해결 기술은 추상적인 기술이기 때문에 이를 연마하기 위해서는 자신이 이 기술들을 어떻게 사용하고 있는지를 돌아보고 개선해야 한다. 효과적으로 회고를 수행하는 가장 좋은 방법은 자신의 경험을 기록으로 남기는 것이다. 이때 문제의 간단한 해법과 함께 어떤 방식으로 접근했는지, 그리고 문제의 해법을 찾는 데 결정적이었던 깨달음은 무엇이었는지를 기록하면 좋다.

     오답 원인도 꼭 기록하는 것이 좋다. 과거의 실수에서 배우기란 매우 어렵기 때문에 대개 한 실수를 반복하게 되는데, 오답 노트를 적다 보면 자신이 자주 틀리는 부분을 알게 되고 결과적으로 실수를 줄일 수 있게 된다. 이렇게 기록을 많이 남기면서 쌓여가는 기록을 보는 것도 공부하는 하나의 재미가 되기도 한다. 

     

    문제를 풀지 못할 때

    초보일 경우 한 문제에 너무 매달려 있는 것은 좋지 않다. 일정 시간이 지나도록 고민해도 답을 찾지 못할 때는 다른 사람의 소스코드나 풀이를 참조한다는 원칙을 세우고 이를 지키는 것이 좋다. 단, 다른 사람의 소스 코드나 풀이는 참조할 때는 반드시 복기를 동반해야한다. 자신이 문제를 해결할 때 취했던 접근들을 되새겨 보고 자신이 왜 이풀이를 떠올리지 못했는지를 살펴봐야 한다는 이야기다.

     

    주의

    문제를 풀 때 항상 여기에서 설명한 단계에 하나하나 맞추어 가며 생각을 전개하라는 말은 아니다. 단계의 구분은 어디까지나 생각을 돕기 위한 도구이기 때문이다. 경험이 많은 실력자들은 이 과정을 엄밀히 따라가지 않는다. 그렇다고 해서 이 단계에 소개된 작업들을 완전히 생략하지도 않는다. 경험이 쌓임에 따라 이 과정들을 따로 의식하지 않아도 수행할 수 있기 때문이다.

    'Problem Solving > Memo' 카테고리의 다른 글

    정답을 위해 신경써야 할 것들  (0) 2020.04.09
    분야를 막론한 좋은 개발자의 조건  (0) 2020.03.06

    댓글

Designed by Tistory.