๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/LeetCode

[LeetCode] 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

 

์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด nums๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, nums์˜ element 3๊ฐœ๋ฅผ ๋ฝ‘์•„ ๋” ํ•œ ๊ฒฝ์šฐ 0์ด ๋˜๋Š” element๋“ค์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ •์ˆ˜ ์š”์†Œ๋Š” ์ค‘๋ณต๋˜์–ด ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ๊ณ , ์ค‘๋ณต๋˜์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ ‘๊ทผ ๋ฐฉ๋ฒ•

์ฒ˜์Œ์—๋Š” start, mid, end 3๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด nums๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ 0์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ถœ๋ ฅํ•˜๋ ค ํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ [0,0,0,0] => [0,0,0] ์ด ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ [[0,0,0],[0,0,0]] ์ฒ˜๋Ÿผ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์žก์ง€ ๋ชปํ•˜์—ฌ์„œ ๋งŽ์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค.

๊ฒฐ๊ตญ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์˜ˆ์™ธ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์˜€๋Š”๋ฐ 
while(start < end && nums[start] === nums[start + 1]) start++;โ€‹
while๋ฌธ ๋‚ด์— while์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „ ๊ฐ’๊ณผ ๋‹ค์Œ ๊ฐ’์ด ๊ฐ™์„๋•Œ ๊ณ„์†ํ•ด์„œ ์ฆ๊ฐํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€๊ณ 

๊ธฐ์กด์— start, mid, end 3๊ฐ€์ง€๋ฅผ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•˜๋Š” ๊ฒƒ์—์„œ 

start๋ฅผ ๊ณ ์ •๊ฐ’์œผ๋กœ ๋‘๊ณ , mid, end๋ฅผ ๋ณ€ํ™”ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋‘๋Š” ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์–ด ๋” ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ์—ˆ๋‹ค.

[Leetcode / Javascript] 15. 3Sum (tistory.com)
// ์ˆซ์ž ๋ฐฐ์—ด์ด ์ฃผ์–ด์งˆ๋•Œ 3๊ฐœ๋ฅผ ๋ฝ‘์•„ ๋”ํ–ˆ์„ ๊ฒฝ์šฐ 0์ด ๋˜๋Š” ๊ฒฝ์šฐ
// ๊ทธ ์ˆซ์ž๋“ค์„ ๋ฐฐ์—ด๋กœ ๋„ฃ์–ด ์ถœ๋ ฅ

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var threeSum = function(nums) {
    let output = [];
    let fixed = 0, start = 1, end = nums.length-1;
    
    if(nums.length < 3) return output;
    
    nums.sort((a, b) => a - b);
    
    for(let fixed = 0; fixed < nums.length - 2; fixed++){
        if(nums[fixed] > 0) break;
        if(nums[fixed] === nums[fixed - 1]) continue;
        
        let start = fixed + 1, end = nums.length-1;
        
        while(start < end){
            const sum3Nums = nums[fixed] + nums[start] + nums[end];
            
            if(sum3Nums === 0) {
                output.push([nums[fixed], nums[start], nums[end]])
                while(start < end && nums[start] === nums[start + 1]) start++;
                while(start < end && nums[end] === nums[end-1]) end--;
                start++, end--;
                continue;
            }
            else if(sum3Nums < 0){
                while(start < end && nums[start] === nums[start + 1]) start++;
                start++;
            }else{
                while(start < end && nums[end] === nums[end-1]) end--;
                end--;
            }
        }
    }
    
    
    return output
};

'์ฝ”๋”ฉํ…Œ์ŠคํŠธ > LeetCode' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[LeetCode] Valid Parentheses  (0) 2022.06.24
[LeetCode] 3Sum Closest  (0) 2022.06.23
[LeetCode] Furthest Building You Can Reach  (0) 2022.06.21
[LeetCode] search-suggestions-system  (0) 2022.06.19
[LeetCode] Zigzag Conversion  (0) 2022.06.17