알고리즘 문제 풀기

백준 2003: 수들의 합2 - javascript(완전탐색)

Fo_rdang 2024. 1. 27. 17:49
반응형

문제출처 

https://www.acmicpc.net/problem/2003

 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

문제

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);
반응형