[LeetCode_15] 세 수의 합

2022. 2. 6. 16:42· #️⃣ Project 및 개발일지/Algorithm 문제 풀이
목차
  1. # 문제 설명 

파이썬으로 배우는 알고리즘 책을 공부하며 풀었던 LeetCode문제들을 재정리해보자.

 

# 문제 설명 

15번  3Sum은 배열을 입력받아 합으로 0을 만들 수 있는 3개의 요소를 출력하는 문제이다.

단 결과에 중복된 요소 집합이 포함되면 안 된다.

Example

위 문제를 풀려고 시도했지만 시간 초과로 떴고, 다른 방법은 생각나지 않아 우선 책 풀이를 참고하였다.

 

# 시도 1 (Time Limit Exceeded) - 3중 for문

...당연히 시간 초과로 뜸.

더보기
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        
        result =[]
        
        nums.sort()
        len_nums = len(nums)
        
        print(nums)
        
        for i in range(len_nums-2) : 
            if i > 0 and nums[i] == nums[i-1]:
                continue
            
            for j in range(i+1, len_nums-1) :
                if j > i +1 and nums[j] == nums[j-1]:
                    continue
                
                for k in range(j+1, len_nums) :
                    if k > j +1 and nums[k] == nums[k-1]:
                        continue    
                    
                    if nums[i] + nums[j] + nums[k] == 0 :
                        result.append([nums[i], nums[j], nums[k]])

        return result

중복된 쌍이 결과에 포함되지 않도록 하기 위해 if문으로 이전 인덱스 값이랑 같은지 여부에 따라 continue를 써서 구분을 하였다. 

 

# 풀이방법 1 - 투 포인터로 합 계산 (책 풀이 참고)

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        
        result =[]
        
        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 :
                    right -= 1
                elif sum < 0 :
                    left += 1
                else : # sum이 0인 경우
                    result.append([nums[i], nums[left], nums[right]])
                    
                    # 양 옆으로 동일한 값이 있을 수도 있으니 skip
                    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

1. 첫 번째 인자는 for문으로 접근 (이때 중복된 값이 포함되지 않도록 if/continue 사용)

2. 두 번째와 세 번째 인자는 투 포인터를 이용하여 간격을 좁혀가며 sum이 0인 값을 찾는다.

  - 합이 0보다 크면 right -=1 로 값을 줄이고, 0보다 작으면 left+=1하여 값을 늘린다.

  - 만약 합이 0이라면, 양 옆으로 동일한 값은 skip하도록 처리한다. 

 

 

| 핵심 |

# 중복된 값은 건너뛰기
            if i > 0 and nums[i] == nums[i-1]:
                continue

 

# 투 포인터로 간격을 좁혀가며 합 sum 계산 
            left, right = i+1, len(nums) - 1
            while left < right :

 

# 양 옆으로 동일한 값이 있을 수도 있으니 skip
                    while left < right and nums[left] == nums[left + 1]:
                        left +=1
                    while left < right and nums[right] == nums[right - 1]:
                        right -= 1

 

 

 

 

# 결과 

'#️⃣ Project 및 개발일지 > Algorithm 문제 풀이' 카테고리의 다른 글

[LeetCode] 206. Reverse Linked List 역순 연결 리스트  (0) 2022.02.17
[LeetCode] 234. Palindrome Linked List 팰린드롬 연결리스트  (0) 2022.02.06
[LeetCode_561] 배열 파티션 I  (0) 2022.02.06
[LeetCode_121] 주식을 사고팔기 가장 좋은 시점  (0) 2022.02.06
[LeetCode_238] 자신을 제외한 배열의 곱  (0) 2022.02.06
  1. # 문제 설명 
'#️⃣ Project 및 개발일지/Algorithm 문제 풀이' 카테고리의 다른 글
  • [LeetCode] 206. Reverse Linked List 역순 연결 리스트
  • [LeetCode] 234. Palindrome Linked List 팰린드롬 연결리스트
  • [LeetCode_561] 배열 파티션 I
  • [LeetCode_121] 주식을 사고팔기 가장 좋은 시점
HyeM207
HyeM207
"Reflections and Growth Through Records" 회고와 기록을 통한 성장으로
HyeM207
HYEM's Storage
HyeM207
  • ALL (115)
    • #️⃣ CS (Computer Science) (5)
      • Database (2)
      • SQL (2)
      • Git (1)
    • #️⃣ Data Engineering (43)
      • Airflow (18)
      • Spark (8)
      • Snowflake (2)
      • BI,DashBoard (4)
      • ELK Stack (2)
      • Hadoop (5)
      • Kafka (4)
    • #️⃣ Cloud&Container (16)
      • AWS (8)
      • GCP (1)
      • Docker (6)
      • Kubernetes (1)
    • #️⃣ Project 및 개발일지 (37)
      • Mini Project (5)
      • 개발일지 (9)
      • Algorithm 문제 풀이 (20)
    • #️⃣ 책 리뷰 (4)
    • #️⃣ 회고글&프로젝트 후기 (10)

공지사항

인기 글

최근 댓글

블로그 메뉴

  • 홈
  • 태그
  • 방명록
hELLO · Designed By 정상우.v4.2.2
HyeM207
[LeetCode_15] 세 수의 합
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.