목차
문제를 해결하는 방법은
두가지가 있다.
- 직관
- 체계적 접근
직관은 그 말대로
문제를 보고 바로 어떻게 풀어야 할지 예상이 가는것이다.
물론 당연히 이건 쉽지 않다.
사실 이게 된다면 이렇게 포스트를 쓰고 있지 않을거니까.
체계적 접근은 여러가지 방법을 통해
하나하나 문제를 해결해나가는 것이다.
이 포스트를 쓰고있는 이유 중 큰 비중을 차지한다고 생각하는 것.
하나하나 전략들을 소개해보겠다.
체계적 접근
비슷한 문제를 해결한 적이 있나?
예전에 비슷한 문제를 해결 한 적이 있다면,
그 문제를 참고해서 문제를 해결해 나가면 될 것이다.
하지만, 비슷한 문제를 해결해 봤다고 그 문제가 같은 건 아니다.
비슷하다고 생각해도 아예 다른 방식의 해결방법이 존재 할 수도 있다.
그러니 문제를 제대로 분류하고, 어쩔때 어떤걸 써서 어떻게 해결했는지를
잘 기록해 놓는게 중요하다.
단순한 방법에서 시작한다.
현실의 문제는 아주 많은 제약들을 갖고 있다.
시간, 메모리 등등 말고도 많은 제약이 있다.
처음 문제를 해결할 때 이런 제약을 생각하지 않고,
제일 간단한 알고리즘으로 문제를 해결해본다.
먼저 제일 간단한 알고리즘으로 문제를 해결한 후,
하나하나 제약들에 맞춰 알고리즘을 발전시켜 나간다.
문제가 간단한 경우에도 복잡하게 해결하는 경우를 방지하기 위함도 있다.
문제를 단순화 한다.
위의 것과 비슷하게,
이번엔 문제를 단순화 시킨다.
시간의 제약을 없애본다던지, 공간의 제약을 없애본다던지,
다차원에서 생긴 문제를 1차원으로 생각해본다던지등등..
다양한 조건들을 없애고 단순화시켜서 문제를 해결해본다.
그 후, 조건들에 맞춰서 다시한번 문제를 해결해본다.
그림으로 그려본다.
코드로, 이슈로, 알고리즘 문제로 되어있는 여러 문제를
그림으로 그려본다.
좌표평면에 그려본다거나 등의 행위를 통해
문제를 좀 더 직관적으로 표시할 수 있다.
수식으로 표현한다.
문제를 수식으로 변형시켜서 풀어본다.
수식을 풀어내는 과정에서 문제 풀이의 아이디어를 얻는다.
문제를 분해한다.
너무 복잡한 문제는 한번에 해결할 수 없을 수 있다.
그럴 때엔 큰 문제를 하나하나 뜯어서,
작은 문제들로 분해해서 풀어본다.
여러 작은 문제는 쉽게 해결 할 수 있으니, 그걸 붙여
큰문제를 해결한다,
뒤에서부터 생각한다.
문제의 해결 순서를 뒤에서 부터 생각해본다.
예를 들어 사다리타기 게임을 생각해본다.
1번에 도달하기 위해서 어느 사다리를 선택해야하는지 알아보려면,
1, 2, 3, 4사다리를 다 선택해보는 방법도 있다.
하지만, 1번에서부터 거꾸로 올라간다면 바로 한번에 찾아 낼 수 있을것이다.
이렇게 뒤에서부터 생각을 해본다.
다양한 문제 해결전략
정말 다양한 문제 해결 전략이 있었다.
이 과정들을 거치면, 풀리지 않는 문제들도 하나하나 해결해 나갈 수 있을거다.
'Algorithm' 카테고리의 다른 글
자주 하는 실수들(2021.06.17) (0) | 2022.08.03 |
---|---|
코딩의 중요성(2021.06.16) (0) | 2022.08.03 |
C/C++을 사용하면서(2021.05.15) (0) | 2022.08.03 |
문제 해결 과정(2021.05.14) (0) | 2022.08.03 |
이제야 시작하는 알고리즘(2021.04.15) (0) | 2022.08.03 |