[BOJ 1069] 집으로

2023. 2. 2. 23:27Baekjoon

728x90

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

 

1069번: 집으로

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

www.acmicpc.net

 

- 문제 요약

 

은진이는 지금 (X, Y)(1<=X,Y<=1000)에 있고, (0, 0)에 있는 집으로 가능한 빨리 가려고 한다. 이동할 수 있는 방법은 다음 두 가지이다.

첫 번째 방법은 걷는 것이다. 걸을 때는 1초에 1만큼 움직인다. 두 번째 방법은 점프하는 것이다. 점프를 하게 되면, T초에 D(1<=T,D<=10000)만큼 움직인다. 점프는 일직선으로만 할 수 있고, 정확하게 D칸만 움직일 수 있다.

위의 두 가지 방법을 이용해서 집에 돌아오는 데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오. 꼭 한 가지 방법만 사용해야 되는 것이 아니고, 두 가지 방법을 적절히 조합해서 가장 빠른 시간을 구하는 것이다.

첫째 줄에 집에 돌아오는 데 걸리는 시간의 최솟값을 출력한다. 절대/상대 오차는 10^-9까지 허용한다.

 

 

- 알고리즘 정리

 

점프 횟수에 따라 케이스를 나눠서 처리해 줬습니다.

int형 변수 j에 점프 횟수를 넣어놓고, 0일 때는 걷기, 점프 1회 + 걷기, 점프 2회 중 작은 값을 골랐습니다.

0이 아닐 때는 점프 1회 + 걷기, 점프 1회 추가 중 작은 값을 골라줬습니다.

 

 

- 코드 작성

 

#include<bits/stdc++.h>
using namespace std;

double x,y,d,t,result;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>x>>y>>d>>t;
	double w=sqrt(pow(x,2)+pow(y,2));
	cout<<fixed;
	cout.precision(9);
	if(d<t){
		cout<<w;
	}
	else{
		result=w;
		int j=w/d;
		w-=j*d;
		if(j==0){
			result=min(result,min(result,min(t+d-w,2.0*t)));
		}
		else{
			result=min(result,min(j*t+w,(j+1.0)*t));
		}
		cout<<result;
	}
}

코드 제출 결과

소수점 처리 잘못해서 맞왜틀 4번....ㅠ

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 20543] 폭탄 던지는 태영이  (0) 2023.02.04
[BOJ 14572] 스터디 그룹  (0) 2023.02.03
[BOJ 14454] Secret Cow Code  (0) 2023.01.27
[BOJ 26973] Circular Barn  (0) 2023.01.27
[BOJ 15748] Rest Stops  (0) 2023.01.25