파이썬 알고리즘 인터뷰 7장_배열(세 수의 합)

leeseungsoo0701·2022년 1월 17일
0
post-thumbnail

아이디어
1. 배열을 sort한다.
2. for문을 돌며 하나하나의 고정값을 만들고 나머지 2개의 값을 투 포인터로 움직인다.
3. 결과 값에 해당하도록 작으면 왼쪽 포인터를 오른쪽으로 한칸 움직이고 크다면 오른쪽 포인터를 왼쪽으로 움직이다.
4. 위 과정을 반복했을때(왼쪽 포인터가 오른쪽 포인터보다 커지거나 이럴 때 break)
5. 위 과정에서 고정값이 연속된 수라면 굳이 연산을 해줄 필요 없으므로 같다면 한칸씩 이동해준다.

"""
배열의 입력 받아 합으로 0을 만들 수 있는 3개의 엘리먼트를 출력하라.
입력 : nums = [-1, 0, 1, 2, -1, -4]
-1 0 1 2 -1 -4
출력 : [[-1,0,1],[-1,-1,2]]
"""

class Solution:
    def threeSum(nums):
        answer = []   ### 정답을 담을 리스트
        nums.sort()   ### 음수 양수를 구분하기 위해서 정렬한다. (0은 양수 + 음수)

        # 가장 작은 값을 고정하고, 중간값과 큰 값을 투 포인터로 계산한다. (하나의 값을 고정하고 그 뒤부터 투 포인터로 좁혀가며 계산한다)
        # 고정값 index = start.
        for start in range(len(nums) - 2):

            # 한 번 고정값으로 사용했다면 건너뛴다.
            if start > 0 and nums[start] == nums[start - 1]:
                continue #하단의 코드를 실행하지 않고 넘어감 ,즉 같은 고정값이라면 패스한다.

            # 투 포인터로 간격을 줄여가며 합 계산
            left, right = start + 1, len(nums) - 1
            while left < right:
                sums = nums[start] + nums[left] + nums[right]
                # 0보다 작으면 left 위치를, 0보다 크면 right 위치를 이동시킨다.
                if sums < 0:
                    left += 1
                elif sums > 0:
                    right -= 1
                else:
                    answer.append([nums[start], nums[left], nums[right]])
                    # 중복연산 제거를 위해 left, 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

        # for lists in answer:
        #     lists = sorted(lists)
        #
        # result = list(map(list,(set(map(tuple, answer)))))

        return print(answer)



    nums = [-1,0,1,2,-1,-4]
    threeSum(nums)

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

링크:
https://github.com/leeseungsoo0701/python_alogrithm/blob/main/array/leetcode/15_3sum.py

leetcode 15

profile
한 줄이라도 정확하고 깊게 알아가보자 늦어도 좋다.

0개의 댓글

관련 채용 정보