dlehdanakf / Codingtest-Study

알고리즘 코딩테스트 토막지식 정리
1 stars 0 forks source link

PrefixSum #9

Open dlehdanakf opened 3 years ago

dlehdanakf commented 3 years ago

개요

예시

TapeEquilibrium

해결과정

function solution(A) {
    let left = 0, right = A.reduce((acc, cur) => acc + cur, 0);
    let answer = Infinity;
    for(let i = 1; i < A.length; i++) {
        left += A[i - 1];
        right -= A[i - 1];

        const diff = Math.abs(left - right);
        answer = Math.min(answer, diff);
    }

    return answer;
}
dlehdanakf commented 3 years ago

쿠키 구입

해결과정

function solution(cookie) {
    // 부분합 배열 만들기
    const PS = [0, ...cookie];
    for(let i = 1; i < PS.length; i++) {
        PS[i] += PS[i - 1];
    }

    let answer = 0;
    for(let m = 0; m < PS.length; m++) {
        const t = PS[m]; // 0 부터 m 까지 합
        for(let r = m + 1; r < PS.length; r++) {
            const right = PS[r] - t; // m + 1 부터 r 까지 합
            if(t < right || right <= answer) {
                // right 값이 answer 보다 작다면 계산해볼 필요가 없다.
                // right 값이 t 보다 크다면 t에서 더 줄여봤자 항상 right 값이 더 크므로 더 계산할 필요가 없다.
                continue;
            }

            for(let l = 0; l < m; l++) {
                const left = t - PS[l]; // l ~ m 까지 합
                if(left === right) {
                    // left 값과 right 값이 같다면 정답일 수 있다.
                    answer = Math.max(answer, left);
                } else if(left < right) {
                    // left 값이 right 보다 작다면 더 이상 부분합 구간을 줄여봤자 항상 작으므로 l 탐색을 멈춘다.
                    break;
                }
            }
        }
    }

    return answer;
}
dlehdanakf commented 3 years ago

보석쇼핑

해결방법

function solution(gems) {
    const PS = new Array(gems.length + 1).fill(undefined);
    PS[0] = new Map;
    for(let i = 1; i < PS.length; i++) {
        PS[i] = new Map(PS[i - 1]);

        const gem = gems[i - 1];
        PS[i].set(gem, (PS[i].get(gem) || 0) + 1);
    }

    const gem_categories = [...PS[PS.length - 1].keys()];
    const gem_diff = (a, b) => {
        for(const gem of gem_categories) {
            if((b.get(gem) || 0) - (a.get(gem) || 0) < 1) {
                return false;
            }
        }

        return true;
    };

    let _i = PS.length, _j = 1, gap = _i - _j;
    for(let i = gem_categories.length; i < PS.length; i++) {
        if(PS[i].size !== gem_categories.length) {
            continue;
        }

        for(let j = Math.max(i - gap, 1); j <= i; j++) {
            const c = gem_diff(PS[j - 1], PS[i]);
            if(c === true && i - j < gap) {
                gap = i - j; _i = i; _j = j;
            } else if(c === false) {
                break;
            }
        }
    }

    return [_j, _i];
}
function solution(gems) {
    const gem_set = new Set(gems);
    const gem_size = (s, e) => (new Set(gems.slice(s, e))).size;

    let is_verified = false, gap = gems.length, _i, _j;
    for(let i = gem_set.size - 1; i < gems.length; i++) {
        if(gem_size(0, i + 1) !== gem_set.size) {
            continue;
        }

        for(let j = 0; j <= i; j++) {
            const c = gem_size(j, i + 1) === gem_set.size;
            if(c === true && i - j < gap) {
                gap = i - j, _i = i, _j = j;
            } else if(c === false) {
                break;
            }
        }
    }

    return [_j + 1, _i + 1];
}
function solution(gems) {
    const { size } = new Set(gems);
    const obj = new Map;

    let _i, _j;
    gems.forEach((gem, i) => {
        obj.delete(gem);
        obj.set(gem, i);

        if(obj.size === size) {
            // const [ j ] = [...obj.values()];
            const { value: j } = obj.values().next();
            if(_j === undefined || _i - _j > i - j) {
                _i = i;
                _j = j;
            }
        }
    });

    return [_j + 1, _i + 1];
}