민규의 흔적

[Python 파이썬]백준 3009번 - 네 번째 점 본문

BOJ

[Python 파이썬]백준 3009번 - 네 번째 점

민규링 2023. 6. 6. 19:19

2023년 6월 6일

문제 링크 : 3009번 - 네 번째 점

문제

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

입력

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

출력

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

알고리즘 분류

  • 구현
  • 기하학

문제 접근

대각선의 길이를 이용해 문제를 푸는 방법을 생각했으나, 더 간단히 접근하기로 했다.

좌표 3개가 주어지고, 각 좌표들은 x,y 값의 한 쌍으로 이루어져 있다.

직사각형을 이루는 네 개의 점 중에서, 세 점이 주어졌다면, 나머지 한 점은 어떻게 찾을 수 있을까?

바로 주어진 x,y 각각의 좌표 값 중, 1번만 주어진 좌표끼리 한 쌍으로 묶으면 해당 좌표값이 '네 번째 점'이다.


순서도

1. 입력받은 좌표 데이터를 x,y 데이터로 분리한다.
	1.1 x,y 데이터의 좌표와, 해당 좌표가 주어진 횟수를 Dictionary 형태로 분리한다.

2. x,y 각각 호출된 횟수가 1개인 데이터의 좌표를 (x,y) 쌍으로 출력하면, 해당 좌표값이 '네 번째 점'이다.

 


입력 예제

30 20
10 10
10 20

<주어진 데이터를 좌표 상에 그려보면 다음과 같다>

우리는 빨간색으로 동그라미 친 '네 번째 점'을 구해야 한다.

그림으로 보면 쉽게 'x가 30이고 y가 10인 좌표 값이 정답이겠구나' 하겠지만, 코드로 구현하려면 중간 단계를 명확히 제시해야 한다.

구해야 하는 값이 가지고 있는 특징은 무엇일까? 구해야 하는 '네 번째 점'의 x,y 좌표는 입력된 세 점의 좌표값들의 x,y 값들 중, 한 번만 제시되었다는 점이다. 이 특징은 직사각형이기에 생기는 특징이다.

가로의 길이가 20, 세로의 길이가 10인 직사각형에서, 시작점을 (a , b)라고 지정한다면, 네 점의 좌표는 다음과 같다.

  • (a , b)
  • (a + 20 , b)
  • (a , b + 10)
  • (a + 20 , b + 10)

이제 x,y 좌표 각각을 분석해보자. x 좌표에서 a가 2개, a + 20이 2개 존재하고, y 좌표에서는 b가 2개, b + 10이  2개 존재한다. 만약 점 (a , b + 10) 이 주어지지 않고 구해야 하는 '네 번째 점' 이라면, 입력값주어진 세 점은 다음과 같을 것이다.

  • (a , b)
  • (a + 20 , b)
  • (a + 20 , b + 10)

위 처럼 x,y 좌표를 분석해보면 x 좌표에서 a가 1개, a + 20이 2개 존재하고, y 좌표에서는 b가 2개, b + 10이 1개 존재한다. 유실된 좌표 즉, 1개만 존재하는 좌표끼리 한 쌍으로 묶으면 해당 점이 '네 번째 점'이 되는 것이다.

  • 네 번째 점 : (a , b + 10)

위의 입력 예제로 돌아와 다시 로직을 수행해보자.

주어진 세 점들을 나열해보면 다음과 같다.

  • (10 , 10)
  • (10 , 20)
  • (30 , 20)

x 좌표에서 10은 2개, 30은 1개 존재하고, y 좌표에서 10은 1개, 20은 2개 존재한다.

1개씩 존재하는 좌표들을 한 쌍으로 묶으면? (30 , 10)이 정답이 되는 것이다.

출력 예제

30 10

주의할 점

  • 음.. 나는 딕셔너리를 활용했는데, 딕셔너리를 잘 모른다면 이 기회에 알아가면 좋으니 공부해보길 추천한다.

전체 코드

# 3009

x = {}
y = {}
for _ in range(3):
    _x, _y = map(int,input().split())
    if _x in x:
        x[_x] += 1
    else:
        x[_x] = 1
    if _y in y:
        y[_y] += 1
    else:
        y[_y] = 1

result_x = None
result_y = None

result_x = [k for k,v in x.items() if v == 1]
result_y = [k for k,v in y.items() if v == 1]

print(result_x[0], result_y[0])

 


풀이 후기

이상하게 접근해보려다 로직이 내 마음대로 설계되지 않길래, 그냥 클래식하게 접근했다. 생각보다 시간을 많이 쓴 문제였다..