일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 | 29 | 30 | 31 |
- SQL 정리
- 프로그래머스
- 이클립스
- 백준
- 문법
- 프로그래밍
- SQL 문법
- 빅데이터
- 스프링부트
- 자바
- 토이프로젝트
- 모의해킹
- 오라클
- 엘라스틱서치
- c언어
- 파이썬
- MySQL
- 데이터베이스
- SQL
- 스파크
- 기초
- 스프링
- 데이터프로그래밍
- 코딩테스트
- 문제풀이
- 해킹실습
- 리눅스마스터 2급 2차
- 필기
- 알고리즘
- 위클리챌린지
- Today
- Total
개발일기
백준 1064번 파이썬 풀이 : 평행사변형 본문
문제 링크 : 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 |
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
백준 1094번 파이썬 풀이 : 막대기 (0) | 2021.10.07 |
---|---|
백준 1145번 파이썬 풀이 : 적어도 대부분의 배수 (0) | 2021.10.06 |
백준 2511번 파이썬 풀이 : 카드놀이 (0) | 2021.10.04 |
백준 2476번 파이썬 풀이 : 주사위 게임 (0) | 2021.10.04 |
백준 2355번 파이썬 문제 풀이 : 시그마 (0) | 2021.10.04 |