728x90
오답 노트 & 새로 알게 된 점
처음에 이 문제를 접근할 때, 조건 2개를 계속 생각했다.
1. 가로수를 같은 간격에 심기
2. 심어야 하는 가로수의 개수가 최소
그래서 갯수가 최소가 되기 위해서는 간격이 최대가 돼야 하며, 그 간격이 이미 심어져 있는 가로수와 일치해야 한다.
그래서 문제를 풀 때 배열로 입력받고, 그 간격들을 배열에 저장하였다. 그리고 그 간격들의 최대공약수를 구했고, 그 최대공약수를 간격으로 정했다.
사용 개념
유클리드 호제법(최대공약수)
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
package Math;
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int treeSize = Integer.parseInt(st.nextToken());
int tree[] = new int[treeSize];
for(int i = 0; i < treeSize; i++){
st = new StringTokenizer(br.readLine());
tree[i] = Integer.parseInt(st.nextToken());
}
int interval[] = new int[treeSize-1];
for(int i = 0; i < interval.length; i++){
interval[i] = Math.abs(tree[i] - tree[i+1]);
}
int real_inter = interval[0];
for(int i = 1; i < interval.length; i++){
real_inter = GCD(real_inter, interval[i]);
}
int result = -treeSize;
for(int i = tree[0]; i <= tree[treeSize-1]; i += real_inter){
result++;
}
System.out.print(result);
}
static int GCD(int num1, int num2){
int max = Math.max(num1, num2);
int min = Math.min(num1, num2);
while(min != 0){
int temp = max % min;
max = min;
min = temp;
}
return max;
}
}
|
cs |
728x90
'BOJ(Java)' 카테고리의 다른 글
자바(백준) 1644 소수의 연속합 (0) | 2021.05.06 |
---|---|
자바(백준) 6588 골드바흐의 추측 (0) | 2021.05.04 |
자바(백준) 2580 스도쿠 (0) | 2021.05.03 |
자바(백준) 2661 좋은 수열 (0) | 2021.05.01 |
자바(백준) 15686 치킨 배달 (0) | 2021.05.01 |