-
BOJ 1064 - 평행사변형코딩테스트 2023. 3. 19. 20:48
https://www.acmicpc.net/problem/1064
약간의 삽질을 했지만 열심히 풀었던 문제입니다. 왠지 그러고 싶어서 모듈화를 열심히 해서 풀어봤어요.
def get_input(): plist = list(map(int, input().split())) A = [plist[0], plist[1]] B = [plist[2], plist[3]] C = [plist[4], plist[5]] points = [A, B, C] return points def get_slope(p1, p2): if p2[0] - p1[0] == 0: slope = "inf" return slope else: slope = (p2[1] - p1[1]) / (p2[0]-p1[0]) return slope def check(AB, BC): if AB == BC: okay = False return okay else: okay = True return okay def get_length(p1, p2): length = ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)**(1/2) return length def get_circum(p1, p2, p3): side1 = get_length(p1, p2) side2 = get_length(p2, p3) side3 = get_length(p1, p3) cir1 = 2 * (side2 + side3) cir2 = 2 * (side1 + side3) cir3 = 2 * (side1 + side2) cir_list = [cir1, cir2, cir3] cir_list.sort() max = cir_list[2] min = cir_list[0] return max, min def solution(): plist = get_input() AB = get_slope(plist[0], plist[1]) BC = get_slope(plist[1], plist[2]) okay = check(AB, BC) if okay == False: return -1 maxcir, mincir = get_circum(plist[0], plist[1], plist[2]) gap = maxcir - mincir return gap answer = solution() if answer == -1: print(answer) else: print(answer)
처음에 평행사변형을 그릴 수 없는 조건부터 찾아내기 위해 check함수를 도입했습니다. 세 점이 일직선상에 있으면 점 D를 어디에 찍어도 평행사변형이 생기지 않습니다. 그래서 기울기를 이용해 세 점이 한 직선 위에 있는지 검사했습니다. 더 쉬운 방법이 있을 것 같기도 하네요.
이후에 제가 했던 삽질은 바로 점 D의 위치를 찾는 것이었습니다. 점 D는 총 6개의 다른 위치에 찍힐 수 있는데요, 그 모든 D의 좌표를 구한 다음 둘레의 길이를 따로따로 구하려고(...) 했습니다.
문제에서 요구하는 것은 단순히 평행사변형의 둘레이기 때문에, 점 D의 정확한 좌표를 구할 필요가 없었습니다. 또한 평행사변형의 둘레의 길이는 점 A, B, C로 만들 수 있는 삼각형에서 두 변을 골라서 길이를 합한 후 2를 곱해주면 간단하게 나옵니다. 이를 이용해서 get_circum함수를 구현해주었구요. 가장 큰 것과 가장 작은 것을 리턴했습니다.
실행하는 부분에서는 세 점이 일직선상에 있지 않은지 체크를 해보고 일직선상에 있으면 -1을, 그렇지 않으면 평행사변형 둘레의 길이 최댓값과 최솟값의 차이를 출력하도록 간단하게 구현하였습니다.
'코딩테스트' 카테고리의 다른 글
BOJ 9095 1,2,3 더하기 python (0) 2024.04.16 BOJ 1463 1로 만들기 python (0) 2024.04.15 BOJ 1874 - 스택 수열 (0) 2023.03.19 숫자 문자열과 영단어 (0) 2023.03.11 옹알이(1) (0) 2023.03.11