From dbb273797e407b4e830693b97339cc4178b37fcc Mon Sep 17 00:00:00 2001 From: sangyyypark Date: Sun, 9 Nov 2025 20:22:40 +0900 Subject: [PATCH 1/7] add contains-duplicate --- contains-duplicate/sangyyypark.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 contains-duplicate/sangyyypark.java diff --git a/contains-duplicate/sangyyypark.java b/contains-duplicate/sangyyypark.java new file mode 100644 index 0000000000..fa50cf610a --- /dev/null +++ b/contains-duplicate/sangyyypark.java @@ -0,0 +1,26 @@ +/** + * 1 .문제 정의 + * 배열이 주어지면, 배열에 포함된 정수가 중복이 없다면 fasle, 적어도 1회 이상 중복이 있다면 true를 반환해야한다. + * 배열의 크기는? + * - 1 <= length <= 100000 + * 2. naive algorithm 도출 + * - 배열을 탐색하면서 Set자료구조에 넣는다. 이때 Set에 넣으려는 값이 이미 포함되어있는지를 확인합니다.. true를 반환. + * - 배열 전체를 탐색했는데 포함여부에서 걸리지 않으면 false를 반환 + * 3. 시간&공간복잡도 분석 + * - 배열의 길이가 N이면 O(N)의 시간 복잡도 + * 4. 코드작성 + */ +import java.util.*; +public class sangyyypark { + public boolean containsDuplicate(int[] nums) { + Set set = new HashSet<>(); + for(int i = 0; i < nums.length; i++) { + int value = nums[i]; + if(set.contains(value)) { + return true; + } + set.add(value); + } + return false; + } +} From 6ea64c680289cc204b8eb3dee22714300b030b2f Mon Sep 17 00:00:00 2001 From: sangyyypark Date: Mon, 10 Nov 2025 17:15:26 +0900 Subject: [PATCH 2/7] add new line --- contains-duplicate/sangyyypark.java | 1 + 1 file changed, 1 insertion(+) diff --git a/contains-duplicate/sangyyypark.java b/contains-duplicate/sangyyypark.java index fa50cf610a..322fce4b19 100644 --- a/contains-duplicate/sangyyypark.java +++ b/contains-duplicate/sangyyypark.java @@ -24,3 +24,4 @@ public boolean containsDuplicate(int[] nums) { return false; } } + From 6d683bceaace1107c097f35056269bd0f8212deb Mon Sep 17 00:00:00 2001 From: sangyyypark Date: Mon, 10 Nov 2025 17:45:20 +0900 Subject: [PATCH 3/7] Add two sum --- two-sum/sangyyypark.java | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 two-sum/sangyyypark.java diff --git a/two-sum/sangyyypark.java b/two-sum/sangyyypark.java new file mode 100644 index 0000000000..182b544d1b --- /dev/null +++ b/two-sum/sangyyypark.java @@ -0,0 +1,59 @@ +/** + * 1 .문제 정의 + * 배열이 주어지면, 배열에 포함된 정수가 중복이 없다면 fasle, 적어도 1회 이상 중복이 있다면 true를 반환해야한다. + * 배열의 크기는? + * - 1 <= length <= 100000 + * 2. naive algorithm 도출 + * - 배열을 탐색하면서 Set자료구조에 넣는다. 이때 Set에 넣으려는 값이 이미 포함되어있는지를 확인합니다.. true를 반환. + * - 배열 전체를 탐색했는데 포함여부에서 걸리지 않으면 false를 반환 + * 3. 시간&공간복잡도 분석 + * - 배열의 길이가 N이면 O(N)의 시간 복잡도 + * 4. 코드작성 + */ +import java.util.*; + +/** + * 1 .문제 정의 + * 배열에서 동일한 숫자를 사용하지 않고 두개의 숫자를 선택해서 합이 target이 나오는지 판별해야 하는 문제 + * - 배열의 길이는? + * - 2 <= length <= 10000 라고 가정합니다. + * - target을 만드는 경우가 여러개가 있다면? + * - 오직 하나의 경우만 있다고 가정합니다. + * 2. naive algorithm 도출 + * - 투포인터 알고리즘을 사용해서 구현 + * - left,right를 각각 선정합니다. + * - left와 right가 같으면 합을 구하지 않고 Right를 1칸 전진합니다. + * - left와 right의 합을 구해서 target이 아니라면 right를 1칸 전진합니다. + * - right가 마지막에 도달했는데도 target이 아니라면 left를 1칸 전진합니다. + * - 위 과정을 반복합니다. + * 3. 시간&공간복잡도 분석 + * - 투포인터 알고리즘의 시간복잡도는 O(N^2) + * 4. 코드작성 + */ +public class sangyyypark { + public int[] twoSum(int[] nums, int target) { + int left = 0; + int right = 1; + int [] answer = new int [2]; + while(left < nums.length && right < nums.length) { + int a = nums[left]; + int b = nums[right]; + if(target == a + b) { + answer[0] = left; + answer[1] = right; + break; + } + + + if(right >= nums.length -1) { + left++; + right = left+1; + } + else { + right++; + } + } + return answer; + } +} + From d031f8e1d68333e348e487e437355f89239ab67a Mon Sep 17 00:00:00 2001 From: sangyyypark Date: Tue, 11 Nov 2025 17:23:38 +0900 Subject: [PATCH 4/7] add top n frequent elements --- top-k-frequent-elements/sangyyypark.java | 50 ++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 top-k-frequent-elements/sangyyypark.java diff --git a/top-k-frequent-elements/sangyyypark.java b/top-k-frequent-elements/sangyyypark.java new file mode 100644 index 0000000000..6c3dbd644a --- /dev/null +++ b/top-k-frequent-elements/sangyyypark.java @@ -0,0 +1,50 @@ +import java.util.*; +/** + * 1 .문제 정의 + + 배열이 있는데 여기서 각 숫자가 등장한 빈도수를 체크하고 K번째 까지 높은 빈도로 등장한 수를 리턴하는 문제입니다. + + - n의 길이는 1 ~ 10000 + + * 2. naive algorithm 도출 + + 배열을 순회함면서 Map에 넣으면서 빈도수를 체크. + 빈도수 계산이 끝나고 나면 빈도수를 기준으로 내림차순 정렬 + + * + * 3. 시간&공간복잡도 분석 + * O(N) + O(M) + O(M log M) + O(K) = O(N + N log N) = O(N log N) + + * 4. 코드작성 + */ +class sangyyypark { + public int[] topKFrequent(int[] nums, int k) { + Map map = new HashMap<>(); + for(int i = 0; i < nums.length; i++) { + int num = nums[i]; + if(map.containsKey(num)) { + map.put(num, map.get(num) + 1); + } + else { + map.put(num,1); + } + } + + List keySet = new ArrayList<>(map.keySet()); + keySet.sort(new Comparator() { + @Override + public int compare(Integer o1, Integer o2) { + return map.get(o2).compareTo(map.get(o1)); + } + }); + + int [] result = new int[k]; + int index = 0; + for(int i = 0; i < k; i++) { + result[index] = keySet.get(i); + index++; + } + return result; + } +} + From 58bd49b64079f17f21934e8b092e0ec8afb6057b Mon Sep 17 00:00:00 2001 From: sangyyypark Date: Wed, 12 Nov 2025 17:24:55 +0900 Subject: [PATCH 5/7] add longest consecutive sequence --- longest-consecutive-sequence/sangyyypark.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 longest-consecutive-sequence/sangyyypark.java diff --git a/longest-consecutive-sequence/sangyyypark.java b/longest-consecutive-sequence/sangyyypark.java new file mode 100644 index 0000000000..d41b3ea21b --- /dev/null +++ b/longest-consecutive-sequence/sangyyypark.java @@ -0,0 +1,37 @@ + +import java.util.HashSet; +import java.util.Set; +/** + 각 연속 수열의 시작점에서만 카운팅하기 + + 1. 모든 숫자를 Set에 넣기 + 2. 배열을 탐색하면서 현재 index에 해당하는 숫자 -1 값이 Set에 존재하는지 확인 + 3. 만약 Set에 값이 존재한다면 연속된 숫자의 시작지점이 아니다. + 4. 만약 Set에 값이 존재하지 않는다면 연속된 숫자의 시작지점이다. + 5. 시작지점을 찾았으면 num + 1값이 존재하는지 확인, num+2값이 존재하는지 확인하면서 등장하지 않을때 까지 체크하고 길이를 최대 길이와 비교한다. (이때 배열을 기준으로 탐색하면 배열에 중복 숫자가 있을경우 매번 중복숫자에 대해서 length를 체크해야하므로 Set이 이득임) + */ +class sangyyypark { + public int longestConsecutive(int[] nums) { + Set set = new HashSet<>(); + for(int i = 0; i < nums.length; i++) { + int num = nums[i]; + set.add(num); + } + int max = 0; + + for(int num : set) { + if(set.contains(num-1)) { + continue; + } + int index = 1; + int length = 1; + while(set.contains(num+index)) { + index++; + length++; + } + max = Math.max(max,length); + } + return max; + } +} + From b4fd371a7a8c9cb584023e5ccea25011e64576f3 Mon Sep 17 00:00:00 2001 From: sangyyypark Date: Sat, 15 Nov 2025 08:43:54 +0900 Subject: [PATCH 6/7] add house robber --- house-robber/sangyyypark.java | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 house-robber/sangyyypark.java diff --git a/house-robber/sangyyypark.java b/house-robber/sangyyypark.java new file mode 100644 index 0000000000..2b4b04c13c --- /dev/null +++ b/house-robber/sangyyypark.java @@ -0,0 +1,39 @@ +/** + 배열은 강도가 털 집의 돈을 순서대로 나타냅니다. + * + * 인접한 두 집을 동시에 털면 경찰에 알림이 가기 때문에 피해야 합니다. + * + * 하루에 훔칠 수 있는 가장 많은 돈을 구하는 문제입니다. + * + * + * 2. naive 알고리즘 도출 + * + * - 현재 집을 털기 → 바로 이전 집은 못 털었으므로 prev2 + 현재집 + * - 현재 집을 안 털기 → 이전까지의 최댓값 유지 prev1 + */ +class sangyyypark { + public static int rob(int[] nums) { + if (nums == null || nums.length == 0) { + return 0; + } + if (nums.length == 1) { + return nums[0]; + } + + + int prev2 = 0; // i-2번째 집까지의 최대 금액 + int prev1 = 0; // i-1번째 집까지의 최대 금액 + + for (int num : nums) { + // 현재 집을 털 경우: prev2 + num + // 현재 집을 안 털 경우: prev1 + int current = Math.max(prev1, prev2 + num); + + + prev2 = prev1; + prev1 = current; + } + + return prev1; + } +} \ No newline at end of file From ac63034b9f03cbe1fbb4bea19465710d7a6da98a Mon Sep 17 00:00:00 2001 From: sangyyypark Date: Sat, 15 Nov 2025 08:44:22 +0900 Subject: [PATCH 7/7] add new line --- house-robber/sangyyypark.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/house-robber/sangyyypark.java b/house-robber/sangyyypark.java index 2b4b04c13c..9c018dc850 100644 --- a/house-robber/sangyyypark.java +++ b/house-robber/sangyyypark.java @@ -36,4 +36,5 @@ public static int rob(int[] nums) { return prev1; } -} \ No newline at end of file +} +