링크 : 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)

이것도 괄호를 주의해야 한다.