반응형
목표
- 알고리즘이 무엇인지 이해합니다.
- 알고리즘을 해결할 계획을 세웁니다.
알고리즘이란?
알고리즘은 특정 작업을 달성하기 위한 과정이나 일련의 단계를 의미합니다. 이는 컴퓨터 과학에서 매우 중요한 개념으로, 문제 해결의 기본입니다.
알고리즘을 알아야 하는 이유
프로그래밍에서 수행하는 거의 모든 작업에는 기본적이든 복잡하든 일종의 알고리즘이 포함됩니다. 문제를 효율적으로 해결하기 위해서는 알고리즘을 이해하고 활용하는 능력이 필요합니다.
문제 해결을 위한 계획을 수립하기
1단계: 문제를 이해하기
문제를 이해하는 것은 첫 번째 단계입니다. 다음 질문들을 통해 문제를 명확히 할 수 있습니다.
- 문제를 내 방식대로 생각할 수 있는가?
- 문제가 어떤 입력값을 가지고 있는가?
- 문제에 대한 해결책에서 나와야 하는 결과가 무엇인가?
- 입력값이 출력값을 결정할 수 있는가? (문제를 해결할 수 있는 충분한 정보를 가지고 있는가?)
- 문제의 일부인 데이터의 중요한 부분에 어떻게 레이블을 지정해야 하는가?
예제: 두 숫자의 합계를 반환하는 함수 작성하기
- 덧셈을 수행하는 함수
- 입력이 정수인지, 실수인지, 큰 숫자인지 확인
- 결과가 정수인지, 실수인지, 큰 숫자인지 확인
- 한 숫자만 입력한 경우 처리 방법 결정 (예: null, undefined, +0)
- 입력값과 결과값을 명확히 정의
2단계: 구체적 예시를 찾아보기
예시를 통해 문제를 더 잘 이해할 수 있습니다. 예시는 온전성 검사를 제공하므로 최종 해결책이 제대로 작동하는지 확인할 수 있습니다.
- 간단한 예시로 시작하기
- 좀 더 복잡한 예시로 진행하기
- 빈 입력값이 있는 예제 살펴보기
- 유효하지 않은 입력값이 있는 예제 살펴보기
3단계: 세부 분석
문제를 해결하기 위한 단계를 명확하게 작성합니다. 기본적인 구성 요소들을 정의합니다.
예시: 문자열을 입력받아 각 문자 개수를 반환하는 함수
function charCount(str) {
// 반환할 객체 생성
// 문자열을 순회하며, 각 문자에 대해...
// 만약 문자가 숫자/문자이고 객체에 키가 있다면, 카운트를 하나 증가
// 만약 문자가 숫자/문자이고 객체에 없으면, 객체에 추가하고 값을 1로 설정
// 만약 문자가 다른 것(공백, 마침표 등)이면 아무 것도 하지 않음
// 마지막에 객체 반환
}
4단계: 해결 또는 단순화
문제의 핵심 어려움을 찾으면 일시적으로 이를 무시하고, 단순화된 해결책을 작성한 후 어려움을 다시 통합합니다.
예시:
function charCount(str) {
// 반환할 객체 생성
const result = {};
// 문자열을 순회하며, 각 문자에 대해...
for(let i = 0; i < str.length; i++) {
const char = str[i].toLowerCase()
// 만약 문자가 숫자/문자이고 객체에 키가 있다면, 카운트를 하나 증가
if(result[char] > 0) {
result[char]++;
}else{
// 만약 문자가 숫자/문자이고 객체에 없으면, 객체에 추가하고 값을 1로 설정
result[char] = 1;
}
}
// 만약 문자가 다른 것(공백, 마침표 등)이면 아무 것도 하지 않음 (일단은 무시)
// 마지막에 객체 반환
return result;
}
5단계: 되돌아 보기와 리팩터링
리팩터링 질문:
- 결과를 확인할 수 있는가?
- 결과를 다른 방법으로 도출할 수 있는가?
- 한눈에 이해할 수 있는가?
- 다른 문제에 이 결과나 방법을 사용할 수 있는가?
- 해결책의 성능을 향상시킬 수 있는가?
- 다른 리팩터링 방법을 생각해볼 수 있는가?
- 다른 사람들은 이 문제를 어떻게 해결했는가?
function charCount(str) {
const result = {};
for(let i = 0; i < str.length; i++) {
const char = str[i].toLowerCase();
if(/[a-z0-9]/.test(char)) {
if(result[char] > 0) {
result[char]++;
}else{
result[char] = 1;
}
}
}
return result;
}
리팩터링 후
function charCount(str) {
const result = {};
for(let char of str) {
char = char.toLowerCase();
if(/[a-z0-9]/.test(char)) {
result[char] = ++result[char] || 1;
}
}
return result;
}
더 리팩토링을 하면 charAt()을 사용하면 더 빠르다.
반응형
'Algorithm > Theory' 카테고리의 다른 글
재귀 (Recursion) (0) | 2024.07.08 |
---|---|
문제 해결 패턴 연습 문제 (0) | 2024.07.01 |
문제 해결 패턴 (0) | 2024.06.28 |
Javascript에서 배열과 오브젝트의 빅오 (Big - O) (0) | 2024.06.26 |
빅오 표기법 (Big-O Notation) (0) | 2024.06.26 |