목차
내 문제 해결 과정의 문제
이때까지 나는 어떤 문제를 만나면, 무작정 풀기만 했다.
정말 문제 푸는 방식이라는게 있을까 싶을 정도였다.
제대로 된 알고리즘 공부법도 몰랐고, 어떻게 하는지도 몰랐다.
그저 백준의 문제를 푸는게 재밌어서, 이렇게 해보면 어떨까
저렇게 해보면 어떨까 하면서 즉흥적으로 풀어왔다.
이게 필요하면 그때 이걸 공부하고,
저게 필요하면 그때 저걸 공부하고.
풀면서도 이건 너무 기초가 안되는거 아닐까..
싶기도 했지만, 문제 푸는것 자체가 너무 재밌었다.
근데 이제 한계가 왔다.
더 이상은 즉흥적으로 문제가 풀리지 않는다.
내가 쌓아온건 얼마 되질 않았고, 그마저도 불안한 상태였다.
그러니 제대로 문제가 풀릴리가..
그렇게
문제를 어떻게 해결해 갈 것인가.
가장 기본적인 틀부터 차근차근 만들어가자.
문제 해결 단계
1. 문제를 이해한다
2. 문제를 익숙한 용어로 바꾼다
3. 어떻게 해결할지 계획을 세운다
4. 계획이 맞아 떨어지는지 확인한다.
5. 구현해서 확인해본다.
6. 내 풀이를 다시한번 보고, 개선점을 생각해본다.
문제를 이해하기.
돌아보니, 이 부분부터 잘못되어서 막혔던 부분이 많다고 생각한다.
문제를 제대로 다 읽지 않아서, 혹은 읽었는데 어떤 부분을 빠뜨려서 등의 이유로
문제를 이해하지 못하고 문제를 풀게 되서 몇시간을 낑낑대었던 기억이 난다.
이런 알고리즘 문제 뿐만 아니라, 현실은 더더욱 이런 사소한 부분에서
신경쓸 곳이 많다고 생각한다.
프로그램은 정말 자그마한 차이가 큰 변화를 만들어 오기 때문에,
눈에 띄지 않는 부분까지 전부 캐치해서
확실하게 이해하는 것이 중요하다고 생각한다.
문제를 익숙한 용어로 바꾸기.
문제를 좀 더 쉽게, 직관적으로 이해하기 위해서
내가 이해하기 쉬운 언어로 바꾸는것이 필요하다.
너무 복잡한 문제는 정말 문제를 이해하는 것만 시간이 한나절이 걸리는 문제도 있다.
그럴 때 조리있게 문제를 줄이고, 필요한 부분만 뽑아서
추상화해간다면 문제를 이해하는데 큰 도움이 될것이다.
계획 세우기
어떻게 문제를 해결해갈지 정해야한다.
문제를 해결하면서 쓸 알고리즘, 자료구조 등을 정해서
풀어나가야한다.
사실 제일 핵심이 되는 부분이라고 생각을한다.
계획 검증하기
계획을 다 세웠으면,
시간복잡도, 공간복잡도가 문제의 상황에서 적합한지.
문제가부여한느 상황에서 항상 올바른 결과를 내어 놓는지를 검증해야한다.
이 과정을 생략하고 바로 프로그램을 구현하면
쓸데없이 계속 코드를 작성하고, 틀려서 고치고, 또 고치고
만약 그게 알고리즘 문제라면 틀렸다는것을 바로바로 알아낼 수 있겠지만,
실제 상황에서는 그게 힘들거나 불가능한 경우가 많다.
그래서 항상 검증하고 구현하는것이 중요하다.
구현하기.
이제 계획도 다 세웠겠다.
구현만 하면된다.
쉽다고 생각할 수 있는 부분이지만
이 과정도 쉽지만은 않다.
구현이 비효율적으로 되거나, 혹은 정확하지 않은 구현은
결국 틀린 답을 내놓게 된다.
구현을 많이 해보고, 효율적인 구현을 생각하고, 정확하게 구현하는 법을 익혀야 하겠다.
되돌아보기.
완성을 했다고 끝이 아니다.
다음 프로그램, 다음 문제를 위해서, 혹은 다음 버전을 위해서
우리는 내가 만들 프로그램을 다시 한번 봐야한다.
혹시 비효율적이었던 부분은 없는지,
좀 더 간단하게 할 수 있는 부분은 없는지
만약 틀렸다면, 어디서 왜 틀렸는지를 체크하자.
혹시 못찾겠다면,
다른사람의 코드를 보는것도 좋을거 같다.
다른사람과 내 코드를 비교해서 효율적이고, 간결한 부분만 체크해두자.
이렇게 찾아낸 것들을 다음코드에, 다음 문제에, 다음 버전에 적용해서
조금씩 조금씩 성장해 나갈 수 있을것이다.
'Algorithm' 카테고리의 다른 글
자주 하는 실수들(2021.06.17) (0) | 2022.08.03 |
---|---|
코딩의 중요성(2021.06.16) (0) | 2022.08.03 |
문제 해결 전략(2021.06.13) (0) | 2022.08.03 |
C/C++을 사용하면서(2021.05.15) (0) | 2022.08.03 |
이제야 시작하는 알고리즘(2021.04.15) (0) | 2022.08.03 |