[백준(Baekjoon)][자바(java)] 1069 : 집으로 / 기하

728x90

 

https://www.acmicpc.net/problem/1069

 

1069번: 집으로

은진이는 지금 (X, Y)에 있고, (0, 0)에 있는 집으로 가능한 빨리 가려고 한다. 이동할 수 있는 방법은 다음 두 가지이다. 첫 번째 방법은 걷는것이다. 걸을 때는 1초에 1만큼 움직인다. 두 번째 방법

www.acmicpc.net

 

문제 풀이

 

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 )

 

 

반응형