문제 해결 접근법 필기

February 06, 2022

문제 해결법 소개

알고리즘이란? 특정 업무를 달성 하기 위한 일의 단계들. 이번 강의에서는 interview에 나올 만한 내용을 다룰 것이다.

어떻게 잘 할 수 있을까? 선천적으로 잘하던가. 아니면 발전 시키면 된다. 일반적으로 아래 방법을 이용해서 처음 보는 문제를 풀 수 있다.

  1. 문제를 어떻게 해결할지 계획을 세운다.
  2. 일반적인 문제 해결법 (DP,그리디, dfs,bfs 등등)들을 마스터한다.

문제 해결 궁리 단계 면접시에 새로운 문제를 받았을 때?

1. 문제 이해

시간 제한이 있는 경우 바로 문제를 해결 하고 싶을 수 있지만. 문제를 정확히 이해하고 문제를 해결하는 것이 중요하다. 아래의 질문들을 던짐으로써 문제를 파악할 수 있다.

  • 나의만의 언어로 문제를 설명할 수 있는가?.
  • 입력이 무엇인지
  • 출력이 어떻게 되어야 하는지(타입, 형태, 제한사항 등등).
  • 입력에 의해 출력이 결정되는지
  • 내가 문제를 풀기 위한 데이터를 충분히 입력받을 수 있는지
  • 문제 해결에 있어서 중요한 데이터를 어떻게 이름 붙여야 하는가?

아래문제에 적용해보자.

“두개의 숫자를 받아 두 숫자를 더한 값을 반환하는 함수를 작성하시오”

2. 구체적인 입력의 예시들을 확인한다.

구체적인 예시들을 생각해보는 것은 문제를 더 잘 이해하게 해준다. 또한 예시들이 내가 작성한 문제를 검증하는데에도 사용된다.

  • 유저 스토리 (언제 input이 어떻게 들어올지 생각)
  • 유닛 테스트
  • 가장 간단한 예시로 문제를 설명해본다.
  • 어려운 예시로 문제를 설명해본다.
  • 또한 그 후에는 빈 값등 엣지 케이스 들을 확인한다.
  • 유효하지 않은 입력이 왔을 때도 생각해야한다.

아래 문제에 적용해보자.

string값을 받아 각 문자의 개수를 세서 출력하는 함수를 작성하라.

3. 각각 세부적인 단계들로 분리한다

단계 별로 수행할 일들을 적어둔다. 이렇게 함으로써 바로 더오르는 데로 코드를 작성하는 것을 막고 계속해서 확인하며 문제를 해결할 수 있다. 또한 문제를 해결하기 위해 구체적이지 않은 부분들도 드러나게 된다.

  1. 이전 단계들을 다 하고
  2. 함수의 이름과 출력을 정한 뒤
  3. 함수의 내용물을 코드가 아닌 언어로 상세하게 단계별로 정리한다.
  4. 가장 간단한 언어로 큰 단계를 정리하고
  5. 그 뒤에 상세한 단계를 정리한다.

4. 단순화 하고 해결한다.

문제를 풀고, 문제를 풀 수 없다면 간단한 문제를 먼저 풀고 이후에 어려운 부분들을 해결한다.

  • 어려운 부분의 핵심을 찾는다.
  • 어려운 부분을 무시한다.
  • 쉬운 답을 먼저 적는다
  • 어려운 부분을 쉬운 부분과 통합해서 해결한다.

5. 재검토 후 리펙터링을 진행한다.

각각의 코드를 보며 읽기 어려운 부분이나 마음에 들지 않는 부분을 찾아낸다. 그리고 아래의 질문들을 던져본다.

  • 결과를 확인 할 수 있는가?
  • 다른 방법으로 결과를 만들어낼 수 있는가?
  • 한눈에 코드를 이해할 수 있는가?
  • 다른 문제 해결에 동일하게 사용할 수 있는가?
  • 성능을 더 개선 할 수 있는가?
  • 다른 구현 방법이 있을까?
  • 다른 사람들은 이 문제를 어떻게 해결했을까?

Written by Juyeong Byeong . github