BOJ Link
풀이 과정
다른 행성에 도달하기 직전의 칸은 k가 1이여야 한다.
그렇다면, 러프하게 1 - (k올림) - max - (k내림) - 1의 꼴로 k가 전개됨을 알 수 있다.
몇 개의 케이스를 만들어 봤을 때,
1. k가 올림 - 내림 - 올림 등인 변칙적인 경로일 때 값이 최적인 경우는 없다고 생각했다.
2. 값을 누적했을 때, 더이상 k를 증가시킬 수 없다면, 경로에 사용되었던 k들로 모든 답을 구성할 수 있다고 생각했다.
(아마 최대 2번 더 사용해서)
그래서, 현재 이동한 거리 sum과 k를 비교하여,
1. dis <= sum + k + (k + 1)라면, dis에 값을 누적하고 k를 올린다.
2. dis > sum + k + (k + 1)라면, 사용된 k중 가장 큰 수부터 비교하며 최적해를 찾는다.
로 구현하였다.
일반적인 구현은 좀 더 수학적인 내용이 담겨있다.
제출 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int dis = to - from;
if (from == to) {
System.out.println(0);
continue;
}
long sum = 1;
int step = 1;
int dep = 1;
while (true) {
if (sum == dis) break;
// 갈 수 없으면 사용한 k들로 답 도출
if (dis < sum + dep + dep + 1) {
while (dep > 0) {
if (dep <= dis - sum) {
sum += dep;
step++;
} else dep--;
}
}
// 갈 수 있으면 k, k+1 만큼 이동
else {
sum += dep;
sum += dep + 1;
step += 2;
dep++;
}
}
System.out.println(step);
}
}
}
'백준 > Java' 카테고리의 다른 글
[백준 1245] 농장 관리 - JAVA (2) | 2024.07.22 |
---|---|
[백준 1202] 보석 도둑 - JAVA (0) | 2024.07.20 |
[백준 1195] 킥다운 - JAVA (0) | 2024.07.18 |
[백준 1106] 호텔 - JAVA (0) | 2024.07.16 |
[백준 1047] 울타리 - JAVA (0) | 2024.07.15 |