https://www.acmicpc.net/problem/2485
let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
input.shift();
let arr = input.map(el=>+Number(el))
let answer = [];
for(let i = 0; i<arr.length-1; i++){
answer.push(Math.abs(arr[i]-arr[i+1]))
}
function gcd(a, b) { //최대공약수 구하기
if (a < b) {
[a, b] = [b, a];
}
if (b === 0) {
return a;
} else {
return gcd(b, a % b);
}
}
function findGCD(arr) { //여러개 숫자의 최대공약수
let result = arr[0];
for (let i = 1; i < arr.length; i++) {
result = gcd(result, arr[i]);
}
return result;
}
let num = findGCD(answer)
let sum = 0;
for(let x of answer){
sum += Math.floor(x/num)-1;
}
console.log(sum)
- 먼저 받아온 배열에서 각 자리의 숫자들을 뺀 값을 정렬해서 넣어준다
- 뺀 값들의 최대공약수를 구해서 각 자리의 숫자들에 최대공약수를 나누고 최대공약수와 같은 경우에는 가로수를 심지 않아도 되니 -1을 해줘서 나온 갯수들을 리턴해준다
const input = require("fs")
.readFileSync("dev/stdin")
.toString()
.split("\n")
.map(Number);
input.shift();
let arr = [];
let ans = 0;
for (let i = 0; i < input.length - 1; i++) {
const dist = input[i + 1] - input[i];
arr.push(dist);
}
function getGCD(num1, num2) {
return num2 > 0 ? getGCD(num2, num1 % num2) : num1;
}
let num = 0;
for (let i = 0; i < arr.length; i++) {
num = getGCD(num, arr[i]);
}
arr.forEach((v) => {
if (v > num) ans += v / num - 1;
});
console.log(ans);
최대공약수 구하는 과정을 요약하여서 코드가 훨씬 줄어들고 가독성이 좋아진게 보인다.