
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๋ฅผ ์ ์ธํ์ง ์๊ณ ๋ ๋ฐ๋ก ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ค์ ๋ฆฌํดํ ์ ์๋ค.
๐์๋ฐ์์ ๋ฐฐ์ด์ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ค์ ์ดํด๋ณด์.
int[] arr = new int[2]; // ํฌ๊ธฐ 2์ธ ๋ฐฐ์ด ์ ์ธ
arr[0] = 1;
arr[1] = 3;
int[] arr = new int[]{1, 3}; // ๋ฐฐ์ด์ ์์ฑํ๋ฉด์ ๊ฐ์ ์ฆ์ ์ด๊ธฐํ
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๋ฅผ ์ ์ฅํ๋๋ก ํ๋ค.
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๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
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