From 6783b724794f02b69778be8e5332c4b8936a58d6 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Wed, 16 Apr 2025 22:44:21 +0900 Subject: [PATCH 1/5] add combination sum solution --- combination-sum/Tessa1217.java | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 combination-sum/Tessa1217.java diff --git a/combination-sum/Tessa1217.java b/combination-sum/Tessa1217.java new file mode 100644 index 000000000..17fe5fd0b --- /dev/null +++ b/combination-sum/Tessa1217.java @@ -0,0 +1,36 @@ +import java.util.List; +import java.util.ArrayList; +/** + 중복 되지 않은 요소들이 들어있는 candidates 배열이 주어지고 target 값이 주어진다. + 합이 target과 같은 중복되지 않은 조합을 모두 반환하시오. + */ +class Solution { + + List> answer = new ArrayList<>(); + + public List> combinationSum(int[] candidates, int target) { + combination(0, candidates, target, 0, new ArrayList<>()); + return answer; + } + + // 시간복잡도 O(2^target) + public void combination(int idx, int[] candidates, int target, int currentSum, List comb) { + // 누적 합이 넘으면 + if (currentSum > target) { + return; + } + + // 누적 합이 타겟 값과 같으면 + if (currentSum == target) { + answer.add(new ArrayList<>(comb)); + return; + } + + for (int i = idx; i < candidates.length; i++) { + comb.add(candidates[i]); + combination(i, candidates, target, currentSum + candidates[i], comb); + comb.remove(comb.size() - 1); + } + } +} + From 2358623d894cc73edb7776cb2ece2f33e7b57a17 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Wed, 16 Apr 2025 22:44:31 +0900 Subject: [PATCH 2/5] add decode ways solution --- decode-ways/Tessa1217.java | 43 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 decode-ways/Tessa1217.java diff --git a/decode-ways/Tessa1217.java b/decode-ways/Tessa1217.java new file mode 100644 index 000000000..0181b7f69 --- /dev/null +++ b/decode-ways/Tessa1217.java @@ -0,0 +1,43 @@ +/** + 주어진 문자열을 복호화 할 수 있는 경우의 수를 반환하시오. + 문자열은 A-Z까지 숫자 1-26으로 치환 + 예시: "AAJF" => (1, 1, 10, 6), (11, 10, 6)... + */ +class Solution { + + // 시간복잡도: O(n), 공간복잡도: O(n) + public int numDecodings(String s) { + + int[] dp = new int[s.length() + 1]; + + // contain leading zero(s) + if (s.charAt(0) == '0') { + return 0; + } + + dp[0] = 1; + dp[1] = 1; + + for (int i = 2; i <= s.length(); i++) { + + // 1자리수 검사 + int one = Integer.parseInt(Character.toString(s.charAt(i - 1))); + + if (one != 0) { + dp[i] += dp[i - 1]; + } + + // 2자리수 검사 + int two = Integer.parseInt(Character.toString(s.charAt(i - 2))) * 10 + one; + + if (two >= 10 && two <= 26) { + dp[i] += dp[i - 2]; + } + + } + + return dp[s.length()]; + } + +} + From 9707c8357f2551dd383f98c419068aa074815349 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Wed, 16 Apr 2025 22:44:44 +0900 Subject: [PATCH 3/5] add maximum subarray solution --- maximum-subarray/Tessa1217.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 maximum-subarray/Tessa1217.java diff --git a/maximum-subarray/Tessa1217.java b/maximum-subarray/Tessa1217.java new file mode 100644 index 000000000..c28808439 --- /dev/null +++ b/maximum-subarray/Tessa1217.java @@ -0,0 +1,21 @@ +/** + 정수 배열이 주어질 때 부분 수열의 가장 큰 합을 구하시오. + */ +class Solution { + + // 시간복잡도: O(n), 공간복잡도: O(1) + public int maxSubArray(int[] nums) { + + int sum = nums[0]; + + for (int i = 1; i < nums.length; i++) { + // 수 이어서 더할지 아니면 현재 값으로 초기화할지 여부 판단 + nums[i] = Math.max(nums[i], nums[i] + nums[i - 1]); + sum = Math.max(nums[i], sum); + } + + return sum; + } + +} + From 817a0fc159a04d4bc23b1329b9de30e25f15cb62 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Wed, 16 Apr 2025 22:44:54 +0900 Subject: [PATCH 4/5] add number of 1 bits solution --- number-of-1-bits/Tessa1217.java | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 number-of-1-bits/Tessa1217.java diff --git a/number-of-1-bits/Tessa1217.java b/number-of-1-bits/Tessa1217.java new file mode 100644 index 000000000..ccd8c73c1 --- /dev/null +++ b/number-of-1-bits/Tessa1217.java @@ -0,0 +1,32 @@ +/** 주어진 숫자의 Hamming weight 구하기 */ +class Solution { + + // 시간복잡도: O(1), 공간복잡도: O(1), 비트 연산자 사용 + public int hammingWeight(int n) { + int count = 0; + while (n != 0) { + count += (n & 1); + n >>>= 1; + } + return count; + } + + // 시간복잡도: O(1), 공간복잡도: O(1) + // public int hammingWeight(int n) { + + // int count = 0; + // while (n != 0) { + // if (n % 2 == 1) { + // count++; + // } + // n /= 2; + // } + // return count; + // } + + // 시간복잡도: O(1), 공간복잡도: O(n) + // public int hammingWeight(int n) { + // return Integer.toBinaryString(n).replaceAll("0", "").length(); + // } +} + From 452f93170c593b766afb8a13653b4faf5797ed6f Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Wed, 16 Apr 2025 22:45:04 +0900 Subject: [PATCH 5/5] add valid palindrome solution --- valid-palindrome/Tessa1217.java | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 valid-palindrome/Tessa1217.java diff --git a/valid-palindrome/Tessa1217.java b/valid-palindrome/Tessa1217.java new file mode 100644 index 000000000..ee220332e --- /dev/null +++ b/valid-palindrome/Tessa1217.java @@ -0,0 +1,54 @@ +/** 대문자 문자들을 소문자로 변환하고, 알파벳이 아닌 문자들을 제거했을 때 앞뒤가 똑같이 읽히는 구문을 palindrome이라고 한다. + 주어진 구문이 palindrome인지 여부를 확인하여 boolean 값을 반환하세요. + */ +class Solution { + + // 투 포인터 활용 시간 복잡도: O(n), 공간복잡도: O(n) + public boolean isPalindrome(String s) { + + + int left = 0; + int right = s.length() - 1; + + while (left < right) { + // 문자 또는 숫자 아닐 시 + while (left < right && !Character.isLetterOrDigit(s.charAt(left))) { + left++; + } + while (left < right && !Character.isLetterOrDigit(s.charAt(right))) { + right--; + } + // 양 포인터 일치하지 않을 경우 리턴 + if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) { + return false; + } + + left++; + right--; + + } + return true; + } + + // char 배열 활용 풀이: 시간 복잡도: O(n), 공간복잡도: O(n) + // public boolean isPalindrome(String s) { + // // non-alphanumeric (숫자 포함 - test case "0P") + // char[] convertArr = s.toLowerCase().replaceAll("[^a-z0-9]", "").toCharArray(); + // int maxIdx = convertArr.length - 1; + // for (int i = 0; i <= maxIdx; i++) { + // if (convertArr[i] != convertArr[maxIdx - i]) { + // return false; + // } + // } + // return true; + // } + + // StringBuffer reverse() 활용 + // public boolean isPalindrome(String s) { + // // non-alphanumeric (숫자 포함 - test case "0P") + // String convertedString = s.toLowerCase().replaceAll("[^a-z0-9]", ""); + // StringBuffer sb = new StringBuffer(convertedString); + // return convertedString.equals(sb.reverse().toString()); + // } +} +