본문 바로가기
알고리즘 문제

[알고리즘 문제] Streetree

by 박연호의 개발 블로그 2019. 4. 11.

import java.util.*;
public class Main{
    public static void main(String[] args){
     
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int first,last;
        int GCD;
        int[] ary = new int[n];
        int[] gap = new int[100000];

        for(int i=0;i<n;i++){
          ary[i]=sc.nextInt();
          
          if(i>0){
            gap[i-1]=ary[i]-ary[i-1];
          }
        }
  
      for (int j = 1; j<n; j++) {
         gap[j] = gcd(gap[j],gap[j-1]);
      }
        
        GCD = gap[n-1];
        first = ary[0];
        last = ary[n-1];
        
      System.out.println(((last-first)/GCD-n+1));
    }
    
    static int gcd(int a,int b){
      if( a % b==0){
        return b;
      }else{
        return gcd(b,a%b);
      }
    }
}




문제는 간단하다. 1,5,7,11,13위치에 나무가 심어져 있을 때, 각 나무의 간격을 일정하게 하려면 어느 위치에 나무를 최소한으로 심어야 하는지 묻는 문제이다. 답은 3,9위치에 나무를 심으면 1,3,5,7,9,11 나무사이의 간격이 2로 일정한 간격을 유지할 수 있게 된다.

 

아이디어는  입력받은 나무들 간의 간격을 모두 구하고, 그 값들의 최대공약수를 구하는 것이다. 만약 2,10,14,18,30 위치에 나무들이 심어져 있으면 간격은 8,4,4,12가 될 것이다. 여기서 공약수는 2,4이다. 이 말은 나무의 간격은 2와 4의 배수위치에 나무들이 심어져 있다는 말이다. 하지만 나무의 간격이 2,4 모두 일정한 간격이지만 문제에서는 나무를 최소한으로 심어야 한다. 4로 심으면 간격은 일정하고 나무는 덜 심을 수 있다. 

 

입력받은 나무 마지막 위치-첫번째 위치를 하면 나무가 심어져 있는 총 거리를 알 수 있다. 거기에 아까 구한 4를 나누고+1을 하면  4의 일정한 간격만큼 총 몇개의 나무를 심을 수 있는지 알 수 있다.  여기에 처음 입력받은 n개의 나무를 빼주면 추가적으로 심어야하는 나무의 개수를 알 수 있다.

 

 

'알고리즘 문제' 카테고리의 다른 글

[알고리즘 문제] 문자열 압축  (0) 2019.04.15
[알고리즘 문제] Palindrome  (0) 2019.04.15
[알고리즘 문제] pfactorization  (0) 2019.04.09
[알고리즘 문제] Fraction Sum  (0) 2019.04.08
[알고리즘 문제]  (0) 2019.04.08