문제
직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 반환하는 solution 함수를 완성해 주세요. 단, 직사각형의 각 변은 x축, 혹은 y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다.
입출력 예 #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 collectionsanswer =for i in :y =return answer# 테스트 코드v =v2 =print()print()
착안점
zip(*v)
zip함수는 같은 위치에 있는 인자들을 모아서(zip) 튜플 형태로 반환한다.
*
는 sequence/collection을 언팩(unpack) 하는 기능이 있다.
for i in :print(i)>>> 출력결과(,)(,)(,)(,)(,)(,)for i in :print(i)>>> 출력결과(1, 3, 3)(4, 4, 10)(1, 2, 1)(1, 2, 2)zip으로 언팩한 결과에서 중복되지 않은 값들이 좌표값이 된다.
값이 중복되지 않는 값이 직사각형을 그리는 데 필요한 x, y값이다.
튜플에서 중복되는 값이 무엇인지 찾아야 할 필요가 있었다.
'python find duplication num in list' 구글링을 했다.
이 stackoverflow 글이 도움되었다.
collecdtions 함수의 활용법에 대해 배웠다.
위 풀이를 통해서 값이 한 번만 출력되는 값을 찾았다.
Counter
for i in :y =print(y)v =v2 =
v와 v2를 출력해보면 아래와 같은 결과를 돌려준다.
중복되는 값은 2로 표현될 것이고, 중복되지 않는 값은 1로 value값을 가진다.
# value가 1인 y[i](key값)를 찾는다.
extend
vsappend
y는 튜플의 값을 반환하지만, 리스트([])로 감싸줘서 리스트 타입으로 바꿨다.
그다음 extend를 통해서 좌표값을 넣어줬다. append는 리스트 자체를 넣어버리기 때문에 주의해야 한다.
>>>출력결과>>>출력결과
새롭게 배운 것
collections
는 내장 컨테이너 set, list, dict, tuple
의 한계점을 극복하기 위한 특수 컨테이너 타입이다. 본 알고리즘에서 사용한 Container는 Counter
였다.
Counter
클래스는 hashable한 객체를 계산하기 위한 dict의 서브클래스이다.
'프로그래밍 > 코드분석' 카테고리의 다른 글
[파이썬] level3 시저암호 (0) | 2017.09.03 |
---|---|
[파이썬] level3 야근지수 (0) | 2017.08.30 |
[파이썬] 다음 큰 숫자(next big number) (0) | 2017.06.10 |
[파이썬] 팰린드롬(palindrome) 문제 (0) | 2017.02.16 |
소수(Prime Number) 판단 문제 (0) | 2017.01.29 |