본문 바로가기

Study/Algorithm & Data structure

problem solving patterns

intro

문제를 해결하는 방법은 아래의 5 가지로 나누어 볼 수 있다. => 참고 도서) "how to slove it" by Georhe Polya

 

  1. 문제 이해하기(understad the problem)
  2. 구체적인 예제 살펴보기(explore concrete example)
  3. 세부적으로 분석하기(analyze)
  4. 문제 해결하기/단순화하기(solve/simplify)
  5. 재검토하기(look back and refactor)

understand the problem

문제를 확실히 이해한 후에, 코드를 작성하는 것이 중요하다. 

 

  1. 문제를 나만의 언어로 다시 정의할 수 있는가? 
  2. input은 어떤 형태여야 하는가?
  3. 어떤 output을 반환해야 하는가? 
  4. input을 이용해서 output을 결정할 수 있는가? 즉, output을 반환하기 위한 충분한 정보를 가지고 있는가? 
  5. 문제에서 주어진 중요한 데이터를 무엇으로 라벨링할 것인가? 즉, 무엇이 중요한 정보인가?

concrete examples

  1. 간단한 input 부터 실제 값으로 넣어보고, 보다 복잡한 input을 넣어보는 방식으로 확인한다. 
  2. empty input을 예제로 확인해 본다. 
  3. invalid input을 예제로 확인해 본다.

analyze

코드를 짜기 전에, 어떤 작업을 할 것인지를 단계별로 이야기/작성한다. 주석이나 pseudo code가 될 수 있다. 예를 들어 charCount은 문자열을 input으로 받고, 그 input이 갖고 있는 숫자와 문자열의 개수를 객체로 반환하는 함수이다. => "hello!"는 {h: 1, e: 1, l: 2, o: 1}을 반환해야 한다. 

 

function charCount(string) {
  // 1. convert string to no-spaces & lower-case

  // 2. do something

  // 3. return object
}

solve/simplify

문제에서 가장 어려운 부분을 찾아내고, 그 부분을 무시한 상태로 해결법을 작성한다. 

function charCount(string) {
  // 1. convert string to no-spaces, special characters & lower-case
  // 이 부분이 가장 어렵다면, 우선 이 과정을 패스하고 다음으로 넘어간다. 
  let result = {}

  // 2. do something
  for (let i = 0; i < processedString.length; i++) {
    const character = processedString[i]
     if (result[character]) {
       result[character] += 1
     } else {
       result[character] = 1
    }
  }

  // 3. return object
  return result
}

 

그런 다음 모르는 부분에 대한 힌트를 얻거나, 구글링을 통해 답을 얻을 수 있다. 

 

 // 1. convert string
  const isSpecialCharacters = /[^a-zA-Z0-9]/g
  const processedString = string //
    .replace(isSpecialCharacters, '')
    .replace(' ', '')
    .toLowerCase()

 

look back & refactor

  1. 결과를 다른 방법으로 도출해 낼 수 있는지
  2. 한 번에 코드를 이해할 수 있는지
  3. 다른 문제를 해결할 때에도 해당 방법을 사용할 수 있는지
  4. 해결책의 성능을 향상시킬 수 있는지
    • 아래 예제에서는 정규표현식 대신 charCodeAt을 이용해서, checkAlphaNumeric 함수를 만들어서 숫자인지 영문인지 확인할 수도 있다. 
  5. 다른 사람들은 어떻게 이 문제를 해결했는지 

 

function charCount(string) {
 // 1. convert string 
  const isSpecialCharacters = /[^a-zA-Z0-9]/g
  const processedString = string //
    .replace(isSpecialCharacters, '')
    .replace(' ', '')
    .toLowerCase()
  let result = {}

  // 2. do something
  for (let character of processedString) {
    result[character] = result[character]++ || 1
  }

  // 3. return object
  return result
}

 

'Study > Algorithm & Data structure' 카테고리의 다른 글

sort algorithm(1)  (0) 2022.10.17
recursion  (0) 2022.10.11
problem solving patterns(2)  (1) 2022.10.08
performance of array & object  (0) 2022.10.03
BigO Notation  (0) 2022.10.03