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. 다른 사람의 해결 방법과 비교
'Web Development > algorithm' 카테고리의 다른 글
[algorithm] Multiple Pointers Pattern (다중 포인터 패턴) (0) | 2024.11.03 |
---|---|
[algorithm] Frequency Counter 패턴 (빈도수 카운터 패턴) (1) | 2024.11.03 |
[algorithm] Big O 표기법 (2) | 2024.11.03 |
[algorithm] 하노이탑 문제 (0) | 2024.05.23 |
[algorithm] 재귀와 재귀함수에 대한 이해 (1) | 2024.05.22 |