백준 문제풀이

[백준 3009번 문제] 네 번째 점

eunda_coding 2022. 8. 11. 20:46

이 문제는 좌표 3개의 값을 입력받은 후에 직사각형이 되기 위한 조건을 만족하는 나머지 한 점의 좌표를 구하는 문제이다.

처음에 이 문제를 보고 직사각형 네 점이 항상 만족하는 조건이 무엇인지 생각하고 어떻게 풀어나가야 할 지 고민했었다.

 

직사각형 4개의 좌표에서 x좌표와 y좌표는 같은 값을 두개씩 가져야 하는 공통점을 발견했다.

예를 들어, 예제 입력 1에서는 (5,5), (5,7), (7,5) 가 입력되었는데 x좌표에서 5는 두개이지만 7은 한번 입력되었으므로 나머지 하나 x좌표는 반드시 7이여야한다. 그리고 y좌표에서도 5는 두개이지만 7은 한번 입력되었으므로 나머지 하나 y좌표는 반드시 7이여야한다는 점이다.

 (5,5), (5,7), (7,5) --> (7,7) 이러한 결론이 나오는 것이다.

 

step1. x좌표와 y좌표를 담을 리스트를 생성해서 입력받은 값들을 각각의 좌표 리스트에 추가해주었다.

x = []
y = []

for i in range(3):
    a, b = map(int, input().split())
    x.append(a)
    y.append(b)

각 x와 y리스트에 이렇게 값이 저장된다.

[5, 5, 7]
[5, 7, 5]

 

step2. 파이썬의 collections 모듈의 Counter 클래스를 이용해서 각 리스트에 담긴 값들의 빈도수를 계산하였다.

그래서 빈도수가 1인 값을 출력해 주는 방식으로 구현하였다.

cnt_x = Counter(x).most_common()
cnt_y = Counter(y).most_common()

Counter클래스의 most_common메소드를 이용해서 cnt_x, cnt_y의 변수에 각 값들의 빈도수를 저장해주었다.

[(5, 2), (7, 1)]
[(5, 2), (7, 1)]

결과값을 보면 5는 2번 7은 1번 입력되었다는 결과가 나온다.

 

step3. 조건문을 통해 빈도수 값이 1이면 출력해주도록 하였다.

if cnt_x[1][1] == 1:
    print(cnt_x[1][0], end=' ')
if cnt_y[1][1] == 1:
    print(cnt_y[1][0])

각좌표의 값은 2개 밖에 없으므로 [1][1]에 담긴 수가 1이면 빈도수 1에 해당하는 숫자를 출력해주도록 하였다.

 

<전체코드>

import sys
from collections import Counter

input = sys.stdin.readline

x = []
y = []

for i in range(3):
    a, b = map(int, input().split())
    x.append(a)
    y.append(b)

cnt_x = Counter(x).most_common()
cnt_y = Counter(y).most_common()

if cnt_x[1][1] == 1:
    print(cnt_x[1][0], end=' ')
if cnt_y[1][1] == 1:
    print(cnt_y[1][0])