문제 해석
가로수의 개수(N)을 입력받고, 가로수의 개수만큼 가로수의 좌표(위치)값을 입력받는다.
현재 심어진 가로수의 좌표(위치)값을 모두 입력받았다면, 그 값들을 가지고 가로수와 가로수 사이의 간격이 모두 동일하도록 가로수를 추가하여, 최소로 추가할 수 있는 가로수의 개수를 구하면 된다.
이런 식으로 간격을 동일하게 가로수의 나무를 심고, 새로 심은 나무의 개수를 반환하면된다. (위의 예시로는 3이 된다.)
int gcd = 0; //가로수 간격의 최대 공약수를 저장하는 변수
for(int i = 0; i < N-1; i++){
int distance = streetTree[i+1] - streetTree[i];
gcd = findGCD(distance, gcd); //가로수 간격의 최대 공약수
}
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int[] streetTree =new int[N];
for(int i = 0; i < N; i++){
streetTree[i]=Integer.parseInt(br.readLine());
}
br.close();
int gcd = 0; //가로수 간격의 최대 공약수를 저장하는 변수
for(int i = 0; i < N-1; i++){
int distance = streetTree[i+1] - streetTree[i];
gcd = findGCD(distance, gcd); //가로수 간격의 최대 공약수
}
//(streetTree[N-1]-streetTree[0])/gcd은 간격의 수니까
//가로수의 나무의 개수를 구하려면 간격의 수에서 + 1을 해야한다.
bw.write((streetTree[N-1]-streetTree[0])/gcd+1-(streetTree.length) + "");
bw.flush();
bw.close();
}
//최대 공약수 구하기
static int findGCD(int A, int B){
while(B != 0){
int R = A%B;
A = B;
B = R;
}
return A;
}
}
결과
느낀 점