diff --git a/combination-sum/ohgyulim.java b/combination-sum/ohgyulim.java new file mode 100644 index 000000000..426528d7a --- /dev/null +++ b/combination-sum/ohgyulim.java @@ -0,0 +1,25 @@ +import java.util.*; + +class Solution { + List> answer = new ArrayList<>(); + public List> combinationSum(int[] candidates, int target) { + Arrays.sort(candidates); + recur(new ArrayList(), candidates, target, 0, 0); + return answer; + } + + public void recur(List result, int[] candidates, int target, int sum, int index) { + if (sum == target) { + List deepCopyRes = new ArrayList<>(result); + answer.add(deepCopyRes); + return; + } + for (int i = index; i < candidates.length; i++) { + if (sum + candidates[i] <= target) { + result.add(candidates[i]); + recur(result, candidates, target, sum + candidates[i], i); + result.remove(Integer.valueOf(candidates[i])); + } + } + } +} diff --git a/decode-ways/ohgyulim.java b/decode-ways/ohgyulim.java new file mode 100644 index 000000000..7cacbf63b --- /dev/null +++ b/decode-ways/ohgyulim.java @@ -0,0 +1,26 @@ +class Solution { + /* 시간 복잡도: O(N) + * - for 루프: O(N) + * 공간 복잡도: O(N), dp배열 + */ + public int numDecodings(String s) { + if (s.charAt(0) == '0') return 0; + int[] dp = new int[s.length() + 1]; + dp[0] = 1; + dp[1] = 1; + + for (int i = 2; i <= s.length(); i++) { + int one = Integer.parseInt(s.substring(i - 1, i)); + int two = Integer.parseInt(s.substring(i - 2, i)); + + if (one > 0) { + dp[i] += dp[i - 1]; + } + if (two >= 10 && two <= 26) { + dp[i] += dp[i - 2]; + } + } + return dp[s.length()]; + } +} + diff --git a/maximum-subarray/ohgyulim.java b/maximum-subarray/ohgyulim.java new file mode 100644 index 000000000..bacce767c --- /dev/null +++ b/maximum-subarray/ohgyulim.java @@ -0,0 +1,17 @@ +class Solution { + /* 시간 복잡도: O(N) + * - for 루프: O(N) + * 공간 복잡도: O(N), dp배열 + */ + public int maxSubArray(int[] nums) { + int[] dp = new int[nums.length]; + dp[0] = nums[0]; + + int answer = nums[0]; + for (int i = 1; i < nums.length; i++) { + dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]); + answer = Math.max(answer, dp[i]); + } + return answer; + } +} diff --git a/number-of-1-bits/ohgyulim.java b/number-of-1-bits/ohgyulim.java new file mode 100644 index 000000000..bede470aa --- /dev/null +++ b/number-of-1-bits/ohgyulim.java @@ -0,0 +1,10 @@ +class Solution { + /* 시간 복잡도: O(1) + * + * 공간 복잡도: O(1) + */ + public int hammingWeight(int n) { + return Integer.bitCount(n); + } +} + diff --git a/valid-palindrome/ohgyulim.java b/valid-palindrome/ohgyulim.java new file mode 100644 index 000000000..a0f7df2d5 --- /dev/null +++ b/valid-palindrome/ohgyulim.java @@ -0,0 +1,26 @@ +class Solution { + /* 시간 복잡도: O(N) + * - for 루프: O(N) + * + * 공간 복잡도: O(N), StringBuilder + */ + public boolean isPalindrome(String s) { + StringBuilder sb = new StringBuilder(); + + for (char ch : s.toCharArray()) { + if (Character.isLetterOrDigit(ch)) { + sb.append(Character.toLowerCase(ch)); + } + } + + for (int i = 0; i < sb.length(); i++) { + int left = i; + int right = sb.length() - i - 1; + + if (left >= right) return true; + if (sb.charAt(left) != sb.charAt(right)) return false; + } + + return true; + } +}