티스토리 뷰

728x90

문제 링크

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

 

21870번: 시철이가 사랑한 GCD

첫째 줄에 정수 $N$이 주어진다. ($1 \leq N \leq 200\,000$) 둘째 줄에 자취방의 매물번호를 의미하는 정수 $a_1, a_2, \cdots, a_N$이 주어진다. ($1 \leq a_i \leq 200\,000$)

www.acmicpc.net

 

풀이

각 단계마다 반으로 나눠진 배열의 왼쪽, 오른쪽 결과를 재귀적으로 모두 확인하면 됩니다.

재귀 호출의 깊이가 $O(logN)$이고, 각 레벨마다 gcd를 구하기 위해 모든 원소를 봐야 하므로 시간 복잡도는 $O(NlogN)$입니다.

 

 

정답 코드

const fs = require('fs');
const stdin = fs.readFileSync('/dev/stdin').toString().split('\n');
const input = (() => {
    let line = 0;
    return () => stdin[line++];
})();

const gcd = nums => {
    const _gcd = (a, b) => (b === 0 ? a : _gcd(b, a % b));
    return nums.reduce((ret, v) => _gcd(ret, v), nums[0]);
};

const splitArray = arr => {
    const len = arr.length;
    const l = [...arr];
    const r = l.splice(parseInt(len/2, 10));
    return [l, r];
};

const main = function () {
    const n = +input();
    const p = input().split(' ').map(Number);

    const go = p => {
        if(p.length === 1) return p[0];

        const [l, r] = splitArray(p);
        return Math.max(gcd(l) + go(r), go(l) + gcd(r));
    }
    console.log(go(p));
};

main();
728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함