[시작]
참여 기간 : 2025/03/31 ~ 2025/04/28
참여 난이도 : 파이썬 / 비기너
본 글에서 다룬 문제 : leetcode(349. Intersection of Two Arrays)
벌써 끝나가서 아쉽다... 특강도 끝이라니
다음에 참가할 땐 미들러의 실력을 갖춰서 돌아오겠다.
비기너분들 발표와 TIL을 봤는데 같은 비기너가 아니었음.
나는 비기너 아래 아이언 티어 만들어서 거기 들어가야 한다....
[오늘의 문제]
[문제 해석]
두 정수 배열 num1과 num2가 주어지는데, 두 배열에 모두 등장하는 교집합 원소들을 모아 배열로 반환해라고 한다.
결과 배열에는 중복 없이 한 번씩만 포함해야 하고
순서는 상관없으니 아무 순서로 반환해도 된다라고 되어있다.
보자마자 어떻게 풀어야 할지 생각나서 딱히 구현에 고민을 하지 않아도 될 듯
바로 코드를 작성해서 돌려보겠다.
[구현]
보자마자 어떻게 풀어야 할지 생각나서 딱히 구현에 고민을 하지 않아도 될 듯
바로 코드를 작성해서 돌려보겠다.
[코드]
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
return list(set(nums1) & set(nums2))
먼저 set(nums1), set(nums2)를 통해 각 리스트의 중복된 원소를 한 번에 제거해서 집합(set)으로 만든다.
그다음 & 연산자를 사용해 두 집합의 교집합만 뽑아낸다.
A에도 있고 B에도 있는 원소들만 뽑아서 새 집합으로 만들기 때문에
문제에서 요구하는 unique(공통된) 원소만 아주 깔끔하게 뽑을 수 있다.
마지막으로 list()를 이용해서 집합 안에 들어 있는 값들을 리스트로 변환한다.
문제에서는 순서 상관없다고 했으니 그대로 반환하면 끝!
[제출 결과]
O(n+m)
[다른 접근 방법]
이분탐색으로 문제를 푼다면 코드는 다음과 같다.
from bisect import bisect_left
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
nums2.sort()
seen, res = set(), []
for x in nums1: # nums1을 한 번 순회
if x in seen: # 중복 검사해야겠지?
continue
seen.add(x)
i = bisect_left(nums2, x) # nums2에서 x가 들어갈 위치 탐색함
if i < len(nums2) and nums2[i] == x:
res.append(x) # 값이 일치하면 교집합에 추가함
return res
O(mlogm+nlogm)
[회고]
사실 이분 탐색으로 풀어라는 강제적인 조건(예를 들면 시간복잡도가 이 정도 나와야 한다)이 있었으면
바로 이분탐색을 시도했을 텐데, 쉽게 쉽게 풀고 싶어서 시도했더니 풀렸다.
사실 이분탐색으로 풀어야 하는 문제였다 ㅎㅎ; (머쓱)
어쩐지 오늘 보너스 문제가 이분탐색 문제를 주시더니...
오늘의 문제를 풀지 않은 상태로 보너스 문제로 이분탐색을 먼저 접해버려서 뭐가 이상하다 생각했다.
암튼 이분탐색으로도 잘 풀었음
'스파르타 코딩클럽 > 99클럽 코딩테스트 스터디 6기' 카테고리의 다른 글
99클럽 코테 스터디 18일차 TIL [04/23] (0) | 2025.04.23 |
---|---|
99클럽 코테 스터디 17일차 TIL [04/22] (0) | 2025.04.22 |
99클럽 코테 스터디 15일차 TIL [04/18] (1) | 2025.04.18 |
99클럽 코테 스터디 14일차 TIL [04/17] (0) | 2025.04.17 |
99클럽 코테 스터디 13일차 TIL [04/16] (0) | 2025.04.16 |