⚙️ Problem Solving/Algorithm - Python

[LeetCode | Python] 1. Two Sum

yesolz 2024. 11. 6. 01:10
728x90

 

내 풀이: 브루트포스

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        
        result = set()

        for i in range(len(nums)):
            for j in range(len(nums)):
                if nums[i] + nums[j] == target and i != j:
                    result.add(i)
                    result.add(j)

        result = list(result)

        return sorted(result)

set에다가 추가하고 리스트로 바꾸고 sorted로 리턴했다.

 

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        
        for i in range(len(nums)):
            for j in range(len(nums)):
                if nums[i] + nums[j] == target and i != j:
                    return [i, j]

        return []

근데 그냥 바로 return [i, j]로 하고 없으면 빈 배열 리턴하는 게 더 깔끔한 듯!

시간 복잡도는 n^2이다.

 

Hash Map을 사용하면 O(n)에 풀 수 있다!

 

풀이 2: Two-Pass Hash Map

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        indices = {}  # val -> index

        for i, n in enumerate(nums):
            indices[n] = i

        for i, n in enumerate(nums):
            diff = target - n
            if diff in indices and indices[diff] != i:
                return [i, indices[diff]]

indices에는 값과 인덱스 저장

첫번째 패스에는 값과 인덱스를 딕셔너리에 저장,

두번째 패스에서는 target쌍을 찾음

 

풀이 3: One-Pass Hash Map

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        prevMap = {}  # val -> index

        for i, n in enumerate(nums):
            diff = target - n
            if diff in prevMap:
                return [prevMap[diff], i]
            prevMap[n] = i

 

target-n으로 diff(필요한 값) 계산하고 prevMap에 있는지 확인.

-> 있으면 - 그 리스트 반환

-> 없으면 - 현재 숫자와 인덱스를 prevMap에 저장하고 다음 숫자로 넘어감

 

728x90