꽤 쉬운문제라고 생각하고 풀었는데 생각치 못한 부분에서 막혀서 답지를 보고 푼 문제이다.
참고로 블로그에 기록해두는 이유는 답지를 보고 풀었는데 거기서 꽤 많은 점을 배울 수 있었기 때문이다.
아래는 문제 링크이다. 꽤 간단한 문제이다.
https://leetcode.com/problems/valid-boomerang/
자 그렇다면 내가 처음 접근한 오답을 먼저 보자. (이 코드 안봐도 된다. 아예 틀리기도 했고 너무 부실하다. )
class Solution:
def isBoomerang(self, points: List[List[int]]) -> bool:
points = sorted(points)
last_point = points[-1][0]
for i in range(1, 3):
if points[i - 1] == points[i]:
return False
count1 = 0
for i in range(1, 3):
if points[i - 1][0] == points[i][0]:
count1 += 1
if count1 >=2:
return False
count2 = 0
for i in range(1, 3):
if points[i - 1][1] == points[i][1]:
count2 += 1
if count2 >=2:
return False
count = 0
for i in range(1, last_point + 1):
if points[0] == [i, i]:
count += 1
if points[1] == [i, i]:
count += 1
if count >= 2:
return False
return True
이 코드는 그냥 안봐도 된다. 틀리기도 했고 기울기를 비교해주지 않았다. 그리고 너무 길다.
아래는 정답 솔루션이다. 확실히 코드가 깔끔하다.
class Solution:
def isBoomerang(self, points: List[List[int]]) -> bool:
x_points = list(set(list(zip(*points))[0]))
y_points = list(set(list(zip(*points))[1]))
if len(set(map(tuple, points))) != 3: return False
if len(x_points) == 1: return False
if len(y_points) == 1: return False
if len(x_points) ==2 or len(y_points) == 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
지금 보면 zip을 사용할때 *points 를 사용하는 것을 볼 수 있을 것이다. 이렇게 하면 뒤에 [0]을 했을때 각 0번째 요소만 뽑아낼 수 있다. 이걸 배웠고 그리고 또 하나 배운게 더 있다. 첫번째 if 문에서 points 를 set 으로 잡아줄때 map 을 적용해서 tuple 로 만들어내는걸 볼 수 있을 거다.
그냥 set으로 바꿔버리면 안될까? 안된다.
그렇게 한다면 TypeError: unhashable list 라는 에러를 마주하게 될 거다. 즉 List[List<T>] 인 자료구조에서 내부에 List가 요소로 존재하는 리스트인데 이걸 set 으로 바꿀 순 없다는 거다. 그래서 tuple 로 바꿔준 다음에 set 으로 잡아줘야 한다.
그렇게 distinct 한 지점들이 있는지 없는지에 대한 판별을 진행한다.
그리고 두세번째 if문에서 len(x_points), len(y_points) 에 대한 if문이 존재하는것도 개수가 1인지를 체크한다. 즉 모든게 같은 지점이라면 1이 나올터이니 당연히 걸러내야 한다.
자 그리고 마지막 부분이 내가 생각지 못했던 부분이다.
slope1 과 slope2 를 계산하는 부분이 있다. 즉 기울기를 계산하는 부분이다.
이렇게 계산해서 기울기가 같다면? 대각선이라는 거다. 그러니 False 를 리턴하고 대각선이 아니라면 True 를 리턴한다.
이 코드는 상당히 짧다. 그럼에도 불구하고 많은걸 배울 수 있었다.
'Algorithm > 문제풀이' 카테고리의 다른 글
[LeetCode] LeetCode 1572 - matrix-diagonal-sum - Python3 (0) | 2022.09.08 |
---|---|
[LeetCode] LeetCoe 1337. The K Weakest Rows in a Matrix - python3 (0) | 2022.06.26 |
[LeetCode] LeetCode 961. N-Repeated Element in Size 2N Array 솔루션 (0) | 2022.06.15 |
[Leetcode] Leetcode 696 - count binary substring - python3 (0) | 2022.05.27 |
[BOJ] 백준 11060 점프점프 - 파이썬 (0) | 2022.03.25 |