JAVA/문제 풀이
[백준 / BOJ] 1069번 : 집으로 - JAVA
ahue
2023. 8. 31. 21:31
728x90
https://www.acmicpc.net/problem/1069
1069번: 집으로
은진이는 지금 (X, Y)에 있고, (0, 0)에 있는 집으로 가능한 빨리 가려고 한다. 이동할 수 있는 방법은 다음 두 가지이다. 첫 번째 방법은 걷는것이다. 걸을 때는 1초에 1만큼 움직인다. 두 번째 방법
www.acmicpc.net
문제 이해
지금껏 풀었던 대부분의 문제가 배열을 바탕으로 한 칸씩 이동하는 것이었기 때문에 처음 문제를 이해할 때 애를 먹었다. 이 문제에서 '1만큼 움직인다'는 1칸 움직이는 게 아니라 그냥 1 움직이는 것이다. 어느 방향이든 상관 없이.
빨리 가는 조건
가장 먼저 알아야 하는 것은 방향에 구애받지 않고 움직인다면, 거리가 D * 2 이하인 경우 점프 두 번으로 무조건 도달할 수 있다는 것이다. 다음 그림처럼 길이 D의 선분 두 개 사이 거리는 최소 0부터 최대 2 * D까지 가능하다.
따라서 다음 조건으로 문제를 풀었다.
1. D가 T보다 작다면 (시간 당 거리가 1이 안된다면) 그냥 걸어가는 것이 빠르다.
2. D가 T보다 크다면
2 - 1. 총 거리가 D보다 작은 경우 i) 그냥 걷는 시간 과 ii) 두 번의 점프로 도달하는 시간, iii) N + 1번 점프한 뒤 더 나아간 거리를 되돌아오는 시간을 비교한다.
2 - 2. 총 거리가 D보다 큰 경우 i) 총 거리를 D로 나눈 N 보다 한 번 더 점프하는 시간 과 ii) 그냥 걷는 시간을 비교한다.
그림으로 나타내면 다음고 같다.
전체 코드
// 시간 : 76ms
// 메모리 : 11620KB
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 X = Integer.parseInt(st.nextToken());
int Y = Integer.parseInt(st.nextToken());
int D = Integer.parseInt(st.nextToken());
int T = Integer.parseInt(st.nextToken());
if(D <= T) {
System.out.println(Math.sqrt(X * X + Y * Y));
} else {
double dist = Math.sqrt(X * X + Y * Y);
int N = (int) dist / D;
if(dist - N * D == 0) {
System.out.println(N * T);
} else {
if(N == 0) {
double two_jump = T + T;
double only_walk = dist;
double jump_and_back = T + D - dist;
System.out.println(Math.min(two_jump, Math.min(only_walk, jump_and_back)));
} else {
double rest = dist - N * D;
double more_jump = T;
double only_walk = rest;
System.out.println(Math.min(more_jump, only_walk) + N * T);
}
}
}
}
}
반응형