분류 전체보기
-
[JS 알고리즘&자료구조] 기준점과 이동 배열 패턴카테고리 없음 2023. 11. 15. 00:09
기준점과 이동 배열 패턴은 '슬라이딩 윈도우 패턴' 이라고도 부르며 배열이나 문자열과 같은 일련의 데이터를 입력하거나 특정 방식으로 큰 데이터셋에 하위 집합을 찾을 때 유용하다. 아래는 기준점과 이동 배열 패턴을 사용하여 해결할 수 있는 문제이다. /* maxSubarraySum이라는 함수가 있다. 이 함수는 배열과 숫자 하나를 매개 변수로 받으며 받은 숫자 만큼 연속된 숫자들의 가장 큰 합계를 찾는 함수이다. 아래는 함수의 반환값들의 예시이다. */ maxSubarraySum([1,2,5,2,8,1,5], 2) // 10 maxSubarraySum([1,2,5,2,8,1,5], 4) // 17 maxSubarraySum([4,2,1,6], 1) // 6 maxSubarraySum([4,2,1,6,2],..
-
[JS 알고리즘&자료구조] 다중 포인터 패턴 : 또 다른 문제 풀이JavaScript/Basic 2023. 11. 13. 23:54
두 번째 문제를 살펴보도록 하자. countUniqueValues라는 함수는 전달된 정렬된 배열에 있는 고유한 값의 개수를 반환한다. 어떠한 숫자도 존재하지 않는 배열이라면 0을 반환한다. 해당 문제에 대한 나의 풀이이다. function countUniqueValues(arr) { if(arr.length < 1) return 0; let i = 0; let j = 1; while(j < arr.length) { if (arr[i] !== arr[j]) { i++; arr[i] = arr[j]; } j++; } return i + 1; } 아래는 강의에서 소개하는 해결 방법이다. function countUniqueValues(arr) { if(arr.length < 1) return 0; let i ..
-
[JS 알고리즘&자료구조] 다중 포인터 패턴JavaScript/Basic 2023. 11. 13. 23:28
다중 포인터 패턴은 특정 위치에 해당하는 포인터 변수를 (보통 인덱스) 만든 다음 특정 조건에 따라 한 지점에서 다른 지점으로 이동시키는 방법이다. 이를 통해 배열이나 문자열과 같은 선형 구조 혹은 이중 연결 리스트나 단일 연결 리스트를 결과값으로 반환한다. 보통 한 쌍의 값이나 조건에 해당되는 특정 값을 찾을 때 사용한다. 앞에서 말했듯이 포인터 변수는 배열이나 문자열의 특정 위치를 가리킨다. 인덱스다. 두 개의 포인터가 서로를 향해 이동하던지 혹은 같은 지점에서 같은 방향으로 이동하며 조건에 충족하는지를 검증하는 것이 핵심이다. 아래는 오름차순으로 정렬된 배열을 반환하는 sumZero라는 함수를 만드는 문제이다. 반환 배열에 있는 숫자를 합하면 0이 되는 쌍이 되어야 한다. sumZero([-3,-2..
-
[JS 알고리즘&자료구조] 빈도수 세기 : 애너그램 도전 과제JavaScript/Basic 2023. 11. 7. 00:33
오늘은 빈도수 세기 패턴을 활용한 애너그램 도전 과제를 풀어볼 것이다. 두 개의 문자열이 주어졌을 때, 두 번째 문자열이 첫 번째 문자열의 애너그램인지 확인하는 함수를 작성하세요. 애너그램이란, 'cinema'가 'iceman'의 글자를 재배열해서 만들어진 것처럼, 다른 단어나 문구, 이름의 글자를 재배열해서 만들어진 단어나 문구, 이름을 말합니다. 저번 시간에 학습한 빈도수 세기 패턴을 활용한 나의 풀이이다. // TODO : 두번째 문자열이 첫번째 문자열의 애너그램인지 확인하는 함수 작성 const validAnagram = (str1, str2) => { // str1과 str2 길이가 서로 맞지 않으면 이미 조건이 성립하지 않기 때문에 false를 return if(str1.length !== s..
-
[JS 알고리즘&자료구조] 빈도수 세기 패턴JavaScript/Basic 2023. 11. 3. 00:05
오늘 배울 패턴을 강의에서는 빈도수 계수기(Frequency Counter)라고 명명하지만 사실 해당 패턴에 해당 공식 명칭이 있는 것은 아니다. 해당 패턴은 여러 데이터와 입력값이 서로 비슷한 값인지, 서로 간의 아나그램인지, 값이 다른 값에 포함되는 비교하거나 특정하게 발생하는 빈도와 비교할 때 유용하다. 해당 패턴은 시간 복잡도가 O(n²)인 상황에서 유용하게 쓰일 수 있다. 해당 패턴을 활용하는 예시를 아래 문제에서 살펴보자. 두 개의 배열 A와 B를 받는 same이라는 함수가 있다. 이 함수는 B에 있는 값들이 A에 있는 각 값들의 제곱에 해당되면 true를 반환하고 아닌 경우에는 false를 반환한다. 각 배열에 있는 값들의 수와 빈도는 같아야 한다. 아래는 해당 문제의 입력값과 출력값의 예시..
-
[JS 알고리즘&자료구조] 문제 해결 패턴 소개JavaScript/Basic 2023. 11. 2. 23:09
어려운 문제를 맞닥뜨리게 되면 어떻게 해야할까? 아무런 대처법을 알지 못하는 상황이라면 머리가 새하얘질 것이고 어찌 저찌 문제 해결을 위한 첫 삽을 뜬다고 하더라도 도중에 어그러지면 패닉에 빠지기 쉽다. 그렇기에 우리는 문제 해결을 위한 방법들을 잘 숙지하고 있어야 한다. 문제를 해결하기 위한 방법에는 2가지가 있다. 아래를 보자 문제를 해결하기 위한 세밀한 계획을 세운다 (앞선 섹터에서 진행함) 일반적인 문제 해결 패턴을 습득한다. 이번 섹터에서는 몇 가지 문제 해결 패턴들을 살펴볼 예정이다. 문제 해결 패턴은 문제 해결을 위한 일반적인 접근법이라고 보면 된다. 접근법이지 해결법이 아니기 때문에 모든 문제를 풀 수 있는 만능 열쇠 같은 것이 아니다. 그저 프로그래밍 매커니즘이나 청사진 정도로 생각하면 ..
-
[JS 알고리즘&자료구조] 되돌아보기와 리팩터JavaScript/Basic 2023. 11. 2. 00:57
앞의 모든 단계를 거쳐왔다면 문제에 대한 해결책이 나온 상황일 것이다. 그렇다면 이제 모든 게 끝났으니 우리는 편히 쉬면 된다. 게임을 하고 취미 생활을 즐기면 된다.... 라고 생각하면 좋겠지만 아직 진짜 끝난 것은 아니다. 😒 우리에게는 아직 리팩토링이라는 단계가 남아있다. '이미 코드는 멀쩡히 동작하고 원하는 결과값도 잘 뱉어내는 데 굳이..?' 라는 생각이 들 수 있다. 충분히 공감할 수 있는 생각이고 이미 다 끝났다고 생각된 마당에 귀찮게 느껴질 수 있지만 작성한 코드를 다시 한번 점검하고 더 효율적이고 이해하기 쉽게 바꾸는 것은 굉장히 중요하다. 대부분의 사람들이 리팩토링의 목적을 코드를 더욱 효율적으로 하는 것이라고만 생각하지만 가독성도 고려해야 한다는 사실도 인지해야 한다. 효율성과 가독성..
-
[JS 알고리즘&자료구조] 해결 또는 단순화JavaScript/Basic 2023. 11. 1. 00:04
앞의 세가지 과정을 거쳤고 문제에 대한 해결책이 완전히 나온 상황이라면 이제는 코드를 통해 문제를 해결하기만 하면 된다. 하지만 모든 문제들이 순탄하게 해결되는 것은 아니다. 어떤 문제들은 앞선 과정을 거쳐도 해결책이 제대로 나오지 않는 경우가 있을 수 있고 또 어떤 문제들은 해결책이 나왔다고 해도 코드로 구현할 때 애를 먹을 수도 있다. 이 경우에는 단순화를 하는 것이다. 문제를 해결할 수 있으면 해결하고 아닌 경우에는 해결책에 도달하기 위한 수많은 방법들 중 아주 단순하게 해결할 수 있는 방법들을 찾아 적용시켜보는 것이다. (하드 코딩 등) 결과를 도출해낼 수 있는 많은 방법들 중 효율적이지만 생각해내기엔 어려운 방법을 생각하기보다는 당장 결과물을 출력해낼 수 있는 단순한 방법을 떠올려보는 것이다. ..