[백준/JAVA] 2485번 가로수

정은아·2024년 2월 3일

[알고리즘] 수학 모음

목록 보기
23/152
post-thumbnail

내 풀이 1 - 정답

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {

        // 간격을 같게 하는 최소수 구하기

        // 테스트케이스를 for문을 돌려 받아온다.
        // 모든 간격을 List에 넣는다.
        // 첫 번째 간격의 최대 공약수를 저장한다.
        // for문을 돌면서 두 번째 간격부터 저장했던 간격과 최대공약수를 구한다.
        // 마지막 나무와 첫 번째 나무사이의 간격을 구한다.
        // 그 간격을 최대 공약수로 나누고, 심어져 있는 나무의 갯수 -2 값을 뺀다.
        // 심어져 있는 나무의 갯수 -2 하는 이유 : 첫 번째 나무와 마지막 나무 제외
        // 값을 출력한다.

        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();

        int num = sc.nextInt();
        int [] streetTree = new int [num];

        for (int i = 0; i < num; i++) {
            streetTree[i] = sc.nextInt();
        }

        int gcd = 0;

        for (int i = 0; i < num - 1; i++) {
            int distance = streetTree[i+1] - streetTree[i];
            gcd = uclid(distance, gcd);
        }

        int answer = ((streetTree[num - 1] - streetTree[0]) / gcd) + 1 - (streetTree.length);

        sb.append(answer);
        System.out.println(answer);
    }

    public  static int uclid(int a , int b){
        while(b != 0){
            int r = a % b;
            a = b;
            b = r;
        }

        return a;
    }
}

느낀점

이게 실버 4 난이도라고?
최대 공약수를 구하고, 사이를 구하고. 더해준다.
아주 간단해 보이지만 코드 설계와 구현에 애먹은 문제..

profile
꾸준함의 가치를 믿는 개발자

0개의 댓글