728x90
https://www.acmicpc.net/problem/1069
문제 풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()),
m = Integer.parseInt(st.nextToken()),
d = Integer.parseInt(st.nextToken()),
t = Integer.parseInt(st.nextToken());
br.close();
double len = Math.sqrt(n * n + m * m); // (n, m) ~ (0, 0) 사이의 직선 거리 - 피타고라스의 정리
double walk, jump_and_walk, jump_one_more; // 이동 시간
walk = len; /* 걷기 */
if (len >= d) {
int jump = (int)(len / d); // 점프 횟수
jump_and_walk = (t * jump) + (len - (d * jump));
/* 점프 할 수 있는 만큼 하고 걷기 (남은 거리) */
jump_one_more = t * (jump + 1);
/* 점프 할 수 있는 만큼 하고 (꺾어서) 점프 한 번 더 하기 */
}
else {
jump_and_walk = t + (d - len);
/* 점프 한 번 하고 걷기 (더 간 만큼 되돌아오기) */
jump_one_more = t * 2;
/* 점프 한 번 하고 (꺾어서) 점프 한 번 더 하기 */
}
System.out.println(Math.min(walk, Math.min(jump_and_walk, jump_one_more)));
}
}
■ 한 점 (n, m) 에서 영점 (0, 0) 까지의 직선 거리
피타고라스 정리
< 이동 방법 >
1. 걷기 -- 1 초에 1 만큼
2. 점프 하기 -- T 초에 D 만큼 ( 정확하게 D칸만 움직일 수 있음 => 정수 )
< 이동 방법 조합 >
1. 걷기 ( 일직선으로 1초에 1 만큼 걷기 )
2. 점프 ● + 걷기 ● ( 일직선으로 점프 후 남은 or 더 간 거리 걷기 )
3. 점프 ( 꺾으면서 점프하기 )
( 풀이 참고 : https://sosoeasy.tistory.com/292 )
반응형
'코딩 문제 풀기 ( Algorithm problem solving ) > 백준 온라인 저지 ( BOJ )' 카테고리의 다른 글
[백준(Baekjoon)][자바(java)] 3665 : 최종 순위 / 위상 정렬 (0) | 2021.12.07 |
---|---|
[백준(Baekjoon)][자바(java)] 2252 : 줄 세우기 / 위상 정렬 (0) | 2021.12.07 |
[백준(Baekjoon)][자바(java)] 7869 : 두 원 / 기하 (0) | 2021.12.04 |
[백준(Baekjoon)][자바(java)] 2162 : 선분 그룹 / 기하 (0) | 2021.12.04 |
[백준(Baekjoon)][자바(java)] 20149 : 선분 교차 3 / 기하 (0) | 2021.11.27 |