211007_자료구조&알고리즘(3)
1. 슬라이딩윈도우란?
-
알고리즘 배열이나 리스트의 요소의 일정 범위 값을 비교할 때 사용하면 유용한 알고리즘
-
매번 중복된 요소를 버리지 않고 재사용함으로써 낭비되는 계산을 하지 않는 것
(1) 최대 매출 구하기
- 연속된 K 일 동안의 매출액의 합 중에서 최대값이 얼마인지 구하라
내가 짠 부분
function soltution1 (nums , k){
let sum = 0; // 매출의 합계를 구하는 변수
let answer = 0; // 최대값을 담아서 return 할 변수
let over_index = 0; // 범위 벗어날 인덱스
for(let i = 0; i<nums.length; i++){
sum += nums[i]; // 합계 구하기
if(i > k-1){
sum-=nums[over_index];
answer = Math.max(answer,sum);
over_index++;
}
}
return answer;
}
알고리즘 배열이나 리스트의 요소의 일정 범위 값을 비교할 때 사용하면 유용한 알고리즘
매번 중복된 요소를 버리지 않고 재사용함으로써 낭비되는 계산을 하지 않는 것
내가 짠 부분
function soltution1 (nums , k){
let sum = 0; // 매출의 합계를 구하는 변수
let answer = 0; // 최대값을 담아서 return 할 변수
let over_index = 0; // 범위 벗어날 인덱스
for(let i = 0; i<nums.length; i++){
sum += nums[i]; // 합계 구하기
if(i > k-1){
sum-=nums[over_index];
answer = Math.max(answer,sum);
over_index++;
}
}
return answer;
}
하지만 강사님 수업의 패턴에 맞추기로 했다
그래서 다시 연습으로 코드 작성!
function solution1_1(nums, k){
let answer, sum=0;
for(let i=0; i<k; i++) sum+=nums[i];
answer=sum;
for(let i=k; i<nums.length; i++){
sum+=(nums[i]-nums[i-k]);
answer=Math.max(answer, sum);
}
return answer;
}
강사님은 아예 k 만큼 배열 값을 sum에 넣어주고 시작 그리고 k 값을 기준으로 다시 for문 시작한다
(2) 매출액의 종류
- 연속된 K 일 동안의 매출액의 종류를 구간별로 구하고 그 매출액의 종류를 배열로 반환
🔥 나는 처음에 set을 썼다 하지만 이게 중복이 불가능하기 때문에 첫번째 구간 이후 두번째 부터 같은 종류의 매출액이 발생하면 측정이 되지않는 사태... 해싱 사용하여 다시 도전
강사님이 알려주신 패턴으로 익혔다
function solution4(nums,k){
let answer = [];
let hash = new Map();
for( let i = 0 ; i<k-1 ; i++){
hash.set(nums[i],(hash.get(nums[i]) || 0)+1);
}
//// k-1 만큼 지정하고
let lt = 0;
for(let i = k-1; i <nums.length; i++){
hash.set(nums[i], (hash.get(nums[i]) ||0 )+1); // k 값 만큼 세팅 완료
answer.push(hash.size); // 그 상태의 문자열을 기록
hash.set(nums[lt], (hash.get(nums[lt])-1));
if(hash.get(nums[lt])===0)hash.delete(nums[lt]);
lt++;
}
return answer;
}
2. 투포인터(two-pointer)
- 리스트에 접근 해야할 때 두개의 점 위치를 기록하면서 처리하는 알고리즘
-
rigtht, left 모두 첫번째 원소를 가리키도록한다
-
현재 부분의 합이 M과 같다면 카운트!
-
현재 부분합이 M 보다 작다면 right 증가
-
현재 부분합이 M보다 크거나 같다면 left 증가
(3) 연속 부분수열 1
- 이것또한 혼자 else-if 쓰면서 작성한 코드가 있지만 너무 허접이라 익힐겸 다시 강사님의 패턴 코드로
function solution3_1(nums,m){
let left = 0 ,sum = 0 ,count = 0;
for(let right = 0; right < nums.length ; right ++){
sum += nums[right];
while (sum > m ){ // nums의 길이만큼만 돈다
sum-=nums[left++];` `
}
if(sum === m )count++;
}
return count;
}
rigtht, left 모두 첫번째 원소를 가리키도록한다
현재 부분의 합이 M과 같다면 카운트!
현재 부분합이 M 보다 작다면 right 증가
현재 부분합이 M보다 크거나 같다면 left 증가
function solution3_1(nums,m){
let left = 0 ,sum = 0 ,count = 0;
for(let right = 0; right < nums.length ; right ++){
sum += nums[right];
while (sum > m ){ // nums의 길이만큼만 돈다
sum-=nums[left++];` `
}
if(sum === m )count++;
}
return count;
}
🔥 연속 부분수열 2 이해 부족으로 시간이 좀 걸릴거같다 포기안함~~!!
(4) 연속 부분수열 3
-
연속부분수열의 합이 특정숫자 M이하가 되는 경우가 몇 번 있는지 구하라
-
연속부분수열이이라 answer 의 값을
(right-left +1) 해주는 부분이 이해가 가지 않아서 손으로 그려가며 여러번 실행해보고 이해했다
function solution3(nums, m){
let sum = 0 , left = 0, answer = 0;
for(let right = 0; right < nums.length; right++){
sum+=nums[right];
while(sum > m ) sum-=nums[left++];
answer+= (right-left+1);
}
return answer;
}
(5) 연속된 자연수의 합
- n을 표현하는 방법의 가짓수를 출력하는 프로그램을 작성하세요
function solution6(n){
let len = parseInt(n /2) +1 ;
let answer = 0;
let nums= Array(n)
.fill(0)
.map((v, i) => i + 1);
let left = 0, sum = 0 ;
for(let right = 0; right < len; right++){
sum+=nums[right];
while(sum > n) sum-=nums[left++];
if(sum === n){
answer++ ;
}
}
return answer;
}
위클리 테스트를 위한 해싱 복습
프로그래머스 - 완주하지못한 선수
너무 무한 for 이라서 민망하지만 연습용으로 괜찮았다 그리고 나중에 이렇게 짜놓은 코드 보면 도움된다고 해서 그래두 기록 남긴다
function solution(participant, completion) {
let answer = "";
let hashSet = new Map();
for( let p of participant){
hashSet.set(p, (hashSet.get(p) || 0)+1);
}
for(let c of completion){
hashSet.set(c, hashSet.get(c)-1);
}
for(let [key,val] of hashSet){
if(val > 0) answer = key;
}
return answer;
}
console.log(solution(["mislav", "stanko", "mislav", "ana"],["stanko", "ana", "mislav"]))
Author And Source
이 문제에 관하여(211007_자료구조&알고리즘(3)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@akk0504/211007자료구조알고리즘3저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)