거누의 개발노트

파이썬 알고리즘 인터뷰 - 세 수의 합 본문

코딩테스트

파이썬 알고리즘 인터뷰 - 세 수의 합

Gogozzi 2022. 5. 15. 14:08
반응형

문제

배열을 입력받아 합으로 0을 만들수 있는 3개의 엘리먼트를 출력하라.

 

입력

nums = [-1, 0, 1, 2, -1, -4]

출력

[
    [-1, -1, 2],
    [-1, 0, 1]
]

작성한 코드

def threeSum(nums: List[int]):
    lists = []
    for a in itertools.combinations(sorted(nums), 3):
        if sum(a) == 0:
            lists.append([*a])

    rtn = []
    for l in lists:
        if l not in rtn:
            rtn.append(l)
    return rtn

리코드에서 시간 초과가 나왔다. - 숫자가 많아지면 조합해야 할 숫자가 많기 때문에 초과된걸로 생각된다.

 

책에 있는 코드

def threeSum(nums: list) -> list:
    results = []
    nums.sort()

    for i in range(len(nums) - 2):
        # 중복된 값 건너뛰기
        if i > 0 and nums[i] == nums[i - 1]:
            continue

        # 간격을 좁혀가며 합 sum 계산
        left, right = i + 1, len(nums) - 1
        while left < right:
            sum = nums[i] + nums[left] + nums[right]
            if sum < 0:
                left += 1
            elif sum > 0:
                right -= 1
            else:
                # sum = 0인 경우이므로 정답 및 스킵 처리
                results.append([nums[i], nums[left], nums[right]])
                while left < right and nums[left] == nums[left + 1]:
                    left += 1
                while left < right and nums[right] == nums[right - 1]:
                    right -= 1
                left += 1
                right -= 1

    return results

 

리코드에서 확인

https://leetcode.com/problems/3sum/discuss/

 

3Sum - LeetCode Discuss

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

회고

책에 있는 코드가 너무 이해가 안되면 리코드에 디스커션을 확인해보면 다른 코드를 볼 수 있다.

30~40분만 고민해보고 풀리지 않는 다면 답을 보고 이해하려고 노력해야겠다.

책에있는 답도 이해가 되지 않는다면 내가 이해 할 수 있는 답을 구글링해서 찾아보는것도 좋은 방법이라고 생각한다.

반응형
Comments