From 607fd86dce611244ed0698039c4270d177b6c6d9 Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sat, 8 Nov 2025 11:42:42 +0900 Subject: [PATCH 01/11] =?UTF-8?q?PR=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contains-duplicate/haxr369.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 contains-duplicate/haxr369.java diff --git a/contains-duplicate/haxr369.java b/contains-duplicate/haxr369.java new file mode 100644 index 0000000000..bff59d1184 --- /dev/null +++ b/contains-duplicate/haxr369.java @@ -0,0 +1 @@ +// PR 테스브 \ No newline at end of file From 96f3c733e8d7a21f29a3d9f2ea0562b86702a770 Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sat, 8 Nov 2025 11:45:56 +0900 Subject: [PATCH 02/11] =?UTF-8?q?=EA=B0=9C=ED=96=89=EB=AC=B8=EC=9E=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contains-duplicate/haxr369.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contains-duplicate/haxr369.java b/contains-duplicate/haxr369.java index bff59d1184..ae01c82289 100644 --- a/contains-duplicate/haxr369.java +++ b/contains-duplicate/haxr369.java @@ -1 +1,2 @@ -// PR 테스브 \ No newline at end of file +// PR 테스트 +// 개행문자 추가 From 3f39badf4dbcbf66797e12c4d363d5bfc32d8b7e Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sat, 8 Nov 2025 13:42:39 +0900 Subject: [PATCH 03/11] feat: contains-duplicate solve --- contains-duplicate/haxr369.java | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/contains-duplicate/haxr369.java b/contains-duplicate/haxr369.java index ae01c82289..aa7074ba4e 100644 --- a/contains-duplicate/haxr369.java +++ b/contains-duplicate/haxr369.java @@ -1,2 +1,24 @@ -// PR 테스트 -// 개행문자 추가 +class Solution { + public boolean containsDuplicate(int[] nums) { + /** + * Runtime: 14 ms (Beats 62.49%) + * Space Complexity: O(N) + * > nums 배열 길이 N. 중복하지 않은 모든 요소가 Set에 들어가기 때문에 O(N) + * Time Complexity: O(N) ~ O(NlogN) + * - 크기 N 배열 조회에 O(N) + * - Set에 숫자 중복 체크 O(1) + * - 단, 최악에 경우로 중복 체크에 O(logN)이 발생 가능 + * > O(N) * O(1) ~ O(NlogN) + * Memory: 93.28 (Beats 6.24%) + */ + Set st = new HashSet<>(); + for (int n : nums) { + if (st.contains(n)) { + return true; + } + st.add(n); + } + return false; + + } +} \ No newline at end of file From e2094ec1e6e988833a94f7cebdde9f0f2e7ed05d Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sat, 8 Nov 2025 14:54:50 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat:=20two=20sum=20=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- two-sum/haxr369.java | 55 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 two-sum/haxr369.java diff --git a/two-sum/haxr369.java b/two-sum/haxr369.java new file mode 100644 index 0000000000..94214184f5 --- /dev/null +++ b/two-sum/haxr369.java @@ -0,0 +1,55 @@ +class Solution { + /** + * 합해서 target이 되는 두 수의 인덱스를 배열에 넣어서 return. + * 1. nums 정렬하기 + * 2. smlNumbIdx(초기 0), lrgNumbIdx(초기 nums.length - 1)에 인덱스를 저장 + * 3. smlNumb와 lrgNumb를 합해서 tmp를 계산 + * 4. tmp와 target을 비교. + * 4.1. tmp < target인 경우 + * smlNumbIdx에 1 더하기 + * 4.2. tmp > target인 경우 + * lrgNumbIdx에 1 빼기 + * 4.3. tmp = target인 경우 + * smlNumbIdx와 lrgNumbIdx 배열 return + */ + public int[] twoSum(int[] nums, int target) { + /** + * Runtime: 8 ms (Beats 47.90%) + * Memory: 46.70 (Beats 5.05%) + * Space Complexity: O(N) + * > Arrays.sort의 객체 타입은 tim sort를 이용하기 때문에 O(N)을 가짐 + * Time Complexity: O(NlogN) + * - 크기 Nx2 배열에 값과 인덱스를 넣기 => O(N) + * - tim sort를 이용한 정렬 => O(NlogN) + * - N회 for문으로 정답 인덱스 찾기 => O(N) + * > O(N) + O(NlogN) + O(N) ~= O(NlogN) + */ + int[][] arr = new int[nums.length][2]; + for (int i = 0; i < nums.length; i++) { + arr[i][0] = nums[i]; + arr[i][1] = i; + } + Arrays.sort(arr, (a, b) -> { + if (a[0] != b[0]) + return Integer.compare(a[0], b[0]); + return 1; // 동일하면 상관 없음. + }); + + int smlNumbIdx = 0; + int lrgNumbIdx = nums.length - 1; + for (int i = 0; i < arr.length; i++) { + if (arr[smlNumbIdx][0] + arr[lrgNumbIdx][0] == target) { + int[] ans = { arr[smlNumbIdx][1], arr[lrgNumbIdx][1] }; + return ans; + } else if (arr[smlNumbIdx][0] + arr[lrgNumbIdx][0] < target) { + smlNumbIdx++; + } else { + lrgNumbIdx--; + } + } + + // 문제는 없지만, 예외케이스가 발생할 수 있으니 더미 데이터 출력 + int[] ans = { 0, nums.length }; + return ans; + } +} \ No newline at end of file From 3080a7bd5d0ffcaf9219b34b25c84f36dcc10507 Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sat, 8 Nov 2025 14:55:10 +0900 Subject: [PATCH 05/11] =?UTF-8?q?fix:=20=EA=B0=9C=ED=96=89=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- two-sum/haxr369.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/two-sum/haxr369.java b/two-sum/haxr369.java index 94214184f5..90f5d4c81d 100644 --- a/two-sum/haxr369.java +++ b/two-sum/haxr369.java @@ -52,4 +52,4 @@ public int[] twoSum(int[] nums, int target) { int[] ans = { 0, nums.length }; return ans; } -} \ No newline at end of file +} From e8e98af2493e12d9e85131a3c2034d4fb66e6885 Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sat, 8 Nov 2025 14:56:14 +0900 Subject: [PATCH 06/11] =?UTF-8?q?fix:=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=9E=84=ED=8F=AC=ED=8A=B8,=20=EA=B0=9C=ED=96=89=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contains-duplicate/haxr369.java | 5 ++++- two-sum/haxr369.java | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/contains-duplicate/haxr369.java b/contains-duplicate/haxr369.java index aa7074ba4e..ba92b61a60 100644 --- a/contains-duplicate/haxr369.java +++ b/contains-duplicate/haxr369.java @@ -1,3 +1,6 @@ +import java.util.HashSet; +import java.util.Set; + class Solution { public boolean containsDuplicate(int[] nums) { /** @@ -21,4 +24,4 @@ public boolean containsDuplicate(int[] nums) { return false; } -} \ No newline at end of file +} diff --git a/two-sum/haxr369.java b/two-sum/haxr369.java index 90f5d4c81d..6efc65cf52 100644 --- a/two-sum/haxr369.java +++ b/two-sum/haxr369.java @@ -1,3 +1,5 @@ +import java.util.Arrays; + class Solution { /** * 합해서 target이 되는 두 수의 인덱스를 배열에 넣어서 return. From be216c99431283aece86c591fd7133d3536b82a6 Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sat, 8 Nov 2025 16:09:17 +0900 Subject: [PATCH 07/11] =?UTF-8?q?feat:=20topKFrequent=20=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- top-k-frequent-elements/haxr369.java | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 top-k-frequent-elements/haxr369.java diff --git a/top-k-frequent-elements/haxr369.java b/top-k-frequent-elements/haxr369.java new file mode 100644 index 0000000000..a7b3e465e0 --- /dev/null +++ b/top-k-frequent-elements/haxr369.java @@ -0,0 +1,50 @@ +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +class Solution { + /** + * 30분 38초 소요. + * nums에서 가장 자주 등장하는 k개 숫자 리턴하기 + * Map에 요소:등장수로 관리하기 + * Stream으로 등장수 기준으로 내림차순 정렬 후 k개만 리스트로 만들어서 출력한다. + * + * Java의 Stream과 Comparator 사용법을 익혀야함. + * Comparable도 몰랐던 부분. + */ + public int[] topKFrequent(int[] nums, int k) { + /** + * Runtime: 21 ms (Beats 6.30%) + * Memory: 47.42 (Beats 83.73%) + * Space Complexity: O(N) + * - HashMap 공간복잡도 => O(N) + * - sort에서 tim sort 사용 => O(N) + * > O(N) + * Time Complexity: O(NlogN) + * - tim sort를 이용한 정렬 => O(NlogN) + * > O(N) + O(NlogN) + O(N) ~= O(NlogN) + */ + + Map mp = new HashMap<>(); + for (int n : nums) { + if (mp.containsKey(n)) { + mp.put(n, mp.get(n) + 1); + } else { + mp.put(n, 1); + } + } + List li = mp.entrySet().stream() + // 값을 기준으로 내림차순 정렬 + .sorted(Map.Entry.comparingByValue().reversed()) + .limit(k) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + int[] ans = new int[li.size()]; + for (int i = 0; i < li.size(); i++) { + ans[i] = li.get(i); + } + return ans; + } +} From 23cccab08c8ddcb148bbe08f147266fe4286968b Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sat, 8 Nov 2025 16:50:00 +0900 Subject: [PATCH 08/11] =?UTF-8?q?feat:=20longest-consecutive-seq=20?= =?UTF-8?q?=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- longest-consecutive-sequence/haxr369.java | 36 +++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 longest-consecutive-sequence/haxr369.java diff --git a/longest-consecutive-sequence/haxr369.java b/longest-consecutive-sequence/haxr369.java new file mode 100644 index 0000000000..935085e5f0 --- /dev/null +++ b/longest-consecutive-sequence/haxr369.java @@ -0,0 +1,36 @@ +import java.util.Arrays; + +class Solution { + /** + * Runtime: 23 ms (Beats 80.31%) + * Memory: 77.33 (Beats 9.66%) + * Space Complexity: O(N) + * - 원소 배열 정렬은 듀얼 피봇 sort => O(logN) + * > O(N) + O(logN) ~= O(N) + * Time Complexity: O(NlogN) + * - 듀얼 피봇 sort를 이용한 정렬 => O(NlogN) + * - 배열을 처음부터 끝까지 조회, 이전 값과 비교 => O(N)*O(1) + * > O(NlogN) + O(N) ~= O(NlogN) + */ + public int longestConsecutive(int[] nums) { + Arrays.sort(nums); + + if (nums.length == 0) { + return 0; + } + int ans = 1; + int seqLgth = 1; + for (int i = 1; i < nums.length; i++) { + // 바로 연결되는 경우는 바로 이전 요소 보다 1이 더 커야함. + if (nums[i - 1] < nums[i] && nums[i] - nums[i - 1] == 1) { + nums[i - 1] = nums[i]; + seqLgth++; + ans = Integer.max(ans, seqLgth); // 항상 ans 업데이트 하기 + } else if (nums[i - 1] < nums[i] && nums[i] - nums[i - 1] > 1) { + // 새로운 연결로 들어가기 + seqLgth = 1; + } + } + return ans; + } +} \ No newline at end of file From 9d1bdb074d29507363199ee3ec806544ae9e5539 Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sat, 8 Nov 2025 16:54:20 +0900 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20=ED=92=80=EC=9D=B4=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- longest-consecutive-sequence/haxr369.java | 1 + 1 file changed, 1 insertion(+) diff --git a/longest-consecutive-sequence/haxr369.java b/longest-consecutive-sequence/haxr369.java index 935085e5f0..014e16076c 100644 --- a/longest-consecutive-sequence/haxr369.java +++ b/longest-consecutive-sequence/haxr369.java @@ -2,6 +2,7 @@ class Solution { /** + * 13분 소요. * Runtime: 23 ms (Beats 80.31%) * Memory: 77.33 (Beats 9.66%) * Space Complexity: O(N) From fc4e524f1862bfb4a428108d74e1bda219e6059a Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sun, 9 Nov 2025 18:54:01 +0900 Subject: [PATCH 10/11] =?UTF-8?q?fix:=20=EC=A4=84=20=EB=B0=94=EA=BF=88=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- longest-consecutive-sequence/haxr369.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/longest-consecutive-sequence/haxr369.java b/longest-consecutive-sequence/haxr369.java index 014e16076c..6fff1e7231 100644 --- a/longest-consecutive-sequence/haxr369.java +++ b/longest-consecutive-sequence/haxr369.java @@ -34,4 +34,4 @@ public int longestConsecutive(int[] nums) { } return ans; } -} \ No newline at end of file +} From 73ac83a5859d4ea14c15984ceb40154017bfa3bc Mon Sep 17 00:00:00 2001 From: ohchansol Date: Sun, 9 Nov 2025 19:18:33 +0900 Subject: [PATCH 11/11] =?UTF-8?q?feat:=20house-robber=20=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- house-robber/haxr369.java | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 house-robber/haxr369.java diff --git a/house-robber/haxr369.java b/house-robber/haxr369.java new file mode 100644 index 0000000000..0e577d1b66 --- /dev/null +++ b/house-robber/haxr369.java @@ -0,0 +1,41 @@ +class Solution { + /** + * 인전합 두 집을 털면 안됨 + * + * i번째 집에서 할 수 있는 행위는? 2가지. + * 털거나: + * 털면 i-1번째 집은 안 털어야함, i-2번째 집은 털어도 괜찮겠지? + * Money_A = nums[i] + DP[i-2] + * 털지 않거나: + * i번째 집을 안 털면, i-1번째집은 털어도 괜찮다. + * Money_B = DP[i-1] + * dp[i]를 i번째 집 앞에서 들고 있을 최대 금액이라고 할 때, + * dp[i] = MAX(Money_A, Money_B) + * 문제는 dp[nums.length-1]을 구하기 + */ + public int rob(int[] nums) { + /** + * 12분 소요. + * Runtime: 0 ms (Beats 100%) + * Memory: 42.74 MB (Beats 6.31%) + * Space Complexity: O(N) + * - nums 저장 => O(N) + * - 최대 금액 저장 배열 => O(N) + * > O(2N) ~= O(N) + * Time Complexity: O(N) + * - nums 처음부터 끝까지 조회하며 dp 저장. => O(N) + * > O(N) + */ + int[] dp = new int[nums.length]; + + dp[0] = nums[0]; + if (nums.length > 1) { + dp[1] = Integer.max(dp[0], nums[1]); + } + for (int i = 2; i < nums.length; i++) { + // 터는 경우와 안터는 경우 중 최대 값. + dp[i] = Integer.max(dp[i - 2] + nums[i], dp[i - 1]); + } + return dp[nums.length - 1]; + } +}