티스토리 뷰

728x90

문제 링크

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

 

21870번: 시철이가 사랑한 GCD

첫째 줄에 정수 N이 주어진다. (1N200000) 둘째 줄에 자취방의 매물번호를 의미하는 정수 a1,a2,,aN이 주어진다. (1ai200000)

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
«   2025/04   »
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
글 보관함