From 9a39f62e85b353ad8f4ff0e9a6e987712725a047 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Sun, 6 Apr 2025 18:31:14 +0900 Subject: [PATCH 1/4] add climbing stairs solution --- climbing-stairs/Tessa1217.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 climbing-stairs/Tessa1217.java diff --git a/climbing-stairs/Tessa1217.java b/climbing-stairs/Tessa1217.java new file mode 100644 index 000000000..724c557fb --- /dev/null +++ b/climbing-stairs/Tessa1217.java @@ -0,0 +1,26 @@ +/** + 당신은 계단을 오르고 있다. 정상에 오르기까지 n 계단을 올라야 한다. + 계단을 오를 때마다 1 계단 또는 2 계단씩 오를 수 있을 때 정상에 도달하기까지의 경우의 수를 구하시오. + */ + +public class Solution { + + // 시간복잡도: O(n) + public int climbStairs(int n) { + + if (n == 1 || n == 2) { + return n; + } + + int[] cases = new int[n + 1]; + cases[1] = 1; + cases[2] = 2; + for (int i = 3; i <= n; i++) { + cases[i] = cases[i - 1] + cases[i - 2]; + } + + return cases[n]; + } + +} + From 2fae93511f76914b101a47f47e525b52442cdba6 Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Sun, 6 Apr 2025 18:31:25 +0900 Subject: [PATCH 2/4] add valid anagram solution --- valid-anagram/Tessa1217.java | 60 ++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 valid-anagram/Tessa1217.java diff --git a/valid-anagram/Tessa1217.java b/valid-anagram/Tessa1217.java new file mode 100644 index 000000000..880de347f --- /dev/null +++ b/valid-anagram/Tessa1217.java @@ -0,0 +1,60 @@ +/** + 두 문자열 s와 t가 주어질 때 t가 s의 애너그램이라면 true, 아니면 false를 반환하세요. + */ + +import java.util.Map; +import java.util.HashMap; +import java.util.Arrays; +public class Solution { + + // 2차 풀이 (맵 활용하여 시간 복잡도 줄이기, 시간복잡도: O(n)) + public boolean isAnagram(String s, String t) { + + Map charMap = new HashMap<>(); + + char[] sArr = s.toCharArray(); + for (char sa : sArr) { + charMap.put(sa, charMap.getOrDefault(sa, 0) + 1); + } + + char[] tArr = t.toCharArray(); + for (char ta : tArr) { + charMap.put(ta, charMap.getOrDefault(ta, 0) - 1); + } + + for (int cnt : charMap.values()) { + if (cnt != 0) { + return false; + } + } + + return true; + + } + + + // 1차 풀이 (정렬로 인해 O(n log n)) +// public boolean isAnagram(String s, String t) { +// +// if (s.length() != t.length()) { +// return false; +// } +// +// char[] sArr = s.toCharArray(); +// char[] tArr = t.toCharArray(); +// +// Arrays.sort(sArr); +// Arrays.sort(tArr); +// +// for (int i = 0; i < sArr.length; i++) { +// if (sArr[i] != tArr[i]) { +// return false; +// } +// } +// +// return true; +// +// } + +} + From 706f7387268901b2becd708762c5142aff0eac9b Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Tue, 8 Apr 2025 00:30:32 +0900 Subject: [PATCH 3/4] add: product of array except self solution --- product-of-array-except-self/Tessa1217.java | 26 +++++++++++++++ validate-binary-search-tree/Tessa1217.java | 36 +++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 product-of-array-except-self/Tessa1217.java create mode 100644 validate-binary-search-tree/Tessa1217.java diff --git a/product-of-array-except-self/Tessa1217.java b/product-of-array-except-self/Tessa1217.java new file mode 100644 index 000000000..8e5db1295 --- /dev/null +++ b/product-of-array-except-self/Tessa1217.java @@ -0,0 +1,26 @@ +/** + 정수 배열 nums가 주어질 때 answer[i]가 nums[i]를 제외한 나머지 요소의 곱인 answer 배열을 반환하시오. + */ +public class Solution { + + /** 시간복잡도 O(n) */ + public int[] productExceptSelf(int[] nums) { + + int[] answer = new int[nums.length]; + + int start = 1; + for (int i = 0; i < nums.length; i++) { + answer[i] = start; + start *= nums[i]; + } + + int end = 1; + for (int i = nums.length - 1; i >= 0; i--) { + answer[i] *= end; + end *= nums[i]; + } + + return answer; + } +} + diff --git a/validate-binary-search-tree/Tessa1217.java b/validate-binary-search-tree/Tessa1217.java new file mode 100644 index 000000000..413f6196c --- /dev/null +++ b/validate-binary-search-tree/Tessa1217.java @@ -0,0 +1,36 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode() {} + * TreeNode(int val) { this.val = val; } + * TreeNode(int val, TreeNode left, TreeNode right) { + * this.val = val; + * this.left = left; + * this.right = right; + * } + * } + */ +/** + 이진 트리의 root가 주어졌을 때 유효한 이진 탐색 트리인지 검증하세요. + */ +class Solution { + + /** 시간복잡도 O(n) */ + public boolean isValidBST(TreeNode root) { + return isValidRange(root, Long.MIN_VALUE, Long.MAX_VALUE); + } + + private boolean isValidRange(TreeNode root, long min, long max) { + if (root == null) { + return true; + } + if (root.val <= min || root.val >= max) { + return false; + } + return isValidRange(root.left, min, root.val) && isValidRange(root.right, root.val, max); + } +} + From 95ce67e786300c0f916614303a8345956a5f61da Mon Sep 17 00:00:00 2001 From: Tessa1217 Date: Thu, 10 Apr 2025 23:07:14 +0900 Subject: [PATCH 4/4] add 3sum solution --- 3sum/Tessa1217.java | 63 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 3sum/Tessa1217.java diff --git a/3sum/Tessa1217.java b/3sum/Tessa1217.java new file mode 100644 index 000000000..9b746709a --- /dev/null +++ b/3sum/Tessa1217.java @@ -0,0 +1,63 @@ +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; + +// 정수 배열 nums가 주어질 때 nums[i], nums[j], nums[k]로 이루어진 배열을 반환하시오 +// 반환 배열 조건: i 가 j와 같지 않고, i가 k와 같지 않으며 세 요소의 합이 0인 배열 +class Solution { + + // 시간복잡도: O(n^2) + public List> threeSum(int[] nums) { + + Arrays.sort(nums); + + List> answer = new ArrayList<>(); + + int left = 0; + int right = 0; + int sum = 0; + + for (int i = 0; i < nums.length - 2 && nums[i] <= 0; i++) { + + // 중복 제거 + if (i > 0 && nums[i] == nums[i - 1]) { + continue; + } + + left = i + 1; + right = nums.length - 1; + + while (left < right) { + + sum = nums[i] + nums[left] + nums[right]; + // System.out.println(String.format("%d, %d, %d", i, left, right)); + // System.out.println(String.format("%d + %d + %d = %d", nums[i], nums[left], nums[right], sum)); + if (sum < 0) { + left++; + continue; + } + if (sum > 0) { + right--; + continue; + } + + answer.add(List.of(nums[i], nums[left], nums[right])); + + // 중복 제거 + while (left < right && left + 1 < nums.length && nums[left] == nums[left + 1]) { + left++; + } + while (left < right && right - 1 >= 0 && nums[right] == nums[right - 1]) { + right--; + } + left++; + right--; + + } + } + + return answer; + } + +} +