개발일기

백준 1064번 파이썬 풀이 : 평행사변형 본문

알고리즘 문제풀이/백준

백준 1064번 파이썬 풀이 : 평행사변형

한민기 2021. 10. 6. 22:53
반응형

문제 링크 : https://www.acmicpc.net/problem/1064

 

1064번: 평행사변형

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC) 이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나

www.acmicpc.net

문제

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC)

이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나올 수도 있다.

만들어진 모든 사각형 중 가장 큰 둘레 길이와 가장 작은 둘레 길이의 차이를 출력하는 프로그램을 작성하시오. 만약 만들 수 있는 평행사변형이 없다면 -1을 출력한다.

입력

첫째 줄에 xA yA xB yB xC yC가 주어진다. 모두 절댓값이 5000보다 작거나 같은 정수이다.

출력

첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.

 

 

# 문제 링크

각각 변AB, 변BC, 변AC 의 길이를 구한 후 가장 긴 변과 가장 짧은 변의 차 * 2를 해주면 결과값이 나오게 된다.

 

가장 큰 둘레를 가진 평행 사변형의 둘레는 위의 변 3개에서 긴 2개를 뽑으면 되고 이 변 2개를 a, b 라고 가정한다.

그리고 가장 작은 둘레의 평행 사변형 둘레는 위의 변 3개에서 작은 2개를 뽑으면 된다. b, c라고 가정한다.

 

그럼 큰 평행사변형의 둘레는 a + a + b + b, 작은 평행사변형의 둘레는 b + b + c + c가 되며 두 평행사변형의 차이는 a + a - c - c 가 된다. 따라서 (a - c) * 2가 되게 된다.

 

1
2
3
4
5
6
if isTrue:
    ab = calc_line(x_a - x_b, y_a - y_b)
    ac = calc_line(x_a - x_c, y_a - y_c)
    bc = calc_line(x_b - x_c, y_b - y_c)
 
    print((max(ab, ac, bc) - min(ab, ac, bc)) * 2)
cs

 

하지만 예제에서 입력되는 3개의 점이 한개의 직선상에 있다라고 가정하게 되면 평행사변형을 그릴 수 없으므로 -1을 출력해야 한다.

 

1
2
3
4
5
6
7
8
9
10
11
isTrue = True
if x_a == x_b:
    if x_b == x_c:
        print(-1.0)
        isTrue = False
    else:
        isTrue = True
 
elif y_c == (y_b - y_a) / (x_b - x_a) * (x_c - x_a) + y_a:
    print(-1.0)
    isTrue = False
cs

 

입력된 2개의 점으로 기울기를 구한 후 나머지 한점이 해당 직선에 있는지 파악을 한다.

직선 위에 있다면 isTrue 변수를 False 로 변환하여 위의 변 길이 계산을 하지 않도록 한다.

 

# 전체 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def calc_line(x, y):
    return (x ** 2 + y ** 2** 0.5
 
 
x_a, y_a, x_b, y_b, x_c, y_c = map(int, input().split())
isTrue = True
if x_a == x_b:
    if x_b == x_c:
        print(-1.0)
        isTrue = False
    else:
        isTrue = True
 
elif y_c == (y_b - y_a) / (x_b - x_a) * (x_c - x_a) + y_a:
    print(-1.0)
    isTrue = False
 
if isTrue:
    ab = calc_line(x_a - x_b, y_a - y_b)
    ac = calc_line(x_a - x_c, y_a - y_c)
    bc = calc_line(x_b - x_c, y_b - y_c)
 
    print((max(ab, ac, bc) - min(ab, ac, bc)) * 2)
cs

 

 

반응형
Comments