✔ 아래의 캡쳐본은 문제의 일부입니다.
보다 자세한 제한 사항 및 입출력 예시는 위의 링크를 참고해주세요!
연속 부분 수열 합으로 만들 수 있는 개수를 return
👉 구간의 넓이가 고정되어 있을 경우 구간 합을 구하는 효율적인 방법!
const aSet = new Set();
aSet.add(0); // Set(1) {0}
aSet.add(1); // Set(2) {0, 1}
aSet.add(1); // Set(2) {0, 1} 1이라는 값은 이미 set에 존재하기 때문에 또 삽입되지 않는다
Set()
.size
: set 객체에 있는 원소의 개수 return.add(value)
: set 객체에 value 추가 .clear()
: set 객체에 있는 모든 원소 제거.delete(value)
: set 객체에 있는 value를 제거하고 성공적으로 제거되었는지 여부를 boolean 값으로 return.has(value)
: set 객체에 value 원소가 있는지 여부를 boolean 값으로 return const mySet = new Set();
// 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)));
const solution = (elements) => {
const sumSet = new Set();
const len = elements.length;
for (let i=1; i<=len; i++) { // 연속 부분 수열의 길이
/* 슬라이딩 윈도우 */
let sum = 0;
for (let j=0; j<len; j++) { // 연속 부분 수열 시작 지점의 인덱스
if (j === 0) { // 최초 한 번의 창문에 대해서만 직접 합을 구하기
for (let k=0; k<i; k++) {
sum += elements[k];
}
}
else { // 이후 창문들에 대해서는 이전에 구한 합을 활용하기
sum -= elements[j-1];
sum += elements[(j+i-1) % len];
}
sumSet.add(sum);
}
/*****************/
}
// 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return
return sumSet.size;
}
슬라이딩 윈도우를 활용했을 때 실행 속도가 확연하게 줄어든 것을 확인할 수 있다!
🔽 cf. slice 메서드 및 for문 덧셈 활용 코드
const solution = (elements) => {
const sumSet = new Set();
const getSum = (arr) => {
let sum = 0;
for (let i=0; i<arr.length; i++) sum += arr[i];
return sum;
}
const len = elements.length;
for (let i = 1; i <= len; i++) {
for (let j = 0; j < len; j++) {
if (j + i > len) {
sumSet.add(getSum(elements.slice(j, len)) + getSum(elements.slice(0, j+i-len)));
}
else {
sumSet.add(getSum(elements.slice(j, j+i)))
}
}
}
return sumSet.size;
}