반응형
문제출처
https://www.acmicpc.net/problem/2003
문제
N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
출력
첫째 줄에 경우의 수를 출력한다.
예제 입력 1 복사
4 2
1 1 1 1
예제 출력 1 복사
3
예제 입력 2 복사
10 5
1 2 3 4 2 5 3 1 1 2
예제 출력 2 복사
3
문제 풀이 힌트
배열 [1,1,1,1] 의 4개의 숫자가 2의 값이 되는건 몇개일까?
이런식으로 3개다. !
즉, 기준이 되는 첫번째 수 이후로 M(여기서 2)보다 sum(합)이 작을 때까지 뒤에 오는 수를 차례로 더해주면 된다.
만약 sum > M 이 되는 순간이 오면
더하는 것을 멈추고,
그동안 sum (더한 값)이 === M 과 같은지 확인해준다.
같다면 answer+1 해주면 끝 !
문제 풀이 코드
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n'); //문자열 양끝 공백 제거, 줄바꿈으로 문자열 나누기
const [N,M] = input[0].split(' ').map(Number); //N = 4, M =2
let arr = input[1].split(' ').map(Number);// arr = [1,1,1,1]
function solution(N,M,arr) {
let answer = 0; //숫자들을 더했을 때 M이 될 때마다 answer+1 해줄 것.
for(let i=0; i<N; i++){ //기준이 되는 첫번째 수
let sum = arr[i];
let idx = i;
while(sum < M && idx < N-1){ // 기준이 되는 수 이후로 계속 더한다. (M을 넘지 않을 때 && 배열의 마지막 idx를 넘지 않을 때 )
idx++; //조건을 만족할 때까지 계속 다음 idx를 지정한 후,
sum += arr[idx]; //더한다.
}
if(sum === M) answer++; //만약 더한 값들이 M과 같을 때 answer+1를 해준다.
}
console.log(answer); //answer 출력
}
solution(N,M,arr);
Only 풀이 코드
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const [N,M] = input[0].split(' ').map(Number);
let arr = input[1].split(' ').map(Number);
function solution(N,M,arr) {
let answer = 0;
for(let i=0; i<N; i++){
let sum = arr[i];
let idx = i;
while(sum < M && idx < N-1){
idx++;
sum += arr[idx];
}
if(sum === M) answer++;
}
console.log(answer);
}
solution(N,M,arr);
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
백준 1388: 바닥 장식 - javascript(이중 for문, dfs) (1) | 2024.02.07 |
---|---|
백준 10610: 30 - javascript(그리디) (0) | 2024.02.06 |
백준 1158:요세푸스 문제 -javascript(구현) (0) | 2024.01.24 |
백준 1026: 보물 - javascript (그리디) (2) | 2023.11.26 |
[2022 KAKAO TECH INTERNSHIP] 두 큐 합 같게 만들기- JS (0) | 2023.11.24 |