코딩테스트

[백준][기하학] 이사

pythaac 2022. 2. 15. 19:18
BAEKJOON Online Judge(BOJ) 문제입니다.

https://www.acmicpc.net/

 

Baekjoon Online Judge

Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.

www.acmicpc.net

 

문제

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

 

17371번: 이사

$(\frac{2}{3}, \frac{1}{3})$으로 이사를 가면 가장 가까운 편의시설은 (0, 1)으로 거리는 $\frac{2\sqrt{2}}{3}$이고, 가장 먼 편의시설은 (-4, 1) 혹은 (4, -3)으로 거리는 둘 다 $\frac{10\sqrt{2}}{3}$이다. 두 거리의

www.acmicpc.net

 

내가 작성한 코드

import sys, math

read = sys.stdin.readline


def read_data():
    N = int(read().rstrip())
    points = []
    for _ in range(N):
        points.append(tuple(map(int, read().rstrip().split())))

    return N, points


def distance(x, y):
    return math.sqrt(((x[0] - y[0]) ** 2) + ((x[1] - y[1]) ** 2))


def get_min_distance(points):
    mn_distance = float('inf')
    mn_point = ()
    for i in range(len(points)):
        crnt = points[i]
        crnt_distance = max([distance(crnt, other) for other in points])
        if crnt_distance < mn_distance:
            mn_distance = crnt_distance
            mn_point = crnt
    return mn_point


N, points = read_data()
print(*get_min_distance(points))
  • 브루트포스
    • 각 점에 대해 가장 긴 거리 구하기
    • 모든 점에 대해 구한 긴 거리 중, 가장 짧은 거리 구하기
    • 해당 점을 출력

 

다른 사람이 작성한 코드

import sys

def distance(x1, y1, x2, y2):
    return (x2-x1)**2 + (y2-y1)**2
    
n = int(input())
convini = []

for _ in range(n):
    convini.append(tuple(map(int, sys.stdin.readline().split())))

_min = 9876543210
_min_idx = -1

for i in range(n):
    _max = -1
    _m_idx = -1
    for j in range(n):
        d = distance(convini[i][0], convini[i][1], convini[j][0], convini[j][1])
        if _max < d:
            _max = d
            _m_idx = i
    if _max < _min:
        _min = _max
        _min_idx = _m_idx
        
print(convini[_min_idx][0], convini[_min_idx][1])
  • 문제 접근 참고
    • 문제 접근 방법을 아래 블로그를 보며 참고

https://chinpa.tistory.com/58

 

[백준] 17371 - 이사

www.acmicpc.net/problem/17371 17371번: 이사 $(\frac{2}{3}, \frac{1}{3})$으로 이사를 가면 가장 가까운 편의시설은 (0, 1)으로 거리는 $\frac{2\sqrt{2}}{3}$이고, 가장 먼 편의시설은 (-4, 1) 혹은 (4, -3)으..

chinpa.tistory.com

기억해야할 것

  • 문제 접근
    • 세 점이 만드는 가장 짧은 거리를 찾아야 함 (가장 가까운 거리 + 가장 먼 거리)
    • 두 점을 겹쳐 가장 가까운 거리를 0으로 만듦
    • 두 점의 길이가 가장 짧은 거리를 찾기
    • 즉, 세 점이 만드는 가장 짧은 거리는 직선

 

'코딩테스트' 카테고리의 다른 글

[백준][구현] 큐빙  (0) 2022.02.17
[백준][구현] 낚시왕  (0) 2022.02.17
[백준][브루트포스] 캐슬 디펜스  (0) 2022.02.15
[백준][그리디] 단어 수학  (0) 2022.02.10
[백준][BFS] MooTube (Silver)  (0) 2022.02.08