-
[효율성/투포인터스 알고리즘] 연속 부분 수열2알고리즘 2022. 7. 31. 19:07
문제
N개의 수로 이루어진 수열이 주어집니다.
이 수열에서 연속부분수열의 합이 특정숫자 M이하가 되는 경우가 몇 번 있는지 구하는 프로그 램을 작성하세요.
만약 N=5, M=5이고 수열이 다음과 같다면
13123
합이 5이하가 되는 연속부분수열은 {1}, {3}, {1}, {2}, {3}, {1, 3}, {3, 1}, {1, 2}, {2, 3}, {1, 3, 1}로 총 10가지입니다.▣ 입력설명
첫째 줄에 N(1≤N≤100,000), M(1≤M≤100,000,000)이 주어진다. 수열의 원소값은 1,000을 넘지 않는 자연수이다.▣ 출력설명
첫째 줄에 경우의 수를 출력한다.▣ 입력예제 1 55 13123
▣ 출력예제 1 10
결과
O
내가 푼 방식
const solution = (arr, m) => { let answer = 0; for(i = 0; i < arr.length; i++) { let sum = 0; for(j = i; j < arr.length; j++) { sum = sum + arr[j]; if(sum <= m) { answer ++ } else { break; } } } return answer; } solution([1,3,1,2,3],5)
접근과정
1. 리턴할 변수 answer를 0으로 초기 정의한다.
2. 첫 번째 반복문을 통해 각 요소들을 순회하고 순회마다 sum의 값을 0으로 초기화한다.
3. 반복문 안의 이중 반복문을 통해 첫 번째 반복문의 요소부터 다시 순회한다.
4. 이 때 sum의 값에 더해주고
5. sum의 값이 특정 숫자 m이하가 될 때 마다 answer의 값을 1씩 더해준다.
6. m보다 클 시 반복문을 멈춘다.
7. answer를 리턴한다.
모범답안
function solution(m, arr){ let answer=0, sum=0, lt=0; for(let rt=0; rt<arr.length; rt++){ sum+=arr[rt]; while(sum>m){ sum-=arr[lt++]; } answer+=(rt-lt+1); } return answer; }
리뷰
'알고리즘' 카테고리의 다른 글
[효율성] 학급회장 해쉬 (0) 2022.08.07 [효율성] 최대 매출 (0) 2022.07.31 [효율성/투포인터스 알고리즘] 연속 부분 수열1 (0) 2022.05.08 [효율성/투포인터스 알고리즘] 공통 원소 구하기 (0) 2022.05.01 [효율성/투포인터스 알고리즘] 두 배열 합치기 (0) 2022.04.24