링크 : https://leetcode.com/problems/valid-boomerang/
Python을 오랜만에 하려니까 기억이 안난다.. JS로 돌리기도 애매하고 ㅠㅠ… 으악
description
A boomerang is a set of 3 points that are all distinct and not in a straight line. Given a list of three points in the plane, return whether these points are a boomerang.
Example:
Input: [[1,1],[2,3],[3,2]]
Output: true
Example 2:
Input: [[1,1],[2,2],[3,3]]
Output: false
Note
- points.length == 3
- points[i].length == 2
- 0 <= points[i][j] <= 100
작성한 코드
class Solution:
def isBoomerang(self, points: List[List[int]]) -> bool:
tuplePoints = list(set(map(tuple, points)))
xPoints = list(set(list(zip(*points))[0]))
yPoints = list(set(list(zip(*points))[1]))
if len(list(tuplePoints)) != 3 or len(xPoints) == 1 or len(yPoints) == 1 : return False
if len(xPoints) == 2 or len(yPoints) == 2 : return True
slope1 = (points[1][1] - points[0][1]) / (points[1][0] - points[0][0])
slope2 = (points[2][1] - points[1][1]) / (points[2][0] - points[1][0])
return False if slope1 == slope2 else True
설명
일단 중복되는 좌표가 있는지 확인하기 위해 Set의 개수를 확인한다. 개수가 3이 아니라면 최소 1개는 중복되므로 False를 리턴한다. X좌표, Y좌표의 set을 구한 후 개수를 비교해서 1이면 False 리턴, 2면 무조건 True를 리턴한다. 이후 점들의 기울기를 비교해서 삼항연산자?로 bool 값을 리턴한다.
알게 된 점
Python에서 2차원 배열의 유니크한 원소의 개수를 알기위해 List -> Set으로 바로 할 수 없다.
python TypeError: 'set' object is not subscriptable
이라는 에러가 발생한다.
그래서 내가 선택한 방법은 리스트를 튜플로 변환하고, 튜플을 Set으로 변환한 다음 다시 리스트로 변환한다. 이 과정에서 괄호가 굉장히 헷갈려서 에러가 많이 났다 🤪
Python 2차원 배열 특정 열을 가져오기!
참고 : https://emilkwak.github.io/python-2d-list-certain-column
b = list(zip(*a))[0] print(b) # (0, 2, 4, 6, 8)
이것도 괄호를 주의해야 한다.