Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions contains-duplicate/sonshn.java

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🏷️ 알고리즘 패턴 분석

  • 패턴: Hash Map / Hash Set, Greedy
  • 설명: 집합을 이용해 중복 여부를 빠르게 확인하는 방식으로, 한 번의 순회와 상수/로그 수준의 탐색으로 중복 여부를 판단하므로 해시 기반 패턴과 간단한 탐색 흐름이 결합됩니다.

📊 시간/공간 복잡도 분석

ℹ️ 이 파일에는 2가지 풀이가 포함되어 있어 각각 분석합니다.

풀이 1: Solution.containsDuplicate — Time: ✅ O(n) → O(n) / Space: ✅ O(n) → O(n)
유저 분석 실제 분석 결과
Time O(n) O(n)
Space O(n) O(n)

피드백: 집합에 값을 하나씩 삽입하며 중복 여부를 체크하므로 시간은 배열 길이에 비례하고, 추가적인 저장공간은 중복 여부를 판단하기 위해 필요합니다.

개선 제안: 현재 구현이 적절해 보입니다.

풀이 2: Solution.containsDuplicate — Time: ✅ O(n) → O(n) / Space: ✅ O(n) → O(n)
유저 분석 실제 분석 결과
Time O(n) O(n)
Space O(n) O(n)

피드백: 집합에 값을 하나씩 삽입하며 중복 여부를 체크하므로 시간은 배열 길이에 비례하고, 추가적인 저장공간은 중복 여부를 판단하기 위해 필요합니다.

개선 제안: 현재 구현이 적절해 보입니다.

Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/**
* HashSet을 사용하여 배열에 중복된 값이 있는지 확인
* 시간 복잡도: O(n), 공간 복잡도: O(n)
*/
class Solution {
public boolean containsDuplicate(int[] nums) {
HashSet<Integer> distinctSet = new HashSet<>();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 코드에서는 HashSet 고유 기능보다는 Set 인터페이스에서 제공하는 contains, add 메서드만 사용하고 있는 것 같습니다.

그래서 변수 타입을 HashSet로 두기보다,
인터페이스 타입인 Set로 선언해도 괜찮을 것 같은데
혹시 따로 HashSet 구현체로 명시하신 이유가 있을까요?


for (int i = 0; i < nums.length; i++) {
if (distinctSet.contains(nums[i])) return true;
distinctSet.add(nums[i]);
}

return false;
}
}
21 changes: 21 additions & 0 deletions house-robber/sonshn.java

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🏷️ 알고리즘 패턴 분석

  • 패턴: Depth-First Search, Backtracking, Dynamic Programming
  • 설명: 재귀 DFS를 사용해 현재 집에서 털고 다음 이웃을 건너뛰는 경우를 분기하여 최적해를 찾는 패턴이다. 중복 계산이 있어 비효율적이나, 하위 문제를 재귀적으로 해결하는 구조가 Backtracking 및 DP의 기초가 된다.

📊 시간/공간 복잡도 분석

유저 분석 실제 분석 결과
Time O(2^n) O(2^n)
Space O(2^n) O(n)

피드백: 각 위치에서 두 가지 선택(도둑질-현 위치 건너뛰기 vs 건너뛰기)으로 분기하며 중복 재귀 호출이 많아 지수 시간 복잡도가 됩니다. 메모이제이션이 필요합니다.

개선 제안: 고려해볼 만한 대안: 메모이제이션(탐색 중복 제거) 또는 DP bottom-up로 시간 복잡도를 O(n)으로 개선.

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/**
* DFS를 이용한 재귀 풀이
*
* 시간 복잡도: O(2^n), 공간 복잡도: O(n)
*/
class Solution {
public int rob(int[] nums) {
return dfs(nums, 0);
}

private int dfs(int[] nums, int start) {
if (start >= nums.length) {
return 0;
}

return Math.max(
nums[start] + dfs(nums, start + 2),
dfs(nums, start + 1)
);
}
}
35 changes: 35 additions & 0 deletions longest-consecutive-sequence/sonshn.java

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🏷️ 알고리즘 패턴 분석

  • 패턴: Binary Search, Greedy, Sort/Order-based Pattern
  • 설명: 주어진 코드는 배열을 정렬한 뒤 인접 요소를 비교하여 연속 부분수열의 길이를 추적합니다. 정렬이 핵심 전제이며, 연속 여부 판단과 구간 길이의 최댓값 갱신이 주된 작업입니다.

📊 시간/공간 복잡도 분석

유저 분석 실제 분석 결과
Time O(n log n) O(n log n)
Space O(n log n) O(1)

피드백: 정렬이 필요해 전체 복잡도가 O(n log n)으로 증가합니다. 중복 제거 및 선형 해법도 가능하지만 현재 방식은 간단합니다.

개선 제안: 현재 구현이 적절해 보입니다.

Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import java.util.*;

/**
* 주어진 배열에서 연속된 정수의 가장 긴 길이를 찾는 문제
*
* 시간 복잡도: O(n log n), 공간 복잡도: O(1)
*/
class Solution {
public int longestConsecutive(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}

Arrays.sort(nums);

int longest = 0;
int length = 1;

for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] == nums[i + 1]) {
continue;
}

if (nums[i] + 1 == nums[i + 1]) {
length++;
} else {
longest = Math.max(longest, length);
length = 1;
}
}

longest = Math.max(longest, length);
return longest;
}
}
40 changes: 40 additions & 0 deletions top-k-frequent-elements/sonshn.java

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🏷️ 알고리즘 패턴 분석

  • 패턴: Hash Map / Hash Set, Sorting
  • 설명: 해당 코드는 각 숫자의 빈도수를 HashMap으로 계산하고, 빈도수 기준으로 정렬한 후 상위 k개를 선택합니다. 따라서 Hash Map 패턴과 정렬(Sort) 패턴이 주로 사용됩니다.

📊 시간/공간 복잡도 분석

ℹ️ 이 파일에는 2가지 풀이가 포함되어 있어 각각 분석합니다.

풀이 1: Solution.topKFrequent — Time: ❌ O(n log n) → O(n log m) / Space: ❌ O(n) → O(m)
유저 분석 실제 분석 결과
Time O(n log n) O(n log m)
Space O(n) O(m)

피드백: 빈도 계산과 정렬로 간단하게 해결하지만, n은 배열 길이, m은 고유 숫자 수입니다. 정렬 대신 힙(heap)을 사용하면 O(n log k)도 가능.

개선 제안: 고려해볼 만한 대안: 해시맵 + 힙을 사용해 상위 k개를 추출하는 방식으로 개선.

풀이 2: Solution.topKFrequent — Time: ❌ O(n log n) → O(n log m) / Space: ❌ O(n) → O(m)
유저 분석 실제 분석 결과
Time O(n log n) O(n log m)
Space O(n) O(m)

피드백: 빈도 계산과 정렬로 간단하게 해결하지만, n은 배열 길이, m은 고유 숫자 수입니다. 정렬 대신 힙(heap)을 사용하면 O(n log k)도 가능.

개선 제안: 고려해볼 만한 대안: 해시맵 + 힙을 사용해 상위 k개를 추출하는 방식으로 개선.

Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@

/**
* 풀이
* 1. 빈도수 계산
* - HashMap<Integer, Integer>을 사용하여 각 숫자의 등장 횟수를 저장
* - Key는 숫자, Value는 해당 숫자의 빈도수
* 2. 고유 숫자 저장
* - counter.keySet()을 ArrayList로 변환하여 중복 없이 숫자들만 저장
* 3. 빈도수 기준 내림차순 정렬
* - list.sort((a, b) -> Integer.compare(counter.get(b), counter.get(a)))
* - HashMap에 저장된 빈도수를 기준으로 많이 등장한 숫자가 앞에 오도록 정렬
* 4. 상위 k개 반환
* - 정렬된 리스트의 앞에서부터 k개의 숫자를 result 배열에 담아 반환
*
* 시간 복잡도: O(n log n)
* 공간 복잡도: O(n)
*/
class Solution {
public int[] topKFrequent(int[] nums, int k) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지금 풀어주신 풀이도 충분히 직관적이고 이해하기 좋은 것 같습니다.
다만 이 문제의 경우, 결과로 필요한 값은 상위 k개뿐이기 때문에 모든 고유 숫자를 정렬하지 않고 필요한 개수만 유지하는 방식도 고려해볼 수 있을 것 같습니다.

예를 들어 PriorityQueue를 활용하면 상위 k개의 후보만 관리할 수 있어서 고유 숫자의 개수가 많고 k가 상대적으로 작을 때 정렬 비용을 줄이는 데 도움이 될 수 있을 것 같습니다.


Map<Integer, Integer> counter = new HashMap<>();

for (int num : nums) {
counter.put(num, counter.getOrDefault(num, 0) + 1);
}

List<Integer> list = new ArrayList<>(counter.keySet());

// 빈도수 내림차순 정렬
list.sort((a, b) -> Integer.compare(counter.get(b), counter.get(a)));

int[] result = new int[k];

for (int i = 0; i < k; i++) {
result[i] = list.get(i);
}

return result;
}
}
17 changes: 17 additions & 0 deletions two-sum/sonshn.java

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🏷️ 알고리즘 패턴 분석

  • 패턴: Brute Force
  • 설명: 두 개의 루프를 이용해 모든 쌍의 합을 검사하는 전형적인 브루트 포스(Brute Force) 방식으로 문제를 해결합니다.

📊 시간/공간 복잡도 분석

복잡도
Time O(n^2)
Space O(1)

피드백: 브루트포스 방식으로 구현되어 최악의 경우 큰 입력에서 비효율적입니다.

개선 제안: 고려해볼 만한 대안: 해시맵을 사용해 한 번의 순회로 해결하는 O(n) 풀이로 개선.

💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class Solution {
public int[] twoSum(int[] nums, int target) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이미 자동리뷰에도 달렸지만, 값을 더 빠르게 조회할 수 있는 자료구조를 활용하면 반복 횟수를 줄일 수 있을 것 같습니다!

int length = nums.length;

for (int first = 0; first < length - 1; first++) {
for (int second = first + 1; second < length; second++) {
int sum = nums[first] + nums[second];

if (sum == target) {
return new int[]{first, second};
}
}
}

return new int[0];
}
}
Loading