문제 요점
원형수열 안 연속부분의 합으로 만들수 있는 수가 몇가지?
첫번째 풀이(성공)
- 원형수열이므로 사이클이 생긴다. elements길이 ≤ 1,000이니까 elements를 덧붙여서 cycle배열을 만들 수 있다.
- 첫번째 갯수별로 순회한다 (선택한 숫자가 1개일 때, 2개일때......n개 일때)
- 두번째 시작인덱스로 순회한다 (시작인덱스가 0, 시작인덱스가 1.... 시작 인덱스가 n)
- 이 둘을 합치면 "선택한 숫자가 1개일때 시작인덱스가 0", "선택한 숫자가 1개일때 시작인덱스가 1"... 이런식으로 선택이 되는데 선택된 수의 합sum을 set에 추가한다.
- set의 size반환
function solution(elements) {
const set = new Set();
const cycle = elements.concat(elements)
for (let count = 1; count <= elements.length; count++) {
for (let startIndex = 0; startIndex < elements.length; startIndex++) {
// 시작인덱스에서 갯수만큼의 합을 구한다
const selected = [...cycle].splice(startIndex, count)
const sum = selected.reduce((acc, curr) => acc + curr, 0);
set.add(sum);
}
}
return set.size;
}
두번째 풀이(성공)
문제를 간단하게 생각해보면 각 시작 인덱스부터 n개의 합을 구해 set에 add하는 것이다
O^2 가능
슬라이딩 윈도우
가 떠올랐다
elements를 2번 덧붙이고 시작인덱스를 0에서부터 element의 크기 즉 window길이 까지 순회한다
window 크기까지의 합을 set에 더한다.
function solution(elements) {
var set = new Set();
let windowLen = elements.length;
elements = elements.concat(elements);
for (let startIndex = 0; startIndex < windowLen; startIndex++) {
let sum = 0;
for (let count = startIndex; count < startIndex + windowLen; count++) {
sum += elements[count];
set.add(sum)
}
}
return set.size;
}
확실히 시간이 단축되었다.
'알고리즘' 카테고리의 다른 글
[카카오 2022] 등산코스 정하기 (0) | 2023.11.18 |
---|---|
[레벨2] n^2 배열 자르기 (0) | 2023.11.03 |
[다익스트라 레벨3] 부대복귀 (0) | 2023.11.03 |
[레벨3] 기지국 설치 (0) | 2023.11.01 |
[다익스트라] 배달 (0) | 2023.11.01 |