본문 바로가기
Beakjoon&프로그래머스/Java

[백준/Java] 2485번 가로수

by 현장 2025. 12. 25.

-Code

import java.util.Scanner;

public class BOJ2485 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int t = sc.nextInt();
        int[] nums = new int[t];

        for (int i = 0; i < t; i++) {
            nums[i] = sc.nextInt();
        }
        // 가로수 사이 거리들의 최대 공약수 구하기
        int gcd = nums[1] - nums[0];
        for (int i = 2; i < t; i++) {
            gcd = getGcd(gcd, nums[i] - nums[i - 1]);
        }

        int start = nums[0];
        int end = nums[t - 1];
        int answer = 0;
        // 최대값 전까지 최대 공약수 만큼 더하면서 갯수 새기
        while (start <= end) {
            answer++;
            start += gcd;
        }
        System.out.println(answer - t);
    }

    private static int getGcd(int a, int b) {
        if (b == 0) {
            return a;
        }
        return getGcd(b, a % b);
    }
}

위가 정답 코드이나 뭔가 개선 가능할 것 같이서 아래와 같이 개선했습니다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int t = sc.nextInt();
        int[] nums = new int[t];

        for (int i = 0; i < t; i++) {
            nums[i] = sc.nextInt();
        }
        // 가로수 사이 거리들의 최대 공약수 구하기
        int gcd = nums[1] - nums[0];
        for (int i = 2; i < t; i++) {
            gcd = getGcd(gcd, nums[i] - nums[i - 1]);
        }

        int start = nums[0];
        int end = nums[t - 1];
		// 시작점 부터 끝점까지의 거리 나누기 gcd 후 + 1이
        // 총 가로수 설치 수
        System.out.println((end - start) / gcd - t + 1);
    }

    private static int getGcd(int a, int b) {
        if (b == 0) {
            return a;
        }
        return getGcd(b, a % b);
    }
}