[코테] HackerRank Subarray Division 1

Dongmin Lee·2023년 5월 22일
0

코테

목록 보기
13/23

💿 문제

💾 문제 요약

배열 s와 숫자 d,m을 입력 받는다. s의 연속된 요소를 추출해 요소의 합이 d이고 길이가 m인 배열을 몇개나 만들 수 있는가?

💿 풀이

이 문제는 조건에 맞는 부분 배열을 추출하는 문제이다.

연속된 이라는 말이 핵심으로, 이를 키 포인트로 생각하고 문제를 풀었다.
일단 순회하며 추출한 요소의 합을 구하려고 할 때, 순회하는 인덱스의 범위는 0부터 s.length-m 으로 잡았다. 어차피 길이가 m만큼인 부분 배열을 추출할 것이기 때문에 이를 초과하는 범위까지 잡을 필요는 없다.

그리고 순회하는 인덱스마다 for문을 한번 더 돌려서 m개 만큼의 요소를 더했다. 이는 부분 배열의 합을 뜻하니까.

그리고 합이 d와 같은 경우 카운팅 하고 카운팅한 갯수를 리턴했다.

💾 풀이 코드

'use strict';

const fs = require('fs');

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';
let currentLine = 0;

process.stdin.on('data', function(inputStdin) {
    inputString += inputStdin;
});

process.stdin.on('end', function() {
    inputString = inputString.split('\n');

    main();
});

function readLine() {
    return inputString[currentLine++];
}

/*
 * Complete the 'birthday' function below.
 *
 * The function is expected to return an INTEGER.
 * The function accepts following parameters:
 *  1. INTEGER_ARRAY s
 *  2. INTEGER d
 *  3. INTEGER m
 */

function birthday(s, d, m) {
    let count = 0;
    
    for(let i = 0; i <= s.length - m; i++) {
        let sum = 0;
        for(let j = 0; j < m; j++) {
            sum += s[i+j];
        }
        if(sum === d) {
            count++;
        }
    }

    return count;
}

function main() {
    const ws = fs.createWriteStream(process.env.OUTPUT_PATH);

    const n = parseInt(readLine().trim(), 10);

    const s = readLine().replace(/\s+$/g, '').split(' ').map(sTemp => parseInt(sTemp, 10));

    const firstMultipleInput = readLine().replace(/\s+$/g, '').split(' ');

    const d = parseInt(firstMultipleInput[0], 10);

    const m = parseInt(firstMultipleInput[1], 10);

    const result = birthday(s, d, m);

    ws.write(result + '\n');

    ws.end();
}

💿 리마인더

profile
어제보다 성장하기

0개의 댓글