ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.