일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 다이나믹프로그래밍
- 알고리즘
- CSS
- 백준nodejs
- 자바스크립트
- 백준구현
- 포이마웹
- 코테
- 백준알고리즘
- 몽고DB
- 백준골드
- 리액트커뮤니티
- js코테
- HTML
- 프로그래머스JS
- 백준js
- JS프로그래머스
- JS
- 리액트댓글기능
- css기초
- dp알고리즘
- 익스프레스
- 프로그래머스
- 백준구현문제
- 안드로이드 스튜디오
- 리액트
- 코딩테스트
- 백준
- HTML5
- 프로그래머스코테
- Today
- Total
개발새발 로그
[JS] 프로그래머스 : 연속 부분 수열 합의 개수 본문
연속 부분 수열 합의 개수
철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다.
![](https://blog.kakaocdn.net/dn/CTFUl/btsj0aPEuMZ/OpesVMd8q4ROao5meIrbuK/img.png)
원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 3 ≤ elements의 길이 ≤ 1,000
- 1 ≤ elements의 원소 ≤ 1,000
입출력 예elementsresult
[7,9,1,1,4] | 18 |
입출력 예 설명
입출력 예 #1
길이가 1인 연속 부분 수열로부터 [1, 4, 7, 9] 네 가지의 합이 나올 수 있습니다.
길이가 2인 연속 부분 수열로부터 [2, 5, 10, 11, 16] 다섯 가지의 합이 나올 수 있습니다.
길이가 3인 연속 부분 수열로부터 [6, 11, 12, 17, 20] 다섯 가지의 합이 나올 수 있습니다.
길이가 4인 연속 부분 수열로부터 [13, 15, 18, 21] 네 가지의 합이 나올 수 있습니다.
길이가 5인 연속 부분 수열로부터 [22] 한 가지의 합이 나올 수 있습니다.
이들 중 중복되는 값을 제외하면 다음과 같은 18가지의 수들을 얻습니다.
[1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22]
첫번째 풀이
function solution(elements) {
var answer = [];
var arr=elements.concat(elements)//먼저 원으로 연결된 배열이니까 하나더 붙여준다
for(var i=1;i<=elements.length;i++){ //길이가 1인 길이가 2인의 반복문-> 배열의 길이까지 모두 구해야..
for(var j=0;j<elements.length;j++){//길이가 1인, 2인, 3인... 수열의 합을 넣는 반복문-> 1인거에서 몇개...
var sum=0;
for(var z=j;z<j+i;z++){//길이가 1인,2인,3인 수열의 합
sum+=arr[z];
}
answer.push(sum);
}
}
var set = new Set(answer);
var tt=[...set]
return tt.length;
}
두 번째풀이
function solution(elements) {
let arr=[...elements,...elements];
let answer=[];
for(var i=0;i<elements.length;i++){
for(var j=0;j<elements.length;j++){
let num=0;
for(var z=j;z<=j+i;z++){
num+=arr[z]
}
answer.push(num)
}
}
return [...new Set(answer)].length;
}
-첫 번째풀이와 마찬가지로 풀었다.
-리팩토링만 부분 수정했다.
프로그래머스 다른사람 풀이
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;
}
sum += circular[i + j];
이 부분이 중요하다
어차피 배열을 concat으로 붙였으므로 어디서 반복을 시작하느냐는 상관이없다
1번째 반복 0 , 0+1, 0+1+2, 0+1+2+3 ...
2번째 반복 1, 1+2, 1+2+3, 1+2+3+4...
3번쨰 반복 2, 2+1...
이런식으로 반복하면서 계속 Set한 배열에 넣는다.
'알고리즘' 카테고리의 다른 글
[JS] 프로그래머스 : 행렬의 곱 (0) | 2023.06.14 |
---|---|
[JS] 프로그래머스 : N^2 배열 자르기 (0) | 2023.06.14 |
[JS] 프로그래머스 : H-Index (0) | 2023.06.14 |
[JS] 프로그래머스 : 괄호 회전하기 (0) | 2023.06.14 |
[JS] 프로그래머스 : 귤 고르기 (0) | 2023.06.14 |