분류 전체보기 90

문제 해결 패턴 - Sliding Window

Sliding Window(슬라이딩 윈도우) 배열이나 문자열과 같은 일련의 데이터를 입력하거나 특정 방식으로 연속적인 해당 데이터의 하위 집합을 찾는 경우에 유용하다. 전자는 중첩된 루프문으로 배열에 숫자가 백만개 있을 경우 1,000,000 * 1,000,000 번 반복해야 하는 문제가 있다. 후자의 경우 루프를 배열에 한 번만 적용하여 O(n)으로 해결할 수 있다. 이것이 슬라이딩 윈도우 function maxSubarraySum(arr, num) { if (arr.length < num) return null; let tempMaxNum = 0; let maxNum = 0; for (let idx = 0; idx < num; idx++) { tempMaxNum += arr[idx]; } // tem..

Algorithm 2022.07.18

문제 해결 패턴 - Multiple Pointers

Multiple Pointers도 실제로 다중 포인터라고 불리지 않음. (공식 이름도 없음) 이 패턴은 인덱스나 위치에 해당하는 포인터나 값을 만든 다음 특정 조건에 따라 중간지점에서부터 시작 지점이나 끝 지점이나 양쪽 지점을 향해 이동시키는 것이다. 문제 1. 합계가 0인 첫번째 쌍을 찾는 함수를 구현하자. (문제 1은 양쪽 지점에서 시작하여 반대편 지점으로 이동하면서 해결하는 방법을 사용하였다.) // My Solution validAnagram("", ""); // true validAnagram("aaz", "zza"); // false validAnagram("anagram", "nagaram"); // true validAnagram("rat", "car"); // false) // false..

Algorithm 2022.07.17

문제 해결 패턴 - Frequency Counters

Frequency Counters 는 실제로 빈도 카운터라고 불리지 않음. (공식 이름도 없음) 이 패턴은 보통 js의 객체를 사용해서 다양한 값과 빈도를 수집한다. Tip : 가능한 중첩된 루프는 사용하지 않는 것이 좋다. 두 개의 루프가 두 개의 중첩된 개별 루프보다 훨씬 낫다. (n^2 < n) Frequency Counters는 보통 객체를 사용한다. 배열이나 문자열의 내용을 분석하여 비교할때는 두 개의 배열을 객체로 세분화하여 각 배열의 요소들을 분류한 다음 각 배열을 비교하는 것이 좋다. 둘 다 같은 결과를 내지만 시간복잡도 측면에서 봤을때는 후자가 훨씬 성능이 좋다. 전자는 for문 안에서 indexOf을 사용하여 O(n^2) 이 되지만, 후자는 for문을 3번 반복하여 3n. 즉 O(n) ..

Algorithm 2022.07.17

문제 해결 패턴 종류

개선하는 법 (문제를 해결하는 법) 1. Devise a plan for solving problems. (문제 해결을 위한 계획 수립) 2. Master common problem solving patterns. (일반적인 문제 해결 패턴 마스터) 문제 해결 패턴 종류 - Frequency Counter - Multiple Pointers - Sliding Window - Divide and Conquer - Dynamic Programming - Greedy Algorithms - Backtracking - ... 본 내용은 작성자가 (Udemy) JavaScript 알고리즘 & 자료구조 마스터클래스 강의를 듣고 정리 및 메모한 내용입니다. 오역 및 오개념이 있을 수 있으니 바로잡기 위해 문제가 있는..

Algorithm 2022.07.17

문제 해결 5단계 - 복습하고 재구성하기

재구성(Refactoring) 할때 생각할 수 있는 질문 - 결과를 확인할 수 있는가? - 결과를 다른 방식으로 도출할 수 있는가? - 한눈에 보고 이해할 수 있는가? - 결과나 방법을 다른 문제해도 적용할 수 있는가? - 해결책의 성능을 향상시킬 수 있는가? - 재구성할 수 있는 다른 방법을 생각할 수 있는가? - 다른 사람들은 이 문제를 어떻게 해결하는지? 결과나 방법을 다른 문제해도 적용할 수 있는가? 문제를 해결함으로써 얻을 수 있는 큰 이점 중 하나는 직감을 발달시켜 다른 문제를 해결할 수 있는 직관력을 길러준다는 것이다. 따라서 해결책을 작성할 때마다 잠시 멈추고 이 해결책이나 이 문제가 이전에 접했던 다른 문제와의 유사점이 있는지 자문해 보는 것이 좋다. 해결책의 성능을 향상시킬 수 있는가?..

Algorithm 2022.07.17

문제 해결 2단계 ~

단위 검사는 더 작은 기능에 대해 무엇인가가 어떻게 작동해야 하는지 그 틀을 잡는 데 사용된다. 문제 해결 2단계 - 구체적 예시 보기 1단계 - 간단한 예시로 시작하기 (Start with Simple Examples) 2단계 - 더 복잡한 예시들로 진행하기 (Progress to More Complex Examples) 3단계 - 빈 값을 입력하면 어떻게 될지 생각해보기 (Explore Examples with Empty Inputs) 4단계 - 유효하지 않은 값을 입력하면 어떻게 될지 생각해보기 (Explore Examples with Invalid Inputs) 문제 해결 3단계 - 문제를 세분화하기 밟아야 할 단계들을 명확하게 작성해보자 (해결책의 기본적인 구성 요소만이라도) -> 코드를 실제로..

Algorithm 2022.07.11

문제 해결법 + 문제 해결 1단계

알고리즘의 핵심은 어떤 작업을 달성하기 위한 일련의 단계이다. 알고리즘 문제 향상 방법 1. 문제 해결을 위한 계획을 수립 -> 이는 기술적인 문제면서도 아니기도 하지만 문제에 접근하는 방법으로, 문제를 세분화하기 위한 전략에 더 가깝다. (방향을 잡기 위한 몇가지 단계) 2. 일반적인 문제 해결 패턴을 파악 -> 많은 알고리즘과 면접에서의 문제들을 여러 범주로 나눌 수 있는데 일부 범주를 식별할 수 있는 경우에는 코드에 수행할 수 있는 몇가지 단계를 통해 얻을 수 있는 알고리즘이나 과제를 해결하는데 도움이 될 몇가지 조합법을 파악하고 공부하는 것을 뜻한다. 문제 해결 순서? 1단계 - 문제를 이해하는 것 2단계 - 구체적인 예시를 경험해보는 것 3단계 - 문제를 세분화 하는 것 4단계 - 문제를 해결하..

Algorithm 2022.07.11

배열(Arrays)과 객체(Objects)의 성능 평가

Objects const instructor = { firstName = "Kelly", isInstructor = true, favoriteNumbers = [1,2,3,4]; } Objects 의 Big O Insertion(삽입) - O(1) Removal(삭제) - O(1) Searching(탐색) - O(n) Access(접근) - O(1) 객체는 정렬되어 있을 필요가 없을때 잘 작동하며, 빠른 접근, 입력과 제거를 원할 때 좋다. 여기서 말하는 탐색은 key를 말하는 것이 아니라, 어떤 특정한 정보가 어떤 값에 있는지 확인하는 것을 뜻한다. (firstName을 찾는 것이 아니라는 뜻이다.) 이때 모든 아이템에 모든 속성을 확인해야 한다.(풀스캔) Object Methods 의 Big O Ob..

Algorithm 2022.07.09

Big O 표기법

Big O 표기법이란? 알고리즘의 효율성을 표기해주는 표기법을 뜻한다. 보통 알고리즘의 시간 복잡도와 공간 복잡도를 나타내는데 주로 사용되며, 시간 복잡도는 알고리즘의 시간 효율성을 의미하고, 공간 복잡도는 알고리즘의 공간(메모리) 효율성을 의미한다. (여기서 말하는 알고리즘의 효율성은 데이터 개수(n)가 주어졌을 떄 덧셈, 뺄셈, 곱센 같은 기본 연산의 횟수를 뜻한다.) Time Complexity function addUpTo(n) { return n * (n + 1) / 2; } 이 경우 빅오표기법으로 나타냈을때 알고리즘의 효율성은 O(1) 이다. function addUpTo(n) { let total = 0; for (let i = 1; i 상수는 중요하지 않다. (Constnats Don't ..

Algorithm 2022.07.09