규도자 개발 블로그

[프로그래머스/연습문제/파이썬3(python3)] 직사각형 만들기 본문

알고리즘/풀이

[프로그래머스/연습문제/파이썬3(python3)] 직사각형 만들기

규도자 (gyudoza) 2019. 9. 26. 00:32

[프로그래머스/연습문제/파이썬3(python3)] 직사각형 만들기

문제

직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하려고 합니다. 점 3개의 좌표가 들어있는 배열 v가 매개변수로 주어질 때, 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 return 하도록 solution 함수를 완성해주세요. 단, 직사각형의 각 변은 x축, y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다.

제한사항

  • v는 세 점의 좌표가 들어있는 2차원 배열입니다.
  • v의 각 원소는 점의 좌표를 나타내며, 좌표는 [x축 좌표, y축 좌표] 순으로 주어집니다.
  • 좌표값은 1 이상 10억 이하의 자연수입니다.
  • 직사각형을 만드는 데 필요한 나머지 한 점의 좌표를 [x축 좌표, y축 좌표] 순으로 담아 return 해주세요.

입출력 예

입력출력
[[1, 4], [3, 4], [3, 10]][1, 10]
[[1, 1], [2, 2], [1, 2]][2, 1]

입출력 예 설명

입출력 예 #1

세 점이 [1, 4], [3, 4], [3, 10] 위치에 있을 때, [1, 10]에 점이 위치하면 직사각형이 됩니다.

입출력 예 #2

세 점이 [1, 1], [2, 2], [1, 2] 위치에 있을 때, [2, 1]에 점이 위치하면 직사각형이 됩니다.

풀이

def solution(v):
    answer = []
    first_stack = []
    second_stack = []
    for i in range(len(v)):
        if v[i][0] not in first_stack:
            first_stack.append(v[i][0])
        else:
            first_stack.remove(v[i][0])
        if v[i][1] not in second_stack:
            second_stack.append(v[i][1])
        else:
            second_stack.remove(v[i][1])        
    answer.append(*first_stack)
    answer.append(*second_stack)
    return answer

설명

인접행렬을 써야 하나, 2차원배열을 만들어서 도형을 만들어야 하나 어떻게 해야하나 고민하다가 간단한 법칙을 발견하였다. 두 개의 좌표가 만나 꼭지점을 만드는데 결국 이 네 개의 꼭지점을 좌표로 정리해보면 두 개의 선분이 만나 꼭지점을 이루기 때문에 결국 두 개, 아니면 네 개의 숫자가 와야한다. 만약 세개면 뚜껑열린 사각형(이러면 사각형이 애초에 아니지면)이 되니까 말이다.

 사실 스택도 아니고 뭣도 아니지만 내가 편하게 인식하기 위해 변수를 명명하였다. 세련된 방법은 아니다 그냥 무아지경으로 풀었던 지라... 해당 문제를 복사해서 구글에 검색해보면 보다 세련되고 간단한 방법으로 푼 예제들이 많으니 참고하면 되겠다!

Comments