본문 바로가기

Algorithm272

[ 자바스크립트(JavaScript) ] section05 - 5 - 최대 매출 📍 section05 - 5 - 최대 매출 연속된 K일 동안의 최대 매출액을 구하는 slidingWindow 문제인데 여기서 문제인 건 slidingWindow을 처음 배운것이다. twoPointer를 배웠다면 범위를 많이 벗어나지 않아서 다행이었다. N의 범위는 100,000까지인데, 만약, 시간복잡도가 O(N^2)이었다면 시간초과 판정을 받았을 것이다. 되도록 O(nlogn)이내로 끊자. 이 문제의 핵심 요지는연속된 3일간인데, 나는 while문으로 투 포인터를 사용하면서 rt-lt+1===k을 지키는 선에서 최대매출을 계산했다. 그와 비슷하게 강사님은 for문으로 푸셨는데, 이전에 k번째까지의 합을 구해놓고, sum을 누적하면서 k번째 이전의 인덱스를 계속 빼줬다. 즉, 이전 단계+현재 단계에 중복.. 2021. 8. 27.
[ 자바스크립트(JavaScript) ] section05 - 4 - 연속 부분수열2 📍 section05 - 4 - 연속 부분수열2 연속 부분수열1보다 약간 더 어려운 문제였다. 이전 문제는 다음 rt 포인터가 기준보다 커지면 arr[lt++]처리를 해줬는데, 이 문제는 특정 기준 값 이하인 경우 새로운 숫자가 포함된 연속 부분 수열을 구해주면 된다. 그럼 이전 숫자는 안 구하는지 궁금할 수 있는데, 이전 숫자가 끝에 있으면서 연속 수열인 값은 이전 과정에서 구했기 때문에, 새로운 경우의 수만 누적해주면 된다. 반복문을 따라 sum+=arr[rt]를 누적한다. 만약, sum>target이면 sum target) { sum -= arr[lt++]; } ans += rt - lt + 1; } return ans; } 2021. 8. 27.
[ 자바스크립트(JavaScript) ] section05 - 3 - 연속 부분수열1 📍 section05 - 3 - 연속 부분수열1 N개의 수가 있을 때, 연속 부분 수열의 합이 target과 동일한 경우가 몇 번있는지 찾는 문제다. 이전까지는 이와 비슷한 유형의 문제를 풀어본 경험이 없기 때문에 어려웠다. N=m 인데, 만약, 현재 조건이 sumtarget이면, lt를 증가해서 sum= m) { sum -= arr[lt++]; if (sum === m) cnt++; } } return cnt; } // 강의 코드 let n = 8; let target = 6; let arr = [1, 2, 1, 3, 1, 1, 1, 2]; console.log(solution(n, target, arr)); function solution(n, target, arr) { let lt = (cnt = .. 2021. 8. 25.
[ 자바스크립트(JavaScript) ] section05 - 2 - 공통 원소 구하기 📍 section05 - 2 - 공통 원소 구하기 A, B 두 개의 집합이 주어질 때 공통 원소를 추출하여 오름차순으로 출력하는 문제다. 투 포인터를 사용해야 하는 이유는 N의 크기가 30,000인데, 이를 O(N^2)으로 풀게 되면 최악의 경우 1초당 9억번의 연산을 해야 하기 때문에 시간 초과가 난다. 따라서, O(N^2) 보다 작은 시간 복잡도로 계산해야 한다. 만약, N의 범위가 30,000보다 더 작다면 O(N^2)으로 bruteForce로도 풀 수 있다.bruteForce의 장점은 모든 경우의 수를 검사하기 때문에 정확한 결괏값이 나온다는 점이다. //O(N^2), bruteForce let n = 5; let arr1 = [1, 3, 9, 5, 2]; let m = 5; let arr2 = .. 2021. 8. 24.
[ 자바스크립트(JavaScript) ] section05 - 1 - 두 배열 합치기 📍 section05 - 1 - 두 배열 합치기 이번 섹션은 효율성을 고려하는 섹션으로 투 포인터, 슬라이딩윈도우, 해쉬를 사용하는 문제를 풀어본다. 오름차순으로 정렬된 배열을 합치는 문제인데, 저번에 병합 정렬(mergeSort) 연습하다가 이 문제와 비슷한 로직인 것 같아서 그대로 적용했다. 강사님 코드는 나의 코드와 조금 비슷하면서 달랐다. 또, 문제에서 n의 범위가 100까지기 때문에 시간 복잡도를 다항시간(O(N^2) 이상)내로 풀어도 되지만, 범위가 큰 경우를 대비해서 TwoPointer를 사용하여 O(N)으로 풀었다. 똑같이 풀 수 있는데 왜 twoPointer를 선택했냐고 묻는다면 만약, 실무에서 O(N^2) 코드와 O(N)코드가 있을 때 O(N)코드를 선택할 것임은 자명하다. 강사님은 후.. 2021. 8. 23.