DevLog:-)

[프로그래머스][JavaScript]연속 부분 수열 합의 개수 본문

알고리즘/프로그래머스

[프로그래머스][JavaScript]연속 부분 수열 합의 개수

hyeon200 2023. 7. 19. 01:22
반응형

문제

연속 부분 수열 합의 개수

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

function solution(e) {
    let s = [];
    let set = new Set(); //set 중복 안들어감
    let k;
    let sum =e.reduce((sum,cv)=>sum+cv,0);  //reduce를 이용해 합을 구함
    set.add(sum);
    let len = e.length
    
    //parseInt 나누기의 몫을 구함
    for(let i = 1 ; i <= parseInt(len/2);i++){
        for(let j=0; j<len;j++){
            //slice특정 부분 추출 (문자열에서 substr과 비슷)
            if(i+j <len){ k = (e.slice(j,(j+i)).reduce((sum,cv)=>sum+cv,0)); }
            else{ k = (e.slice(j).concat(e.slice(0, j+i-len)).reduce((sum,cv)=>sum+cv,0)); }
            set.add(k);
            set.add(sum-k);
        }
    }
    
    return set.size;
}



//set을 쓰기 전 코드 (findIndex를 이용해 중복 방지 -> 시간 초과 발생)
//if(s.findIndex((a)=>a==k)==-1){s.push(k);} //findIndex(함수) : 함수에 해당하는 값의 인덱스를 반환 없으면 -1반환
//if(s.findIndex((a)=>a==(sum-k))==-1){s.push(sum-k);}

✅checkpoint

Set(); 유일한 값을 저장
parseInt(len/2) 나누기 후 몫을 구하기
e.slice(1,3) 배열에서 특정 구간 추출 (문자열에서 substr과 유사)
arr1.concat(arr2, ···) 배열arr1과 배열arr2 합침
arr.findIndex((a) => a==='a') 배열 내에 a값의 최초 인덱스 반환(없으면 -1반환)

 

[Set 객체
Set(); -삽입한 순서대로 요소를 순회할 수 있음
-유일한 값을 저장 (하나의 Set 내 값은 한 번만 나타날 수 있다.)
let set = new Set(); 객체 생성하기
.size set  내에 원소의 개수
.clear(); set 내에 모든 원소 제거
.delete(value) set 내에  value 제거 후 성공 여부(boolean) return
.has(value) set 객체에 value가 있는지 여부(boolean) return
   
(추가 코드 )
set 반복하기  for (let item of mySet) console.log(item);
mySet.forEach(function(value) { console.log(value); });
Set 객체를 Array 객체로 변환 let myArr = Array.from(mySet);
Array를 Set으로 변환 let mySet = new Set([1, 2, 3, 4]);
교집합 let intersection = new Set([...set1].filter(x => set2.has(x)));
차집합 let difference = new Set([...set1].filter(x => !set2.has(x)));

 

[배열인지 확인하기]
Array.isArray(배열) 배열이면 true, 아니면 false
typeof(배열) 'object' (배열은 'object'의 특수한 한 형태)

 

[배열 내 검색하기]
find(함수) 인자로 받은 판별 함수를 만족하는 첫 번째 요소를 반환
  - arr.find(callback)
- 반환 :  value / 없을 땐 undefinded
- callback(element, index, array)
   → 콜백 함수가 받는 인자(배열에서 받아옴)
- 원하는 요소 찾으면 바로 메서드 종료

ex) arr =[1,2,3,4,5]
      
let result = arr.find((element, index, arr) => element === 2);  //2반환
      let result2 = arr.find((e) => e > 4) //5반환
findIndex(함수) 인자로 받은 판별 함수를 만족하는 첫 번째 식별자를 반환
  -arr.findIndex(callback)
-반환: index, 없다면 -1
-callback(element, index, array)
-원하는 요소를 찾자마자 메서드를 종료

ex) arr =[1,2,3,4,5]
      let result = arr.findIndex((element, index, arr) => element === 2);  //1반환
      let result2 = arr.findIndex((e) => e > 4); //4반환


indexOf(value)
인자로 요소를 받아 만족하는 첫 번째 식별자를 반환
  -arr.indexOf(value, fromIndex)
-반환 : index, 없다면 -1
-value 매개변수 : 배열에서 찾을 요소
-원하는 요소를 찾자마자 메서드를 종료함

ex) arr =[1,2,3,4,5]
      let result = arr.indexOf(1);//0반환
      let result2 = arr.indexOf(3);//2반환

+lastIndex() 마지막 index리턴
includes(value) 인자로 요소를 받아 포함 여(boolean) 반환
  -arr.includes(value)
-반환 : true, false
-object 체크시 같은 요소가 객체를 가리키는 지의 여부를 반환함 주의

ex) arr =[1,2,3,4,5]
      arr.includes(1); //true
      arr.includes(6); //false
some(함수)  조건에 맞는 값이 있는지 여부(boolean) 반환
  -arr.some(callback)
-반환: true, false

ex) arr =[1,2,3,4,5]
      arr.some((e)=>e===2); //true반환

 

반응형

 

📖다른 풀이

function solution(elements) {
    const circular = elements.concat(elements);
    const set = new Set();
    for (let i = 0; i < elements.length; i++) {
        let sum = 0;
        for (let j = 0; j < elements.length; j++) {
            sum += circular[i + j];
            set.add(sum);
        }
    }
    return set.size;
}

-> 처음부터 리스트 + 리스트 붙임!!👍

function solution(elements) {
  const set = new Set();
  for (let i = 1; i <= elements.length; i++) {
    const els = elements.concat(elements.slice(0, i));
    for (let j = 0; j < elements.length; j++) {
      set.add(els.slice(j, j + i).reduce((a, c) => a + c, 0));
    }
  }
  return set.size;
}

->for를 돌 때마다 필요한 만큼 리스트를 추가함

+slice 풀이 블로그

반응형