작성일 :

문제 링크

16410번 - Goat Rope

설명

말뚝 위치와 축에 평행한 직사각형이 주어집니다. 말뚝은 항상 직사각형 외부에 있습니다.

말뚝에서 직사각형까지의 최소 거리를 구해, 줄 길이를 그보다 짧게 잡을 수 있게 하는 문제입니다.


접근법

먼저, x좌표가 직사각형 범위 안이면 가로 거리는 0, 왼쪽이면 왼쪽 변까지, 오른쪽이면 오른쪽 변까지의 거리를 구합니다.

다음으로, y좌표도 동일하게 처리해 세로 거리를 구합니다.

이후, 최소 거리는 가로 거리와 세로 거리의 유클리드 거리입니다. 한 축이라도 0이면 수직 또는 수평 거리만 남습니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;

namespace Solution {
  class Program {
    static void Main(string[] args) {
      var parts = Console.ReadLine()!.Split();
      var x = int.Parse(parts[0]);
      var y = int.Parse(parts[1]);
      var x1 = int.Parse(parts[2]);
      var y1 = int.Parse(parts[3]);
      var x2 = int.Parse(parts[4]);
      var y2 = int.Parse(parts[5]);

      var dx = 0;
      var dy = 0;
      if (x < x1) dx = x1 - x;
      else if (x > x2) dx = x - x2;
      if (y < y1) dy = y1 - y;
      else if (y > y2) dy = y - y2;

      var dist = Math.Sqrt(dx * dx + dy * dy);
      Console.WriteLine(dist.ToString("0.000"));
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int x, y, x1, y1, x2, y2;
  cin >> x >> y >> x1 >> y1 >> x2 >> y2;

  int dx = 0, dy = 0;
  if (x < x1) dx = x1 - x;
  else if (x > x2) dx = x - x2;
  if (y < y1) dy = y1 - y;
  else if (y > y2) dy = y - y2;

  cout << fixed << setprecision(3) << sqrt(dx * dx + dy * dy) << "\n";

  return 0;
}