(전공복습) 데이터과학 4. 시각화
차례
약간의 아이디어가 필요한 기하학 문제.
기하학이라고 하면 어려워 보이지만 그냥 도형 문제다.
일단, 핵심이 되는 아이디어는 원의 정의를 생각하는 것이다.
어떤 점에서, 그 점과 같은 거리를 지닌 모든 점들의 집합을 원이라 할 수 있다.
그러면 시작점 (x, y)
에서 반지름이 d
인 원을 생각해보자.
이 원 위의 점은 한 번의 점프로 갈 수 있는 모든 점들의 집합이다(다만 그게 최단시간이라는 보장은 없다).
그럼 두 번의 점프로 갈 수 있는 점들은 어떠한 점들일까?
바로 방금 그 원 위의 점에서 그릴 수 있는 모든 원 위에 있는 점이다.
그렇다면 어떤 점이 그 원에 속하는가? 바로 중심이 (x, y)
이고 반지름이 2 * d
인 원 안의 모든 점이다.
왜냐하면 거리가 2 * d
이하인 모든 점은 두 번의 점프로 갈 수 있는 점이기 때문이다.
심지어, 거리가 d
보다 작은 경우에도 두 번의 점프로 갈 수 있다(d
만큼 뛰고 적당한 각도로 다시 돌아오면 되니까).
그럼 세 번의 점프는 어떤가? 3 * d
이하 거리의 모든 점일 것이다. 네 번의 점프는 4 * d
이하 거리의 모든 점일 것이다.
그럼 이제 케이스를 생각해보자.
우선, 점프를 한 번(또는 0번) 하는 경우(거리 dist
가 d
이하인 경우)이다. 이 경우가 다른 경우와 다른 부분은, 점프를 두 번 이상 하면 원 안의 그 어떤 점이든 갈 수 있지만, 이 경우에는 오직 원 위의 점만 갈 수 있기 때문이다.
어쨌든, 이 경우 가능한 방법은 3가지다. 이 방법 중 가장 시간이 적게 걸리는 방법을 선택하면 된다.
1) 그냥 걸어서 간다. 시간은 dist
만큼 든다.
2) 점프를 한 번 해서 d
만큼 거리를 벌린 이후 다시 되돌아간다. 시간은 t + d - dist
만큼 든다.
3) 그냥 점프를 두 번 해서 원하는 점으로 간다. 시간은 2 * t
만큼 든다.
점프를 두 번 이상 하는 경우는 어떨까?
1) 그냥 걸어서 간다. 마찬가지로 시간은 dist
만큼 든다.
2) 점프를 거리를 넘어서기 전까지만 뛰고 남은 거리를 걸어간다. 시간은 (dist / d) * t + (dist % d)
만큼 든다.
3) 앞선 경우에서 점프를 한 번 더 해서 원하는 점으로 간다. 시간은 (dist / d + 1) * t
만큼 든다.
잘 생각해보면, 한 번 뛰는 경우의 1번은 두 번 이상 뛰는 경우의 1, 2번과 같고, 한 번 뛰는 경우의 3번은 두 번 뛰는 경우의 3번과 같다. 한 번 뛰는 경우의 2번은 두 번 이상 뛰는 경우 무조건 3번보다 작거나 같으므로 빠지게 된다.
아무튼, 이런 각 경우의 최솟값을 구해서 그걸 답으로 출력하면 된다.
#!python
x, y, d, t = map(int, input().split())
# x, y에서 0, 0으로의 거리
dist = (x ** 2 + y ** 2) ** (1 / 2)
# divmod를 통해 이후 계산할 값을 미리 계산해준다
a, b = divmod(dist, d)
if not a:
# 거리가 d 이하인 경우
# 1. 그냥 걸어가기
# 2. 한 번 뛰고 되돌아가기
# 3. 두 번 뛰기
ans = min(b, t + d - dist, float(t * 2))
else:
# 거리가 d를 넘는 경우
# 1. 그냥 걸어가기
# 2. 점을 넘어서기 직전까지 뛰고 남은 거리는 걸어가기
# 3. 2에서 걷는 대신 한 번 더 뛰어서 가기
ans = min(dist, a * t + b, (a + 1) * t)
print(ans)
문제 링크 문제 링크
개요 선형적인 자료구조에서는 값에 접근하는 데에 \(O(1)\)이면 충분하지만, 대신 부분합을 구하는 데에는 \(O(N)\)이 필요하다. 그렇다면 이 자료구조를 이진 트리로 구성하면 어떨까? 값에 접근하는 데에 걸리는 시간이 \(O(\lg N)\)으로 늘어나지만 대신 부분합을 구하...
개요 다익스트라 알고리즘과 함께 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 다익스트라 알고리즘보다 느리지만, 음수 가중치 간선이 있어도 작동하며, 음수 가중치 사...
개요 다익스트라 알고리즘은 Single Sourse Shortest Path(SSSP) 문제를 푸는 알고리즘 중 하나이다. 즉, 한 노드에서 다른 모든 노드로 가는 최단 경로를 구하는 알고리즘이다. 단, 다익스트라 알고리즘은 음수 가중치 엣지를 허용하지 않는다. 이 경우에는 벨만-...