본문 바로가기

Web Development/algorithm

[algorithm] 알고리즘을 잘 세우기 위한 전략

1. 문제를 이해하기

 

문제 예시: 0부터 주어진 숫자까지의 합을 구하는 함수를 구현하라.

문제를 나만의 언어로 이해: 문제를 간단히 요약하고 필요 시 다시 설명합니다.

입력값을 파악: 정수인지, 부동소수점인지, 입력 크기 제한이 있는지, 입력이 없거나 여러 개일 경우를 고려합니다.

출력값을 파악: 정수, 소수 등 출력 형태를 결정하고, 부적절한 입력 시 어떻게 처리할지 정합니다.

충분한 정보 여부: 필요한 정보가 모두 주어졌는지 확인하고, 예외 상황을 고려합니다.

라벨링 계획: 변수와 함수 이름을 어떻게 명명할지 계획합니다 (예: add, sum 등).

 

2. 입력값과 출력값의 예시 찾기

 

예시 찾기 목적: 문제를 더 잘 이해하고 함수가 제대로 작동하는지 검증합니다.

예시 단계:

1. 간단한 예시: func("aaaaa") ⇒ {a: 5}

2. 복잡한 예시: func("aaaaa bbbbb 111111") ⇒ {a: 5, b: 5, 1: 6}

3. 입력이 없을 때: func("") ⇒ false 또는 undefined

4. 유효하지 않은 입력: func(0) ⇒ false 또는 undefined

 

3. 문제를 세분화하기

 

주석을 통해 문제를 단계별로 나누기: 함수 작성 전 주석을 이용해 문제를 세분화합니다.

// 반환할 객체를 생성한다.
// 문자열을 루프한다.
// 숫자나 문자가 객체에 이미 존재하면 1을 더한다.
// 객체에 없으면 키를 추가하고 값을 1로 설정한다.
// 숫자나 문자가 아니면 건너뛴다.
// 객체를 반환한다.

 

 

4. 문제 해결 및 단순화

function charCount(str) {
  let obj = {};
  for (let i = 0; i < str.length; i++) {
    let char = str[i].toLowerCase();
    if (/[a-z0-9]/.test(char)) {
      obj[char] = ++obj[char] || 1;
    }
  }
  return obj;
}

단순한 문제부터 해결: 간단한 부분을 먼저 작성하고, 복잡한 부분은 나중에 작성하여 통합합니다.

 

5. 코드 검토 및 리팩토링

 

예시 리팩토링:

function charCount(str) {
  let obj = {};
  for (let char of str) {
    if (isAlphaNumeric(char)) {
      char = char.toLowerCase();
      obj[char] = ++obj[char] || 1;
    }
  }
  return obj;
}

function isAlphaNumeric(char) {
  let code = char.charCodeAt(0);
  return (
    (code > 47 && code < 58) || // 0-9
    (code > 64 && code < 91) || // A-Z
    (code > 96 && code < 123)   // a-z
  );
}

 

검토 항목:

1. 결과가 올바른가?

2. 다른 방법으로 해결할 수 있는가?

3. 코드 가독성은 좋은가?

4. 다른 문제에 재사용 가능한가?

5. 성능 향상이 가능한가?

6. 다른 사람의 해결 방법과 비교