💡Problem Solving/BOJ

[BOJ 2485] 가로수 (Java)

gom20 2021. 12. 21. 19:15

문제

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

 

2485번: 가로수

첫째 줄에는 이미 심어져 있는 가로수의 수를 나타내는 하나의 정수 N이 주어진다(3 ≤ N ≤ 100,000). 둘째 줄부터 N개의 줄에는 각 줄마다 심어져 있는 가로수의 위치가 양의 정수로 주어지며, 가

www.acmicpc.net

 

풀이

가로수 사이의 간격을 계산하여 저장한 후 , 간격들의 최대 공약수를 구한다. 

가로수의 최대 거리와 가로수의 최소 거리의 차이를 구한 후 최대 공약수로 나눠준다. (유클리드 호제법 사용)

양 끝이 모두 포함되므로, 나눈 값에 1을 더한 값이 가로수의 개수가 된다. 

이 개수에서 이미 심어져 있는 가로수 개수를 뺀 값이 정답이 된다.

 

소스코드

package math;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BOJ2485 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N];

        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for(int i = 0; i < N; i++){
            arr[i] = Integer.parseInt(br.readLine());
            min = Math.min(arr[i], min);
            max = Math.max(arr[i], max);
        }
        int[] interval = new int[N-1];
        for(int i = 0; i < N-1; i++){
            interval[i] = arr[i+1] - arr[i];
        }

        int gcd = getGCD(interval[0], interval[1]);
        for(int i = 2; i < N-1; i++){
            gcd = getGCD(gcd, interval[i]);
        }

        System.out.println(((max-min)/gcd)+1 - (arr.length));
    }

    public static int getGCD(int a, int b){
        // great common divisor
        if(a < b){
            int temp = b;
            b = a;
            a = temp;
        }

        while(b != 0){
            int r = a%b;
            a = b;
            b = r;
        }
        return a;
    }

}

'💡Problem Solving > BOJ' 카테고리의 다른 글

[BOJ 1074] Z (Java)  (0) 2021.12.24
[BOJ 16234] 인구 이동 (Java, Python)  (0) 2021.12.23
[BOJ 15683] 감시 (Java)  (0) 2021.12.20
[BOJ 17070] 파이프 옮기기 1 (Java)  (0) 2021.12.19
[BOJ 16236] 아기 상어 (Java)  (0) 2021.12.18