728x90
📌 풀이 1 : 브루트 포스
하나하나 다 때려 박아 비교하는 브루트 포스 방법이나
매우 널리 알려진 방법이나 시간이 매우 오래 걸린다.
리트코드 기준 4836 ms의 시간이 걸렸다.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
2중 for문으로 하나하나 비교하여 target과 같아지는 순간 인덱스들을 출력하면 된다.
📌 풀이 2 : 파이썬 내장 함수 in 사용
파이썬 내장함수 in을 사용하는 방법이다.
파이썬의 in함수는 시간 복잡도가 O(N)이다. 그래서 위의 브루트 포스보다 훨씬 시간이 단축됨을 확인할 수 있었다.
리트코드 기준 847 ms의 시간이 걸렸다.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i,n in enumerate(nums):
rest = target - n
if rest in nums[i+1:]:
return[nums.index(n), nums[i+1:].index(rest) + (i+1)]
enumerate를 사용해 nums의 index와 값을 출력해주고 target - n을 lest로 지정해줘 현재 비교하는 i번째 원소 이후에 lest가 있다면(여기서 파이썬 내장 함수 in을 사용)
n의 인덱스와 해당 lest의 인덱스를 출력해주는 것이다
풀이 3 해시 테이블 사용
해시 테이블 즉 파이썬에서는 딕셔너리를 사용하는 방법이다.
여기서 key와 value를 바꾸어서 새로운 딕셔너리에 저장한다는 발상을 하기 어려운데 이것만 생각해 낸다면 매우 빠른 시간 복잡도로 풀어낼 수 있다.
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
nums_map = {}
for i, num in enumerate(nums):
nums_map[num] = i
for i, num in enumerate(nums):
if target - num in nums_map and i != nums_map[target-num]:
return[i, nums_map[target-num]]
🚫 조심할 점
여기서 하나 조심해야 할 점은 만약 nums가 [3, 3] 이고 target = 6 이런 식으로 3 + 3 = 6이 가능한 경우이다.
이럴 경우 i != nums_map [target-num]이라는 조건이 없다면 [0, 0]이 출력된다.
num이 이미 3으로 사용되었는데 target-num in nums_map이 3을 또 찾아내 갖은 인덱스를 두번 출력하는 것이다.
이를 조심하도록 하자
'Algorithm' 카테고리의 다른 글
백준 알고리즘 파이썬(Python) 14719번 빗물 (0) | 2021.09.25 |
---|---|
백준 알고리즘 파이썬(Python) 10773번 제로 (0) | 2021.09.17 |
백준 알고리즘 파이썬(Python) 1764번 듣보잡 (0) | 2021.09.15 |
백준 알고리즘 파이썬(Python) 1316번 그룹 단어 체커 (0) | 2021.09.13 |
리트코드(LeetCode) 5번 가장 긴 팬린드롬 부분 문자열(Longest Palindromic Substring) (0) | 2021.09.13 |