intro
문제를 해결하는 방법은 아래의 5 가지로 나누어 볼 수 있다. => 참고 도서) "how to slove it" by Georhe Polya
- 문제 이해하기(understad the problem)
- 구체적인 예제 살펴보기(explore concrete example)
- 세부적으로 분석하기(analyze)
- 문제 해결하기/단순화하기(solve/simplify)
- 재검토하기(look back and refactor)
understand the problem
문제를 확실히 이해한 후에, 코드를 작성하는 것이 중요하다.
- 문제를 나만의 언어로 다시 정의할 수 있는가?
- input은 어떤 형태여야 하는가?
- 어떤 output을 반환해야 하는가?
- input을 이용해서 output을 결정할 수 있는가? 즉, output을 반환하기 위한 충분한 정보를 가지고 있는가?
- 문제에서 주어진 중요한 데이터를 무엇으로 라벨링할 것인가? 즉, 무엇이 중요한 정보인가?
concrete examples
- 간단한 input 부터 실제 값으로 넣어보고, 보다 복잡한 input을 넣어보는 방식으로 확인한다.
- empty input을 예제로 확인해 본다.
- 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
- 결과를 다른 방법으로 도출해 낼 수 있는지
- 한 번에 코드를 이해할 수 있는지
- 다른 문제를 해결할 때에도 해당 방법을 사용할 수 있는지
- 해결책의 성능을 향상시킬 수 있는지
- 아래 예제에서는 정규표현식 대신 charCodeAt을 이용해서, checkAlphaNumeric 함수를 만들어서 숫자인지 영문인지 확인할 수도 있다.
- 다른 사람들은 어떻게 이 문제를 해결했는지
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 |