LeetCode 15. 3Sum

JavaScript, Set, twoSum, 3Sum

Jun
2 min readJun 25, 2020

문제링크

문제분석

숫자로 이루어진 배열이 주어 질 때, 합이 0이 되는 세개의 원소를 가지는 유니크한 집합을 리턴하기
인풋: [-1, 0, 1, 2, -1, -4]

아웃풋: [
[-1, 0, 1],
[-1, -1, 2]
]

이 때 주의할 점은 [-1, 0, 1] 과 [0, 1, -1] 은 같은 집합이기 때문에 최종 결과값에 담기면 안된다.

시행착오

처음엔 가능한 조합을(nC3) 모두 구해서 합이 0이 되는 조건으로 조합을 필터링 한 후에, unique 한 세개의 원소로 이루어진 집합을 리턴하기 위해서 다시 모든 결과 값에 대해서 string으로 변환하고 Set 자료구조에 담아서 중복되는지 안되는지를 검사했다.

원하는 결과값들을 얻을 순 있었지만 최종 테스트 케이스에서 Time Limit Exceeded(시간 초과)로 통과하지 못한 코드다.

시행착오 코드

돌파구

앞선 포스팅에서 twoSum의 풀이를 다루었다.

세개를 더하는 것은 사실 앞에 하나의 값을 고정 뒤에 올 두개의 합을 구하면 된다. 즉, 고정값 + twoSum 알고리즘을 통해 리턴된 값을 더해서 0이 되도록 하면 된다.

[-1, 0, 1, 2, -1, -4] 
1. -1 고정, twoSum( [0, 1, 2, -1, -4], targetNumber: 0 - (-1) ) 을 보내준다.
2. targetNumber가 0 - (-1) = 1 을 만족하는 배열이 리턴된다.
3. [[0, 1], [2, -1]] 이 배열에 대해서 고정된 값을 insert 해준다.
4. [ [-1, 0, 1], [-1, 2, -1]] 리턴.

그리고, 중복을 피하기 위해서 3가지 장치를 걸었다.

  1. 주어진 배열을 순회하기 전에 sort() 함수로 배열을 정렬하기
  2. 한 번 fixed 되어서 검사한 값은 후에 다시 검사하지 않도록 Set 자료구조를 사용해서 이미 고정되었으면 다시 남은 배열에 대해서 twoSum 을 구하지 않도록 한다.
  3. twoSum 함수 내에서도 Set 자료구조를 사용해서 같은 쌍이 리턴되지 않도록 한다.

구현

--

--

No responses yet