Algorithm/1일 1코테

[😭 leetcode] 15. 3Sum

대인보우 2022. 7. 25. 20:48
반응형

리트코드 13번째 문제 [3Sum]

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

 

3Sum - LeetCode

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

 

문제

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

 

정답

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        
        result = []
        
        # 편의상 정렬 수행
        nums.sort()
        
        # i를 기준으로 투 포인터 기법 수행
        # left, right 값이 빠져 -2를 계산
        for i in range(len(nums)-2):
            
            # 중복 제거
            # i가 이전 i와 같다면 패스한다.
            if i > 0 and nums[i] == nums[i-1]:
                continue
            
            # i 이후로 투 포인터 설정
            left, right = i+1, len(nums)-1
            
            while left < right:
                
                # i, left, right를 모두 계산한다.
                all_sum = nums[i] + nums[left] + nums[right]
                
                # 합이 0보다 크다면 right (큰 쪽)을 하나 줄임
                if all_sum > 0:
                    right -= 1
                # 합이 0보다 작다면 left (작은 쪽)을 하나 키움
                elif all_sum < 0:
                    left += 1
                else:
                	# 합이 0이라면 result에 추가 
                    result.append([nums[i], nums[left], nums[right]])
                    
                    # left, 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 result
반응형