CS/알고리즘

백준 3009 네 번째 점 파이썬 풀이

happy_life 2022. 2. 5. 09:31
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 128 MB 26864 19353 17488 73.150%

문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

출력

직사각형의 네 번째 점의 좌표를 출력한다.

 

#네 번째 점
X1, Y1 = map(int,input().split())
X2, Y2 = map(int,input().split())
X3, Y3 = map(int,input().split())


#대각선

#대각선이 x1 y1  x2 y2 쌍인 경우
if((max(abs((X1-X2)**2+(Y1-Y2)**2),abs((X1-X3)**2+(Y1-Y3)**2),abs((X2-X3)**2+(Y2-Y3)**2)))==abs((X1-X2)**2+(Y1-Y2)**2)):
   #x3,y3가 좌측 하단인 경우
    if(min(X1,X2,X3)==X3 and min(Y1,Y2,Y3)==Y3):  
        print(max(X1,X2,X3),max(Y1,Y2,Y3))
    #x3,y3이 좌측 상단인 경우
    elif(min(X1,X2,X3)==X3 and max(Y1,Y2,Y3)==Y3):  
        print(max(X1,X2,X3),min(Y1,Y2,Y3))
    #x3,y3이 우측 상단인 경우
    elif(max(X1,X2,X3)==X3 and max(Y1,Y2,Y3)==Y3):  
        print(min(X1,X2,X3),min(Y1,Y2,Y3))
    #x3,y3이 우측 하단인 경우
    else:
        print(min(X1,X2,X3),max(Y1,Y2,Y3))
    
    
#대각선이 x1 y1  x3 y3 쌍인 경우     
elif((max(abs((X1-X2)**2+(Y1-Y2)**2),abs((X1-X3)**2+(Y1-Y3)**2),abs((X2-X3)**2+(Y2-Y3)**2)))==abs((X1-X3)**2+(Y1-Y3)**2)):
    #x2,y2가 좌측 하단인 경우
    if(min(X1,X2,X3)==X2 and min(Y1,Y2,Y3)==Y2):  
        print(max(X1,X2,X3),max(Y1,Y2,Y3))
    #x2,y2이 좌측 상단인 경우
    elif(min(X1,X2,X3)==X2 and max(Y1,Y2,Y3)==Y2):  
        print(max(X1,X2,X3),min(Y1,Y2,Y3))
    #x2,y2이 우측 상단인 경우
    elif(max(X1,X2,X3)==X2 and max(Y1,Y2,Y3)==Y2):  
        print(min(X1,X2,X3),min(Y1,Y2,Y3))
    #x2,y2이 우측 하단인 경우
    else:
        print(min(X1,X2,X3),max(Y1,Y2,Y3))
    
    
#대각선이 x2 y2  x3 y3 쌍인 경우
else:
    #x1,y1가 좌측 하단인 경우
    if(min(X1,X2,X3)==X1 and min(Y1,Y2,Y3)==Y1):  
        print(max(X1,X2,X3),max(Y1,Y2,Y3))
    #x2,y2이 좌측 상단인 경우
    elif(min(X1,X2,X3)==X1 and max(Y1,Y2,Y3)==Y1):  
        print(max(X1,X2,X3),min(Y1,Y2,Y3))
    #x2,y2이 우측 상단인 경우
    elif(max(X1,X2,X3)==X1 and max(Y1,Y2,Y3)==Y1):  
        print(min(X1,X2,X3),min(Y1,Y2,Y3))
    #x2,y2이 우측 하단인 경우
    else:
        print(min(X1,X2,X3),max(Y1,Y2,Y3))

 

 

idea 

 

점과 점사이의 거리를 구하는 공식 활용 

 

 

대각선을 구성하는 case 3가지

 

1) 대각선이 (x1,y1) , (x2,y2)인 경우

if((max(abs((X1-X2)**2+(Y1-Y2)**2),abs((X1-X3)**2+(Y1-Y3)**2),abs((X2-X3)**2+(Y2-Y3)**2)))==abs((X1-X2)**2+(Y1-Y2)**2)):

대각선 공식을 통해 케이스 분류한 코드임 

 

2) 대각선이 (x1,y1) , (x3,y3)인 경우

3) 대각선이 (x2,y2) , (x3,y3)인 경우

 

예를 들어 대각선이 x1 y1    x2 y2 쌍인 경우

x3,y3 이 위치할 수 있는 case 는 총 4개이고 우리가 구하고자 하는 x4,y4 는 x3,y3의 대각선에 위치함 

 

 

이 아이디어에 착안하여 각각의 case를 4가지로 분류하여 그에 따른 위치를 계산하는 코드를 작성하였음.

   #x3,y3가 좌측 하단인 경우
    if(min(X1,X2,X3)==X3 and min(Y1,Y2,Y3)==Y3):  
        print(max(X1,X2,X3),max(Y1,Y2,Y3))
    #x3,y3이 좌측 상단인 경우
    elif(min(X1,X2,X3)==X3 and max(Y1,Y2,Y3)==Y3):  
        print(max(X1,X2,X3),min(Y1,Y2,Y3))
    #x3,y3이 우측 상단인 경우
    elif(max(X1,X2,X3)==X3 and max(Y1,Y2,Y3)==Y3):  
        print(min(X1,X2,X3),min(Y1,Y2,Y3))
    #x3,y3이 우측 하단인 경우
    else:
        print(min(X1,X2,X3),max(Y1,Y2,Y3))

예를 들어, x3,y3이 좌측 하단인 경우 x4,y4는 오른쪽 상단(x최대,y최대)인 경우이므로 min max 를 활용하여 값을 구해주었음.

 

 

처음에 예외를 고민하다가 아래와 같은 모양의 직사각형이 떠올라 어떻게 코드를 작성하여야하나 고민하던 와중 

"축에 평행한 직사각형" 이라는 조건을 보고 제외하고 빠르게 답을 낼 수 있었음.

 

 

 

 

 

다른 풀이와의 비교

x_ = []
y_ = []
for i in range(3):
        x, y = map(int, input().split())
        x_.append(x)
        y_.append(y)
for i in range(3):
        if x_.count(x_[i]) == 1:
                x = x_[i]
        if y_.count(y_[i]) == 1:
                y = y_[i]
print(x, y)

나는 대각선을 기준으로 하였는데, 다른 사람들은 꼭지점의 개수 1,2개로 계산하여 쉽게 풀었음.

 

아이디어가 없었던 것은 아니지만 , 배열에 중복된 값이 여러개 들어갈 수 있다는 개념을 몰라 적용하지 못하였음.