백준 문제 1069번 집으로 문제풀이 c++
https://www.acmicpc.net/problem/1069
1069번: 집으로
은진이는 지금 (X, Y)에 있고, (0, 0)에 있는 집으로 가능한 빨리 가려고 한다. 이동할 수 있는 방법은 다음 두 가지이다. 첫 번째 방법은 걷는것이다. 걸을 때는 1초에 1만큼 움직인다. 두 번째 방법
www.acmicpc.net
문제해석
이 문제는 기하문제 라고 생각하고 풀었다.
먼저 걸을때와 점프 하는 것이 있는데 점프 없이 걸어갈때 만을 먼저 살펴보자
그렇다면 1초당 1만큼 움직이므로 집까지의 걸리는 시간은 거리 d=sqrt(X*X+Y*Y)이다.
그런데 시작 점에서 점프를 섞어서 집으로 가는 방법 역시 존재 할 수있다.
처음에 빨간색 처럼 점프거리가 집 까지의 거리 보다 짧아 안 닿는 경우와
초록색 처럼 점프를 했을 때 집 까지의 거리 보다 길어서 초과 해서 가는 경우가 생길 수있다.
빨간색경우엔 빨간 점부터 점프없이 걸어서만 가는 경우 걸리는 시간
즉 d-D 값과 X,Y에서 Xr,Yr까지 점프하는데 걸린 시간 T의 합과 d의 값을 비교하여 더 작은 것을 고르고
Xr,Yr을 시작 점으로 반복 한다.
초록색경우엔 초록 점부터 점프없이 걸어서만 가는 경우 걸리는 시간
즉 D-d 값과 X,Y에서 Xg,Yg까지 점프하는데 걸린 시간 T의 합과 d의 값을 비교하여 더 작은 것을 고르고
Xg,Yg을 시작 점으로 반복 한다.
그러다가 이것을 d<=0일때 break를 걸어야 하는데 여기서 중요한 것이 맨 처음일때는 제외해야한다 왜냐하면
맨 처음일때는 점프했을때 자취가 아래 그림의 검은색 선이다.
그러나 두번째부터는 자취가 아래 그림처럼 원의 내부이다.
둘이 차이는 맨 처음 점프일때는 원의 테두리만 있을 수있다면, 두번째 점프 부터는 원의 내부의 어디든지 위치 할 수있다는 점이다.
즉 k(k>2)번 점프를 한다면 원래 위치 x,y를 중심으로 하고 반지름이 k*r을 이루는 원의 내부의 어디든 위치 하는것이 가능하다.
이 말은 즉슨 무조건 처음 점프는 예외 처리를 해준 후 그 뒤로 부터는 위에서 설명한 순서대로 반복하다 보면
d<=0 인 순간이 언젠간 오는데 이때 종료 해주면된다.
단 , d<0일 수 있기 때문에 종료직전에 ans=min(ans,T*i)이렇게 둘 중 작은 것으로 답을 업데이트 해주어야한다.
코드
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main(){
cout<<fixed;
cout.precision(9);
double ans=9999;
double X,Y,D,T; cin>>X>>Y>>D>>T;
double d=sqrt(X*X+Y*Y);
ans=min(ans,d);
for(int i=1; ; i++)
{
if(i==1)
{
d=abs(D-d);
ans=min(ans,d+T*i);
}
else
{
d=d-D;
if(d<=0)
{
ans=min(ans,T*i);
break;
}
ans=min(ans,abs(d)+T*i);
}
}
cout<<ans;
}
분명히 혼자 풀때 생각한것은 설명에 넣은 것 보다 훨씬 더 깊게 생각해서 풀어낸 것 인데
그것들을 모두 글로 설명을 하려고 하니까 너무 어렵고 생각했던 모든 걸 담는게 너무 힘들다..
생략한것도 좀 있고 무엇보다 아무것도 모르는 상태에서 내가 작성 한 것을 보고 과연 이해가 가능한가 생각하면 아닌거 같다.
설명을 제대로 못한거 같아서 아쉬운 문제이다.