[LeetCode]Two Sum

Icarus<Wing>ยท2025๋…„ 3์›” 30์ผ
post-thumbnail

๐Ÿ“œ๋ฌธ์ œ ํ•ด์„

intํ˜• ๋ฐฐ์—ด nums์™€ intํ˜• target์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋”ํ•ด์„œ target์ด ๋˜๋Š” nums์˜ index 2๊ฐœ๋ฅผ ๋ฆฌํ„ดํ•˜๋ผ.

๊ฐ๊ฐ์˜ input์—๋Š” ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์†”๋ฃจ์…˜๋งŒ ์กด์žฌํ•˜๊ณ , ๊ฐ™์€
์›์†Œ๋ฅผ 2๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๐Ÿšง์ œ์•ฝ ์กฐ๊ฑด
1. 2 <= nums.length <= 10^4
2. ํ•˜๋‚˜์˜ ์œ ํšจํ•œ ๋‹ต๋ณ€๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์„ค๊ณ„ ๋ถ€๋ถ„์€ ๋‹จ์ˆœํ•œ 2์ค‘ for๋ฌธ ๊ตฌํ˜„์ด๋ฏ€๋กœ ์ƒ๋žตํ•˜์˜€๋‹ค.

๐Ÿ’ป์ฝ”๋“œ ๊ตฌํ˜„

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] arr = new int[2];

        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    arr[0] = i;
                    arr[1] = j;
                    break;
                }
            }
        }
        return arr;
    }
}

๐Ÿ’กif๋ฌธ์—์„œ return new int[]{i, j};ํ•˜๋ฉด static array๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ”๋กœ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋“ค์„ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ““์ž๋ฐ”์—์„œ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด์ž.

  1. ๋ฐฐ์—ด ์„ ์–ธ ํ›„ ๊ฐ’ ํ• ๋‹น: ์šฐ๊ฐ’์— ํฌ๊ธฐ ์ง€์ •์€ ํ•„์ˆ˜๋‹ค.
int[] arr = new int[2]; // ํฌ๊ธฐ 2์ธ ๋ฐฐ์—ด ์„ ์–ธ
arr[0] = 1;
arr[1] = 3;
  1. ๋ฐฐ์—ด์„ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”(new ํ•„์š”)
int[] arr = new int[]{1, 3}; // ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋ฉด์„œ ๊ฐ’์„ ์ฆ‰์‹œ ์ดˆ๊ธฐํ™”
  1. new์—†์ด ๋ฐฐ์—ด์„ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”(C ์Šคํƒ€์ผ)
int[] arr = {1, 3}; // ๋ฐฐ์—ด ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” (new ์ƒ๋žต ๊ฐ€๋Šฅ)

๐Ÿ’กreturn ๋ฌธ์—์„œ๋Š” return new int[]{i, j};์™€ ๊ฐ™์ด new๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ i์™€ j ๊ฐ’์„ ๋„ฃ์–ด ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ

๊ทธ๋Ÿฌ๋ฉด ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

class Solution {
    public int[] twoSum(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    return new int[] {i, j};
                }
            }
        }
        return new int[] {-1, -1}; // ๋ฆฌํ„ด ํƒ€์ž…์ด int[]์ด๋ผ ๋„ฃ์–ด์ค˜์•ผํ•จ
    }
}

์œ„์—์„œ๋Š” 2์ค‘ for๋ฌธ์œผ๋กœ ์™„์ „ ํƒ์ƒ‰์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ์ •๋ ฌ & ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•ด์„œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋” ๋‚ฎ์ถ˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณผ ๊ฒƒ์ด๋‹ค.

โš™๏ธ์ •๋ ฌ๊ณผ ํˆฌ ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ์„ค๊ณ„

โš ๏ธํˆฌ ํฌ์ธํ„ฐ๋Š” ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.(binary search์™€ ๋น„์Šทํ•œ๋“ฏ...?)

# ์˜์‚ฌ์ฝ”๋“œ

# 1. ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ๋จผ์ € ํ•œ๋‹ค.
nums.sort() 

# 2. nums์˜ ๋ฆฌ์ŠคํŠธ์—์„œ l = 0, r = len(nums) - 1๋กœ ์„ค์ •ํ•œ๋‹ค.

# 3. ๋ฌธ์ œ ์กฐ๊ฑด์—์„œ "๊ฐ™์€ ์›์†Œ๋ฅผ 2๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค."๋ผ๊ณ  ํ•˜์˜€์œผ๋ฏ€๋กœ 
# l์ด r๋ณด๋‹ค ์ž‘์„ ๋•Œ๊นŒ์ง€ loop๋ฅผ ๊ณ„์† ๋ฐ˜๋ณต์‹œํ‚จ๋‹ค.
while l < r:
		if nums[l] + nums[r] == target:
        	return [l, r]
        elif nums[l] + nums[r] > target:
        	r -= 1 # target๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅธ์ชฝ์˜ ํฌ์ธํ„ฐ๋ฅผ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ 
        else:
        	l += 1 # target๋ณด๋‹ค ์ž‘์œผ๋ฉด ์™ผ์ชฝ์˜ ํฌ์ธํ„ฐ๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™

๐Ÿ’ป์ฝ”๋“œ ๊ตฌํ˜„

class TwoPointerSolution {
    public int[] twoSum(int[] nums, int target) {
        Arrays.sort(nums); // ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

        int l = 0;
        int r = nums.length - 1;

        while (l < r) {
            if (nums[l] + nums[r] == target) {
                return new int[] { l, r };
            } else if (nums[l] + nums[r] > target) {
                r -= 1;
            } else {
                l += 1;
            }
        }
        return new int[] { -1, -1 };
    }
}

๐Ÿšฉ๊ทธ๋Ÿฐ๋ฐ ํˆฌ ํฌ์ธํ„ฐ๋Š” ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์ „์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋ฌธ์ œ๋Š” ๋ฐฐ์—ด์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด๋ฒ„๋ฆฌ๋ฉด ๊ธฐ์กด์˜ value๊ฐ€ ์ €์žฅ๋œ ์ธ๋ฑ์Šค๋„ ์ˆ˜์ •๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์˜ˆ) nums = [3,2,4], target = 6์ด๋ฉด nums.sort() -> [2, 3, 4]๊ฐ€ ๋˜๊ณ  ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ๋Œ“๊ฐ’์ธ [1, 2]๊ฐ€ ๋ฆฌํ„ด๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ [0, 2]๊ฐ€ ๋ฆฌํ„ด์ด ๋˜์„œ submit๋˜์ง€ ๋ชปํ•œ๋‹ค.

๐Ÿ”จ๋”ฐ๋ผ์„œ {num: index}๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ HashMap<Integer, Integer>๋ฅผ ์ถ”๊ฐ€๋กœ ์จ์„œ ๊ธฐ์กด์˜ num์— ์žˆ๋Š” index๋ฅผ ์ €์žฅํ•˜๋„๋ก ํ•œ๋‹ค.

๐Ÿ’ปHashMap์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ ๊ตฌํ˜„


    public int[] twoSum(int[] nums, int target) {
        // # {num: index}
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], i);
        }

        Arrays.sort(nums); // ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

        int l = 0;
        int r = nums.length - 1;

        while (l < r) {
            if (nums[l] + nums[r] == target) {
                return new int[] {map.get(nums[l]), map.get(nums[r])};
            } else if (nums[l] + nums[r] > target) {
                r -= 1;
            } else {
                l += 1;
            }
        }
        return new int[] { -1, -1 };
    }

๐Ÿšฉ์—ฌ๊ธฐ์„œ ๋˜ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”๊ฒŒ, HashTable(๋˜๋Š” HashMap)์€ ๊ฐ™์€ ํ‚ค ๊ฐ’์€ ์ €์žฅํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ์ค‘๋ณต๋˜๋Š” ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋ฉด value๋ฅผ ์—…๋ฐ์ดํŠธ ์‹œ์ผœ๋ฒ„๋ฆฐ๋‹ค.

๐Ÿ”จ๋”ฐ๋ผ์„œ, 2์ฐจ์› ๋ฐฐ์—ด์„ HashMap์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋Š” ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

๐Ÿค”ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ ˆ๋ฒจ0์˜ ๋“ฑ์ˆ˜ ๋งค๊ธฐ๊ธฐ๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋กœ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋Š”๋ฐ, two sum์€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ?
๐Ÿ‘‰"๋“ฑ์ˆ˜ ๋งค๊ธฐ๊ธฐ" ๋ฌธ์ œ๋Š” ๊ณต๋™ ๋“ฑ์ˆ˜๋ฅผ duplicate index๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฐ˜๋ฉด, two sum ๋ฌธ์ œ๋Š” ๊ฐ value๋งˆ๋‹ค index๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— HashMap์œผ๋กœ๋Š” duplicate element๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค.

๐Ÿ’ป2์ฐจ์› ๋ฐฐ์—ด์„ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๊ตฌํ˜„


    public int[] twoSum(int[] nums, int target) {
        // 2D๋ฅผ HashMap์ฒ˜๋Ÿผ ๊ตฌํ˜„(Key: arr[0] = num, Value: arr[1] = index)
        int[][] numIndex = new int[nums.length][2]; // {num: index}๊ฐ€ nums์˜ ๊ธธ์ด๋งŒํผ ์žˆ์Œ
        for (int i = 0; i < nums.length; i++) {
            numIndex[i][0] = nums[i];
            numIndex[i][1] = i;
        }
        // ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ(based on num)
        Arrays.sort(numIndex, (o1, o2) -> {
            return o1[0] - o2[0];
        }); 

        int l = 0;
        int r = nums.length - 1;

        while (l < r) {
            if (numIndex[l][0] + numIndex[r][0] == target) {
                return new int[] {numIndex[l][1], numIndex[r][1]};
            } else if (numIndex[l][0] + numIndex[r][0] > target) {
                r -= 1;
            } else {
                l += 1;
            }
        }
        return new int[] { -1, -1 };
    }

๐Ÿ’ก2์ฐจ์› ๋ฐฐ์—ด์€ ๊ทธ๋Œ€๋กœ Arrays.sort(arr)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด java.lang.ClassCastException: class [I cannot be cast to class java.lang.Comparable๋ผ๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด์œ ๋Š” 1์ฐจ์› ๋ฐฐ์—ด์€ ์•ž๋’ค์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋น„๊ตํ•ด์•ผํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, 2์ฐจ์› ๋ฐฐ์—ด์€ row, col ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋น„๊ตํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๐Ÿ‘‰๋”ฐ๋ผ์„œ, ๋žŒ๋‹ค์‹์„ ํ™œ์šฉํ•˜์—ฌ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ sort์˜ ์ธ์ž๋กœ ๋„ฃ๋Š”๋‹ค.(โˆต๋žŒ๋‹ค์‹์€ ์ผ๊ธ‰๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ)

๐Ÿ’ก์œ„์˜ ๋ฆฌํ„ด๋ฌธ์—์„œ o1๊ณผ o2์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋ฉด ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ“š์ฐธ๊ณ ์ž๋ฃŒ
๐Ÿ”—2์ฐจ์› ๋ฐฐ์—ด ์ •๋ ฌํ•˜๊ธฐ: https://angelplayer.tistory.com/452

profile
๋ชจ๋“  ์ฝ”๋“œ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ๊ธฐ์— ์›์ธ์„ ํŒŒ์•…ํ•  ๋•Œ๊นŒ์ง€ ์ง‘์š”ํ•˜๊ฒŒ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€