Kim Seon Deok

[백준] 17371 이사 본문

python/Algorithm

[백준] 17371 이사

seondeok 2022. 2. 1. 14:08

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

"가장 가까운 편의시설까지의 거리와 가장 먼 편의시설까지의 거리의 평균이 최소가 되는 좌표로 이사하려고 한다. "

가장가까운 편의시설까지의 거리 = 0 이어도 된다. 즉 편의시설에 집이 위치해도 되는 것이다.

그러면 가장 먼 편의시설까지의 거리가 최소가 되어야 한다.

따라서 각 좌표를 기준으로 하여 가장 긴 길이를 구하고, 긴 길이들 중 가장 짧은 길이를 구하면 된다.

 

<시간초과가 난 코드>

1.입력받을 좌표의 갯수 n

2.n번의 경우만큼 좌표를 입력받아 location리스트에 추가

3. 두 좌표의 길이를 구하는 함수length

4.(a,b)(a,c)(a,d)(a,e) // (b,a)(b,c)(b,d)(b,e) // (c,a)(c,b)(c,d)(c,e)// (d,a)(d,b)(d,c)(d,e) // (e,a)(e,b)(e,c)(e,d)

 n개의 좌표를 각각 기준점으로 해 길이를 n-1개씩 구해 distance리스트에 저장 

5. distance리스트 내 n 개의 리스트 중 가장 긴 길이를 구해 max_d리스트에 저장

6. max_d에서 가장 짧은 리스트의 원소를 찾아 출력

 

시간초과가 난 코드

import math
import sys


n = int(sys.stdin.readline())  #편의시설 갯수

location = []  # 편의시설의 위치를 n개 저장할 리스트
for i in range(n):
    a = list(map(int,input().split()))
    location.append(a)
# print(location)


def length(x,y,z,w):
    p = (x-z)**2 + (y - w) **2
    ans = math.sqrt(p)
    return ans

distance=[]
for i in range(n):
    b = []
    for j in range(n):
        if j != i:
            p = length(location[i][0],location[i][1],location[j][0],location[j][1])
            b.append(p)
    distance.append(b)
# print(distance)
# print(len(distance))

max_d = []
for i in range(n):
    for j in range (len(distance[i])):
        d = max(distance[i])
    max_d.append(d)
# print(max_d)


tt = []
for k in range(n):
    if (max_d[k]) == min(max_d):
        t = k
        tt.append(t)
        
kk = tt[0]
print(location[kk][0],location[kk][1])

리스트에 값들을 저장하는 경우 시간 복잡도가 매우 크기 때문에 시간초과가 난 것 같다. 

문제를 잘 읽어보면 1 < n <= 1000  이며  x y(-104  x, y ≤ 104) 이다.

따라서 가장 긴 길이가 될 수 있는 (10000,10000)와(-10000,-10000) 사이 거리를 변수best_length로 지정해주고 

맨 처음 가장 긴 길이 max_d를 0으로 지정 이때 max_d가 존재하는 인덱스를 max_d_l로 지정

입력한 좌표들을 2개씩 길이를 순서대로 길이를 구하면서 max_d를 갱신max_d< best_length인 경우 best_length를 max_d로 갱신이때 max_d의 위치를 통해 결과를 출력 

성공한 코드

import math
import sys


n = int(sys.stdin.readline())  #편의시설 갯수

location = []  # 편의시설의 위치를 n개 저장할 리스트
for i in range(n):
    a = list(map(int,input().split()))
    location.append(a)
# print(location)


def length(x,y,z,w):
    p = (x-z)**2 + (y - w) **2
    ans = math.sqrt(p)
    return ans


best_length = length(10000,10000,-10000,-10000)
min_d_l = 0
for i in range(n):
    max_d = 0
    max_d_l = 0
    for j in range(n):
        d = length(location[i][0],location[i][1],location[j][0],location[j][1])
        if max_d <  d:
            max_d = d
            max_d_l = i
    if max_d < best_length:
        best_length = max_d
        min_d_l = max_d_l

print(location[min_d_l][0],location[min_d_l][1])

'python > Algorithm' 카테고리의 다른 글

[백준] 1034 램프  (0) 2022.02.06
[백준] 1309 동물원  (0) 2022.02.01
[백준] 5397 키로거  (0) 2022.01.31
[백준] 1759 암호만들기  (0) 2022.01.29
[백준] 2503 숫자 야구  (0) 2022.01.28
Comments