문제 해결 개관¶
효율적인 문제 해결을 위한 체계적인 접근법과 전략을 정리했습니다.
1. 여섯 단계 문제 해결 알고리즘¶
문제 풀이의 각 단계를 명확히 인지하고 실천하는 것이 중요합니다.
1단계: 문제를 읽고 이해하기¶
조급해하지 말고 문제를 완전히 이해하는 데 충분한 시간을 들이세요. 문제를 잘못 이해하고 시작하면 나중에 코드를 전부 버려야 하는 상황이 생길 수 있습니다.
2단계: 재정의와 추상화¶
자신의 언어로 문제를 다시 정의하세요. 복잡한 문제를 다루기 쉬운 수학적/전산학적 개념으로 추상화하는 과정이 필요합니다. 어떤 방식으로 추상화하느냐에 따라 난이도가 결정됩니다.
3단계: 계획 세우기¶
사용할 알고리즘과 자료구조를 선택합니다. 문제 해결에서 가장 핵심적인 단계입니다.
4단계: 계획 검증하기¶
설계한 알고리즘이 모든 경우(Corner cases 포함)에 정확히 동작하는지, 시간과 메모리 제한을 충족하는지 확인합니다.
5단계: 계획 수행하기¶
결정된 계획을 바탕으로 실제 코드를 작성합니다.
6단계: 회고하기¶
해결 과정을 돌이켜보며 개선점을 찾습니다. - 더 효율적인 알고리즘이나 간결한 코드가 있는가? - 오답 원인이 무엇이었는가? - 다른 사람의 코드는 어떻게 작성되었는가? - 기록의 중요성: 경험을 기록으로 남기면 비슷한 문제에서 통찰을 얻기 쉽습니다.
💡 문제를 풀지 못할 때: 일정 시간 고민해도 답이 나오지 않는다면 풀이를 참고하되, 반드시 왜 떠올리지 못했는지 복기해야 합니다.
2. 문제 해결 전략¶
직관 (Intuition)¶
직관은 문제의 전체적인 얼개를 그릴 수 있게 해줍니다. 풍부한 경험을 통해 발달시킬 수 있습니다.
체계적인 접근을 위한 질문들¶
직관적으로 풀이가 떠오르지 않을 때 스스로에게 던져볼 질문들입니다.
- 비슷한 문제를 풀어본 적이 있는가?
- 단순한 방법(Brute-force)에서 시작할 수 있는가?
- 점진적으로 개선하며 효율적인 해법을 찾아가는 출발점이 됩니다.
- 문제를 변형해볼 수 있는가?
- 단순화: 제약 조건을 없애거나 변수 수를 줄여보기
- 분해: 복잡한 조건을 단순한 조건의 집합으로 나누기
- 뒤에서부터 생각하기: 결과에서 역순으로 추적하기 (예: 사다리 타기)
- 순서 강제하기: 순서가 상관없는 문제에 순서를 부여하여 중복 계산 방지
- 정규화: 형태는 다르지만 결과가 같은 것들을 그룹화하여 대표값만 고려하기
직관을 얻기 위한 도구¶
- 직접 손으로 풀어보기: 알고리즘의 흐름을 파악하고 예외 상황을 미리 확인할 수 있습니다.
- 그림 그려보기: 시각화를 통해 문제의 핵심을 파악할 수 있습니다.
- 수식화하기: 평문으로 된 문제를 수식으로 표현하여 명확하게 이해합니다.