이모저모

leetcode - sum3 본문

coding/알고리즘,자료구조

leetcode - sum3

Jeo 2022. 1. 15. 12:30

1.

# Input: nums = [-1,0,1,2,-1,-4]
# Output: [[-1,-1,2],[-1,0,1]]

# 먼저 생각 정리를 해보기. 
# 첫번째 숫자 a를 뽑고, 그 다음친구 b를 불러 둔다.
# a와 b의 합 (sumOf2)을 구한다.
# 0 - (sumOf2) 인 값이 나머지 인덱스 아이들 중에 있는지 찾는다.
# 있다면 그 아이들을 짝짓는다.

# 없다면 a, b = a + 2 를 불러둔다.
# ... 언제까지? b < len(list) -1 일때까지.

# 남은 요소들이 3개 이상 남아있다면
# 위의 과정을 다시 한다.


def make3SumZero(nums):
    big_list = []  # 커다란 리스트 (할아버지) 준비!
    for i, num in enumerate(nums):  # nums 에서 인덱스와 요소값을 차례로 뽑아 자식1을 지정한다.
        secondIndex = i + 1  # 그 바로 다음 친구를 자식2로 지정
        while secondIndex <= (len(nums) -2):
            # 자식 2의 인덱스 가운데이므로, 끝에서 두번째 인덱스일때까지만 가능.
            secondNum = nums[secondIndex]  # 자식 2 인덱스의 요소 값을 secondNum 으로 가져온다.
            sumOf2 = num + secondNum  # 자식1과 자식2 --> 두 요소의 합을 먼저 구해본다.
            if -sumOf2 in nums[secondIndex+1:]:
                # 구한 합(sumOf2)을 부호 역전한 값이 두번째 요소 우측 친구들 중에에서 있다면
                # 합이 0이 되는 세 자식들이 만난 것이므로, 그 아이들을 리스트로 묶어 커다란 리스트에 append
                big_list.append([num, secondNum, -sumOf2])
            # 세 친구가 짝지어졌거나 아니거나, 가운데 요소는 오른쪽으로 한칸 이동한다.
            secondIndex += 1

    # 리스트들이 순서만 다를 뿐 값의 조합은 동일한 아이들이 있을 것이므로,
    # 재정비해서 담아줄 not_duplicated 를 준비한다.
    not_duplicated = []

    # 앞서 일차적으로 만들어진 big_list 에서 아빠 리스트들을 하나씩 검사한다.
    for fatherLi in big_list:
        fatherLi.sort()  # fatherLi를 제자리 정렬시킨다.
        if fatherLi not in not_duplicated:  # 정렬된 fatherLi가 최종판인 not_dup~에 없다면,
            not_duplicated.append(fatherLi)  # 정렬된 이 fatherLi를 not_dup~에 추가한다.
    return not_duplicated



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

첫 시도.

 

Comments