본문 바로가기

프로그래밍/코드분석

[파이썬] 사각형의 나머지 한 좌표값 반환하기

rect

문제

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

스크린샷, 2017-06-10 19-24-48

입출력 예 #1
주어진 점의 좌표가 [[1, 4], [3, 4], [3, 10]] 일때, [1, 10]에 점이 위치하면 직사각형이 됩니다.

입출력 예 #2
주어진 점의 좌표가 [[1, 1], [2, 2], [1, 2]] 일때, [2, 1]에 점이 위치하면 직사각형이 됩니다.

문제 출처

SK 주식회사 C&C “Code Genius 2017” 데모테스트 문제
(https://programmers.co.kr/tryouts/3/challenge_algorithm_codes/1209)

나의 풀이

import collections
 
def solution(v):
    answer = []
    for i in zip(*v):
        y = collections.Counter(i)
        answer.extend([i for i in y if y[i] == 1])
 
    return answer
 
 
# 테스트 코드 
v = [[1, 4], [3, 4], [3, 10]]
v2 = [[1, 1], [2, 2], [1, 2]]
 
print(solution(v))
print(solution(v2))
    

착안점

  1. zip(*v)

    • zip함수는 같은 위치에 있는 인자들을 모아서(zip) 튜플 형태로 반환한다.

    • *는 sequence/collection을 언팩(unpack) 하는 기능이 있다.

    for i in zip(v):
      print(i)
     
    >>> 출력결과
    ([1, 4],)
    ([3, 4],)
    ([3, 10],)
    ([1, 1],)
    ([2, 2],)
    ([1, 2],)
     
    for i in zip(*v):
      print(i)
     
    >>> 출력결과
    (133)
    (4410)
    (121)
    (122)
  2. zip으로 언팩한 결과에서 중복되지 않은 값들이 좌표값이 된다.

    • 값이 중복되지 않는 값이 직사각형을 그리는 데 필요한 x, y값이다.

    • 튜플에서 중복되는 값이 무엇인지 찾아야 할 필요가 있었다.

  3. 'python find duplication num in list' 구글링을 했다.

    • stackoverflow 글이 도움되었다.

    • collecdtions 함수의 활용법에 대해 배웠다.
      스크린샷, 2017-06-10 19-11-06

    • 위 풀이를 통해서 값이 한 번만 출력되는 값을 찾았다.

  1. Counter

for i in zip(*v):
    y = collections.Counter(i)
    print(y)
    
v = [[1, 4], [3, 4], [3, 10]]
v2 = [[1, 1], [2, 2], [1, 2]]

v와 v2를 출력해보면 아래와 같은 결과를 돌려준다.
중복되는 값은 2로 표현될 것이고, 중복되지 않는 값은 1로 value값을 가진다.
스크린샷, 2017-06-10 19-17-22

answer.extend([i for i in y if y[i] == 1]) # value가 1인 y[i](key값)를 찾는다. 
  1. extend vs append
    y는 튜플의 값을 반환하지만, 리스트([])로 감싸줘서 리스트 타입으로 바꿨다.
    그다음 extend를 통해서 좌표값을 넣어줬다. append는 리스트 자체를 넣어버리기 때문에 주의해야 한다.

>>> answer.append([i for i in y if y[i] == 1])
 
출력결과 
[[1], [10]]
[[2], [1]]
 
>>> answer.extend([i for i in y if y[i] == 1])
 
출력결과
[1, 10]
[2, 1]

새롭게 배운 것

collections는 내장 컨테이너 set, list, dict, tuple의 한계점을 극복하기 위한 특수 컨테이너 타입이다. 본 알고리즘에서 사용한 Container는 Counter였다.

Counter 클래스는 hashable한 객체를 계산하기 위한 dict의 서브클래스이다.