diff --git a/climbing-stairs/jaejeong1.java b/climbing-stairs/jaejeong1.java new file mode 100644 index 000000000..941401e83 --- /dev/null +++ b/climbing-stairs/jaejeong1.java @@ -0,0 +1,29 @@ +class SolutionClimbStairs { + + public int climbStairs(int n) { + // n번째 계단까지 오르는 방법의 수 + // 첫 번째 계단까지 오르는 방법은 1가지 + // 두 번째 계단까지 오르는 방법은 2가지 + // 세 번째 계단부터는 이전 두 계단의 방법을 더하여 계산 + // stairs[i]는 i번째 계단까지 오르는 방법의 수 + // 시간복잡도: O(N), 공간복잡도: O(N) + if (n == 1) { + return 1; + } + + if (n == 2) { + return 2; + } + + int[] stairs = new int[n+1]; + stairs[1] = 1; + stairs[2] = 2; + + + for (int i=3; i<=n; i++) { + stairs[i] = stairs[i-1] + stairs[i-2]; + } + + return stairs[n]; + } +} diff --git a/product-of-array-except-self/jaejeong1.java b/product-of-array-except-self/jaejeong1.java new file mode 100644 index 000000000..4c015f1f2 --- /dev/null +++ b/product-of-array-except-self/jaejeong1.java @@ -0,0 +1,34 @@ +class SolutionProductExceptSelf { + + public int[] productExceptSelf(int[] nums) { + // answer[i] = nums[0] * nums[1] * ... * nums[i-1] * nums[i+1] * ... * nums[n-1] + // answer[i] = left[i] * right[i] + // left[i] = nums[0] * nums[1] * ... * nums[i-1] + // right[i] = nums[i+1] * ... * nums[n-1] + // left[i] = left[i-1] * nums[i-1] + // right[i] = right[i+1] * nums[i+1] + // answer[i] = left[i] * right[i] + // 시간복잡도: O(N), 공간복잡도: O(N) + int n = nums.length; + int[] left = new int[n]; + int[] right = new int[n]; + int[] answer = new int[n]; + + left[0] = 1; + right[n - 1] = 1; + + for (int i = 1; i < n; i++) { + left[i] = left[i - 1] * nums[i - 1]; + } + + for (int i = n - 2; i >= 0; i--) { + right[i] = right[i + 1] * nums[i + 1]; + } + + for (int i = 0; i < n; i++) { + answer[i] = left[i] * right[i]; + } + + return answer; + } +} diff --git a/two-sum/jaejeong1.java b/two-sum/jaejeong1.java new file mode 100644 index 000000000..835bc7d96 --- /dev/null +++ b/two-sum/jaejeong1.java @@ -0,0 +1,36 @@ +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +class SolutionTwoSum { + public int[] twoSum(int[] nums, int target) { + // 모든 수를 해시맵에 저장한다. key = nums[i], value = i + // 해시맵을 순회하며 target - key = result를 만족하는 쌍을 찾음 + // key 와 result 의 value를 정답으로 반환한다 + // 시간복잡도: O(N), 공간복잡도: O(N) + // 값별 인덱스 리스트를 저장할 해시맵 + HashMap> indicesByValue = new HashMap<>(); + + for (int i = 0; i < nums.length; i++) { + indicesByValue.computeIfAbsent(nums[i], k -> new ArrayList<>()).add(i); + } + + for (int key : indicesByValue.keySet()) { + int diff = target - key; + + if (indicesByValue.containsKey(diff)) { + int index1 = indicesByValue.get(key).get(0); + + // 동일한 값에 대해 두 개의 다른 인덱스가 있는지 확인 + int index2 = (key == diff && indicesByValue.get(key).size() > 1) + ? indicesByValue.get(key).get(1) + : indicesByValue.get(diff).get(0); + + return new int[]{index1, index2}; + } + } + + // 쌍을 찾지 못한 경우 + return null; + } +}