문제 해결법 소개
알고리즘이란? 특정 업무를 달성 하기 위한 일의 단계들. 이번 강의에서는 interview에 나올 만한 내용을 다룰 것이다.
어떻게 잘 할 수 있을까? 선천적으로 잘하던가. 아니면 발전 시키면 된다. 일반적으로 아래 방법을 이용해서 처음 보는 문제를 풀 수 있다.
- 문제를 어떻게 해결할지 계획을 세운다.
- 일반적인 문제 해결법 (DP,그리디, dfs,bfs 등등)들을 마스터한다.
문제 해결 궁리 단계 면접시에 새로운 문제를 받았을 때?
1. 문제 이해
시간 제한이 있는 경우 바로 문제를 해결 하고 싶을 수 있지만. 문제를 정확히 이해하고 문제를 해결하는 것이 중요하다. 아래의 질문들을 던짐으로써 문제를 파악할 수 있다.
- 나의만의 언어로 문제를 설명할 수 있는가?.
- 입력이 무엇인지
- 출력이 어떻게 되어야 하는지(타입, 형태, 제한사항 등등).
- 입력에 의해 출력이 결정되는지
- 내가 문제를 풀기 위한 데이터를 충분히 입력받을 수 있는지
- 문제 해결에 있어서 중요한 데이터를 어떻게 이름 붙여야 하는가?
아래문제에 적용해보자.
“두개의 숫자를 받아 두 숫자를 더한 값을 반환하는 함수를 작성하시오”
2. 구체적인 입력의 예시들을 확인한다.
구체적인 예시들을 생각해보는 것은 문제를 더 잘 이해하게 해준다. 또한 예시들이 내가 작성한 문제를 검증하는데에도 사용된다.
- 유저 스토리 (언제 input이 어떻게 들어올지 생각)
- 유닛 테스트
- 가장 간단한 예시로 문제를 설명해본다.
- 어려운 예시로 문제를 설명해본다.
- 또한 그 후에는 빈 값등 엣지 케이스 들을 확인한다.
- 유효하지 않은 입력이 왔을 때도 생각해야한다.
아래 문제에 적용해보자.
string값을 받아 각 문자의 개수를 세서 출력하는 함수를 작성하라.
3. 각각 세부적인 단계들로 분리한다
단계 별로 수행할 일들을 적어둔다. 이렇게 함으로써 바로 더오르는 데로 코드를 작성하는 것을 막고 계속해서 확인하며 문제를 해결할 수 있다. 또한 문제를 해결하기 위해 구체적이지 않은 부분들도 드러나게 된다.
- 이전 단계들을 다 하고
- 함수의 이름과 출력을 정한 뒤
- 함수의 내용물을 코드가 아닌 언어로 상세하게 단계별로 정리한다.
- 가장 간단한 언어로 큰 단계를 정리하고
- 그 뒤에 상세한 단계를 정리한다.
4. 단순화 하고 해결한다.
문제를 풀고, 문제를 풀 수 없다면 간단한 문제를 먼저 풀고 이후에 어려운 부분들을 해결한다.
- 어려운 부분의 핵심을 찾는다.
- 어려운 부분을 무시한다.
- 쉬운 답을 먼저 적는다
- 어려운 부분을 쉬운 부분과 통합해서 해결한다.
5. 재검토 후 리펙터링을 진행한다.
각각의 코드를 보며 읽기 어려운 부분이나 마음에 들지 않는 부분을 찾아낸다. 그리고 아래의 질문들을 던져본다.
- 결과를 확인 할 수 있는가?
- 다른 방법으로 결과를 만들어낼 수 있는가?
- 한눈에 코드를 이해할 수 있는가?
- 다른 문제 해결에 동일하게 사용할 수 있는가?
- 성능을 더 개선 할 수 있는가?
- 다른 구현 방법이 있을까?
- 다른 사람들은 이 문제를 어떻게 해결했을까?