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 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)

  • 리스트에 접근 해야할 때 두개의 점 위치를 기록하면서 처리하는 알고리즘
  1. rigtht, left 모두 첫번째 원소를 가리키도록한다

  2. 현재 부분의 합이 M과 같다면 카운트!

  3. 현재 부분합이 M 보다 작다면 right 증가

  4. 현재 부분합이 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;

}

🔥 연속 부분수열 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"]))

좋은 웹페이지 즐겨찾기