-
-
Notifications
You must be signed in to change notification settings - Fork 361
[sonshn] WEEK 04 Solutions #2754
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 15 commits
fcb31f4
6c69e25
9d7e093
7766ac3
32eb8b6
a1e4dde
d460b73
f3c4ef9
8d1ab21
63da3f1
1422ccd
aa73ee1
7ed860a
3ab760d
2fb1e56
2be8bc7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| /** | ||
| * dp[i] = dp[i - 1] + dp[i - 2] | ||
| */ | ||
| class Solution { | ||
| public int climbStairs(int n) { | ||
| if (n <= 2) { | ||
| return n; | ||
| } | ||
|
|
||
| int[] dp = new int[n + 1]; | ||
| dp[1] = 1; | ||
| dp[2] = 2; | ||
|
|
||
| for (int i = 3; i <= n; i++) { | ||
| dp[i] = dp[i - 1] + dp[i - 2]; | ||
| } | ||
|
|
||
| return dp[n]; | ||
| } | ||
| } |
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🏷️ 알고리즘 패턴 분석
📊 시간/공간 복잡도 분석
풀이 1:
|
| 유저 분석 | 실제 분석 | 결과 | |
|---|---|---|---|
| Time | O(n) | O(n) | ✅ |
| Space | O(h) | O(n) | ❌ |
피드백: 트리 각 노드를 한 번씩 방문하므로 시간 복잡도는 노드 수에 선형적입니다. 재귀 호출 깊이는 트리의 최대 높이에 의해 공간이 결정됩니다.
개선 제안: 현재 구현이 적절해 보입니다.
풀이 2: Solution.maxDepth — 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,57 @@ | ||
| /** | ||
| * 이진 트리의 최대 깊이를 재귀적으로 계산 (DFS) | ||
| * | ||
| * 시간 복잡도: O(n), n은 트리의 노드 수 | ||
| * 공간 복잡도: O(h), h는 트리의 높이, 재귀 호출로 인해 스택에 쌓이는 함수 호출의 깊이 때문 | ||
| */ | ||
| class Solution { | ||
| public int maxDepth(TreeNode root) { | ||
| if (root == null) { | ||
| return 0; | ||
| } | ||
|
|
||
| int leftDepth = maxDepth(root.left); | ||
| int rightDepth = maxDepth(root.right); | ||
|
|
||
| return Math.max(leftDepth, rightDepth) + 1; | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * 이진 트리의 최대 깊이를 반복적으로 계산 (BFS) | ||
| * | ||
| * 시간 복잡도: O(n), n은 트리의 노드 수 | ||
| * 공간 복잡도: O(n), 큐에 저장되는 노드 수 때문 | ||
| */ | ||
| class Solution { | ||
| public int maxDepth(TreeNode root) { | ||
| if (root == null) { | ||
| return 0; | ||
| } | ||
|
|
||
| Queue<TreeNode> queue = new LinkedList<>(); | ||
| queue.offer(root); | ||
|
|
||
| int depth = 0; | ||
|
|
||
| while (!queue.isEmpty()) { | ||
| int size = queue.size(); | ||
|
|
||
| for (int i = 0; i < size; i++) { | ||
| TreeNode current = queue.poll(); | ||
|
|
||
| if (current.left != null) { | ||
| queue.offer(current.left); | ||
| } | ||
|
|
||
| if (current.right != null) { | ||
| queue.offer(current.right); | ||
| } | ||
| } | ||
|
|
||
| depth++; | ||
| } | ||
|
|
||
| return depth; | ||
| } | ||
| } |
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 재귀로 푸셨군요. 엄청 간결하고 직관적이어서 좋은 거 같습니다.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🏷️ 알고리즘 패턴 분석
📊 시간/공간 복잡도 분석
피드백: 재귀 호출 스택으로 인해 추가 공간이 필요하지만 각 재귀 호출마다 상위 노드 하나씩 차지합니다. 합병 자체는 선형 시간에 수행됩니다. 개선 제안: 현재 구현이 적절해 보입니다. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| /** | ||
| * 재귀를 사용하여 두 개의 정렬된 연결 리스트를 병합 | ||
| * | ||
| * 시간 복잡도: O(n + m), n은 list1의 길이, m은 list2의 길이 | ||
| * 공간 복잡도: O(n + m), 재귀 호출로 인해 스택에 쌓이는 함수 호출의 깊이 때문 | ||
| */ | ||
| class Solution { | ||
| public ListNode mergeTwoLists(ListNode list1, ListNode list2) { | ||
| if (list1 == null) return list2; | ||
| if (list2 == null) return list1; | ||
|
|
||
| if (list1.val <= list2.val) { | ||
| list1.next = mergeTwoLists(list1.next, list2); | ||
| return list1; | ||
| } else { | ||
| list2.next = mergeTwoLists(list1, list2.next); | ||
| return list2; | ||
| } | ||
| } | ||
| } |
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🏷️ 알고리즘 패턴 분석
📊 시간/공간 복잡도 분석
피드백: 비트 시프트를 통해 1의 개수를 누적한다. 개선 제안: 현재 구현이 적절해 보입니다. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| /** | ||
| * hammingWeight | ||
| * 정수 n의 이진수 표현에서 1의 개수를 반환 | ||
| * | ||
| * 시간 복잡도: O(1) | ||
| * 공간 복잡도: O(1) | ||
| */ | ||
| public class sonshn { | ||
| public int hammingWeight(int n) { | ||
| int count = 0; | ||
|
|
||
| while (n != 0) { | ||
| count += (n & 1); | ||
| n >>>= 1; | ||
| } | ||
|
|
||
| return count; | ||
| } | ||
| } |
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🏷️ 알고리즘 패턴 분석
📊 시간/공간 복잡도 분석
피드백: 정렬 기반으로 동등 여부를 판단한다. 개선 제안: 현재 구현이 적절해 보입니다. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| import java.util.*; | ||
|
|
||
| /** | ||
| * String to char array, sort, and compare | ||
| * | ||
| * 시간 복잡도: O(nlogn) | ||
| * 공간 복잡도: O(n) | ||
| */ | ||
| class Solution { | ||
| public boolean isAnagram(String s, String t) { | ||
| char[] sArray = s.toCharArray(); | ||
| char[] tArray = t.toCharArray(); | ||
|
|
||
| Arrays.sort(sArray); | ||
| Arrays.sort(tArray); | ||
|
|
||
| return Arrays.equals(sArray, tArray); | ||
| } | ||
| } |
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🏷️ 알고리즘 패턴 분석
📊 시간/공간 복잡도 분석
피드백: 공백/기호 제거 및 소문자 비교를 수행한다. 개선 제안: 현재 구현이 적절해 보입니다. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| /** | ||
| * Palindrome 문자열인지 확인하는 문제 | ||
| * | ||
| * Java에서 제공하는 Character.isLetterOrDigit() 메서드를 사용하여 알파벳과 숫자인지 확인하고, | ||
| * Character.toLowerCase() 메서드를 사용하여 대소문자를 구분하지 않고 비교 | ||
| * | ||
| * 시간 복잡도: O(n) | ||
| * 공간 복잡도: O(1) | ||
| */ | ||
| class Solution { | ||
| 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; | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🏷️ 알고리즘 패턴 분석
📊 시간/공간 복잡도 분석
피드백: 초기 예외 처리와 DP 배열 사용으로 각 n에 대해 한 번씩 계산한다. 연산은 선형적이다.
개선 제안: 현재 구현이 적절해 보입니다.