ACM준비/LeetCode

1652. Defuse the Bomb

조규현15 2024. 11. 20. 00:41
반응형

1652. Defuse the Bomb

You have a bomb to defuse, and your time is running out! Your informer will provide you with a circular array code of length of n and a key k.

To decrypt the code, you must replace every number. All the numbers are replaced simultaneously.

If k > 0, replace the ith number with the sum of the next k numbers.
If k < 0, replace the ith number with the sum of the previous k numbers.
If k == 0, replace the ith number with 0.
As code is circular, the next element of code[n-1] is code[0], and the previous element of code[0] is code[n-1].

Given the circular array code and an integer key k, return the decrypted code to defuse the bomb!


순회 가능한 array 이므로 array.length 를 벗어나는 index 로 값을 얻는 indexer ( 'get' ) 를 정의합니다.

주어진 k 값에 따라 순회 방향을 결정하고 하나씩 index 를 넘어가며 sum 값을 계산합니다.


/**
 * @param {number[]} code
 * @param {number} k
 * @return {number[]}
 */
var decrypt = function (code, k) {
    var n = code.length;
    function get(i) {
        if (i < 0) return code[i + n];
        else if (i >= n) return code[i - n];
        else return code[i];
    }

    var arr = [];
    if (k == 0) {
        for (var i = 0; i < n; i++) {
            arr.push(0);
        }
        return arr;
    }
    else if (k > 0) {
        var sum = 0;
        var j = k;
        while (j > 0) {
            sum += get(j);
            j -= 1;
        }
        arr.push(sum);
        for (var i = 1; i < n; i++) {
            sum -= get(i);
            sum += get(i + k);

            arr.push(sum);
        }
    }
    else {
        var sum = 0;
        var j = k;
        while (j < 0) {
            sum += get(j);
            j += 1;
        }
        arr.push(sum);
        for (var i = 1; i < n; i++) {
            sum -= get(k - 1 + i);
            sum += get(-1 + i);

            arr.push(sum);
        }
    }

    return arr;
};
반응형