[백준-node.js-2485] 가로수

이태헌·2023년 6월 11일
0
post-thumbnail

문제

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. 먼저 받아온 배열에서 각 자리의 숫자들을 뺀 값을 정렬해서 넣어준다
  2. 뺀 값들의 최대공약수를 구해서 각 자리의 숫자들에 최대공약수를 나누고 최대공약수와 같은 경우에는 가로수를 심지 않아도 되니 -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);

최대공약수 구하는 과정을 요약하여서 코드가 훨씬 줄어들고 가독성이 좋아진게 보인다.

0개의 댓글