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개로 계산하여 쉽게 풀었음.
아이디어가 없었던 것은 아니지만 , 배열에 중복된 값이 여러개 들어갈 수 있다는 개념을 몰라 적용하지 못하였음.
'CS > 알고리즘' 카테고리의 다른 글
백준 3053번 택시 기하학 파이썬 풀이 (0) | 2022.02.06 |
---|---|
백준 4153번 직각삼각형 파이썬 풀이 (0) | 2022.02.06 |
백준 1085 직사각형에서 탈출 파이썬 풀이 (0) | 2022.02.02 |
백준 9020번 골드바흐의 추측 파이썬 풀이 (0) | 2022.02.02 |
백준 4948 베르트랑 공준 파이썬 풀이 (0) | 2022.01.29 |