4. Problem Solving Approach

a.very·2021년 4월 22일
0
post-thumbnail

알고리즘 실력 향상하는 법

  1. Devise a plan for sloving problems (이번 챕터)
  2. Master common problem solving patterns

Problem Solving

  1. 문제 이해하기
  2. Concrete 한 Examples 탐험하기
  3. 문제를 쪼개기
  4. 문제풀기 / 간단하게 만들기
  5. 다시보고 Refactor 하기

1. Understand the problem

문제 해결코드를 작성하거나, 종이에 적기전에 문제를 스스로 확실히 이해해라.
1. 나만의 언어로 문제를 재정의 할 수 있는가?
2. problem에 어떤 inputs들이 들어가는가?
3. 문제 해결시 나와야하는 output은 무엇긴가?
4. output 들이 input로 결정될 수 있는가? 혹은, 문제를 풀기위한 충분한 정보가 있는가?
5. 문제의 일부인 중요한 데이터에는 어떻게 레이블을 붙여야 하는가?
등을 점검하라

2. Explore Concrete Examples

  • 문제를 더 잘 이해할 수 있는 예시를 떠올리자

  • 또한, 최종 답이 온전히 작동하는지에 대한 체크도 해야한다.

  • User Stories

  • Unit Tests

  1. 간단한 예제 2-3개로 시작하기 (input과 output 보기)
  2. 더욱 복잡한 예시로 확장하기
  3. Empty Input 예시로 확인하기
  4. Invalid Input 예시로 확인하기

3. Break it Down

수행해야 할 단계를 명시적으로 작성한다.
이렇게 하면 코드를 작성하기 전에 코드를 생각해 볼 수 있고, 입력하기 전에 남아 있는 개념적인 문제나 오해를 발견힐 수 있으며 세부 사항(예: 언어 구문)도 걱정하고 확인가능하다.

function charCount(str) {
  // 리턴할 object 만들기
  
  // stirng loop 돌기, 각 문자에 대해
    //if char is (is a number/leter AND) a key in object, add one to count
    // 이미 (숫자나 영어고) 키로 존재하면 count만 더하기

    // if char is (is a number/leter AND) not in object, add it and set value to object
    // (숫자나 영어고) 키로 존재하지 않으면 key추가후 카운트 더하기


    // if char is something else (space, period, etc ) , dont do anything
    // 만약 그외의 것이면 아무것도 하지말기


  // object return 하기

}

4. Solve / Simplify

  • 문제를 풀고 , 못풀겠으면 Simplify 하기

막히면 일단 시작하고 간단하게 하기!

Simplify

  • 시도하려는 것 중 가장 막히는 어려움을 찾기
  • 그 어려움을 일단 무시하기
  • 간단한 솔루션을 찾기
  • 그리고 어려운거 다시 넣어서 해결해보기
function charCount(str) {
  // 리턴할 object 만들기
  var result = {};

  // stirng loop 돌기, 각 문자에 대해
  for (var i = 0; i < str.length; i++) {
    var char = str[i].toLowerCase();
    if (result[char] > 0) {
      result[char]++;
    } else {
      result[char] = 1;
    }
  }

  return result;
}

5. LOOK BACK & REFACTOR

  • 돌아보고 리팩토링하기

문제를 풀어도 끝난게 아니다.
완벽히 이쁜 알고리즘 아니여도, improve 하는 것이 중요하다. 다시 보고 리팩토링 하는것이 좋다.

  • 결과를 체크할 수 있는가?
  • 다른 방법으로 결과를 도출할 수 있나?
  • 한번에 이해할 수 있는가?
  • 결과나, method를 다른 문제에도 이용할 수 있는가? // 비슷한 문제 해결 하는 역량기르기
  • solution의 performance를 향상시킬수 잇는가?
  • 다른 방식의 refacotroing 을 생각할 수 있는가?
  • 다른 사람들은 어떻게 풀었는가?

Tips)
쉬운, 익숙한 문법으로 작성하고 나중에 간단하게 줄이기

  • regexp 사용은 비 효율적이라 charCodeAt()으로 찾아서 해결해보기 (charCode)
  • 근데 charCode같은건 구글링 못하면 모르니깐 상황에 따라 편하게 regex를 사용할수도있음. 유연하게
function charCount_refactor(str) {
  // 리턴할 object 만들기
  var result = {};

  // stirng loop 돌기, 각 문자에 대해
  for(var char of str) {
    // if(/[a-z0-9]/.test(char)){
    if(isAlphaNumveric(char)){
      char = char.toLowerCase();
      result[char] = ++result[char] || 1
    }
  }
  return result;
}

// 숫자 알파벳 점검코드 만들기!
function isAlphaNumeric(str) {
    var code = str.charCodeAt(0);
    if (!(code > 47 && code < 58) && // numeric (0-9)
        !(code > 64 && code < 91) && // upper alpha (A-Z)
        !(code > 96 && code < 123)) { // lower alpha (a-z)
      return false;
    }
  return true;
};
profile
🚚chanhee-jeong.tistory.com 🚀 github.com/chaneeii/iOS-Study-Log

0개의 댓글