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
68 changes: 48 additions & 20 deletions non-overlapping-intervals/juhui-jeong.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.

🏷️ 알고리즘 패턴 분석

  • 패턴: Greedy, Sorting
  • 설명: 이 코드는 인터벌 정렬 후, 겹침 여부를 판단하여 최소 제거 개수를 찾는 greedy 전략을 사용하며, 정렬은 문제 해결에 핵심적입니다.

📊 시간/공간 복잡도 분석

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

풀이 1: Solution.eraseOverlapIntervals — Time: O(n log n) / Space: O(1)
복잡도
Time O(n log n)
Space O(1)

피드백: 배열 정렬이 O(n log n)이고, 이후 한 번 순회하는 O(n)이므로 전체 시간 복잡도는 O(n log n)입니다. 정렬 후 별도 자료구조를 사용하지 않으므로 공간 복잡도는 O(1)입니다.

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

풀이 2: Solution.eraseOverlapIntervals — Time: O(n log n) / Space: O(1)
복잡도
Time O(n log n)
Space O(1)

피드백: 배열 정렬이 O(n log n)이고, 이후 한 번 순회하는 O(n)이므로 전체 시간 복잡도는 O(n log n)입니다. 정렬 후 별도 자료구조를 사용하지 않으므로 공간 복잡도는 O(1)입니다.

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

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

피드백: 배열 정렬이 O(n log n)이고, 이후 한 번 순회하는 O(n)이므로 전체 시간 복잡도는 O(n log n)입니다. 정렬 후 별도 자료구조를 사용하지 않으므로 공간 복잡도는 O(1)입니다.

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

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

Original file line number Diff line number Diff line change
@@ -1,51 +1,79 @@
/*
* 끝나는 시간 오름차순 정렬
*/
처음 풀이
시작 시간 기준 정렬
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a,b) -> Integer.compare(a[1], b[1]));
Arrays.sort(intervals, (a,b) -> {
if (a[0] != b[0]) return Integer.compare(a[0], b[0]);
return Integer.compare(a[1], b[1]);
});

int removeCntResult = 0;
int end = intervals[0][1];
int[] cur = intervals[0];

for (int i = 1; i< intervals.length; i++) {
if (intervals[i][0] < end) {
int [] next = intervals[i];

if (cur[1] > next[0]) {
removeCntResult += 1;
if (next[1] < cur[1]) {
cur = next;
}
} else {
end = intervals[i][1];
cur = next;
}
}
return removeCntResult;
}
}
*/


/*
처음 풀이
시작 시간 기준 정렬
* 끝나는 시간 오름차순 정렬

class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a,b) -> {
if (a[0] != b[0]) return Integer.compare(a[0], b[0]);
return Integer.compare(a[1], b[1]);
});
Arrays.sort(intervals, (a,b) -> Integer.compare(a[1], b[1]));

int removeCntResult = 0;
int[] cur = intervals[0];
int end = intervals[0][1];

for (int i = 1; i< intervals.length; i++) {
int [] next = intervals[i];

if (cur[1] > next[0]) {
if (intervals[i][0] < end) {
removeCntResult += 1;
if (next[1] < cur[1]) {
cur = next;
}
} else {
cur = next;
end = intervals[i][1];
}
}
return removeCntResult;
}
}
*/

/**
* 시간 복잡도: O(n log n)
* 공간 복잡도: O(n)
*/
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a,b) -> a[0] - b[0]);
int count = 0;
int prevEnd = intervals[0][1];

for (int i = 1; i < intervals.length; i++) {
int curStart = intervals[i][0];
int curEnd = intervals[i][1];

if (prevEnd <= curStart) {
// 안겹치는 경우(변경 없이 다음 배열로)
prevEnd = curEnd;
} else {
// 겹치는 경우
count++;
prevEnd = Math.min(prevEnd, curEnd);
}
}
return count;
}
}
61 changes: 46 additions & 15 deletions remove-nth-node-from-end-of-list/juhui-jeong.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.

🏷️ 알고리즘 패턴 분석

  • 패턴: Two Pointers
  • 설명: 이 코드는 빠른 포인터(fast)와 느린 포인터(slow)를 사용하여 리스트의 끝에서 n번째 노드를 찾고 제거하는 방식으로, Two Pointers 패턴에 속합니다.

📊 시간/공간 복잡도 분석

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

풀이 1: Solution.removeNthFromEnd — Time: O(n) / Space: O(1)
복잡도
Time O(n)
Space O(1)

피드백: 빠른 포인터를 n만큼 이동시킨 후, 느린 포인터와 함께 이동하며 끝에서 n번째 노드를 찾습니다. 리스트 길이만큼 한 번 순회하므로 시간 복잡도는 O(n), 추가 공간은 상수입니다.

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

풀이 2: Solution.removeNthFromEnd — Time: O(n) / Space: O(1)
복잡도
Time O(n)
Space O(1)

피드백: 리스트 길이를 먼저 계산하고, 그 후 제거 위치를 찾기 위해 한 번 더 순회합니다. 두 번 순회지만 시간 복잡도는 O(n)이고, 공간은 상수입니다.

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

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

Original file line number Diff line number Diff line change
@@ -1,7 +1,32 @@

/*
첫 번째 풀이
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
List<ListNode> list = new ArrayList<>();

while(head != null) {
list.add(head);
head = head.next;
}

list.remove(list.size()-n);
if (list.isEmpty()) return null;

for (int i = 0; i < list.size()-1; i++) {
list.get(i).next = list.get(i+1);
}
list.get(list.size()-1).next = null;
return list.get(0);
}
}
*/


/*
시간 복잡도: O(N)
공간 복잡도: O(1)
*/

class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
Expand All @@ -24,26 +49,32 @@ public ListNode removeNthFromEnd(ListNode head, int n) {
return dummy.next;
}
}
*/

/*
첫 번째 풀이
/**
*
* 시간 복잡도는 O(n)
* 공간 복잡도는 O(1)
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
List<ListNode> list = new ArrayList<>();

while(head != null) {
list.add(head);
head = head.next;
int length = 0;
ListNode curLenCheck = head;

while(curLenCheck != null) {
length++;
curLenCheck = curLenCheck.next;
}

list.remove(list.size()-n);
if (list.isEmpty()) return null;
int targetIndex = length - n;
if (targetIndex == 0) return head.next;

for (int i = 0; i < list.size()-1; i++) {
list.get(i).next = list.get(i+1);
ListNode targetPrev = head;
for (int i=0; i < targetIndex-1; i++) {
targetPrev = targetPrev.next;
}
list.get(list.size()-1).next = null;
return list.get(0);
targetPrev.next = targetPrev.next.next;

return head;
}
}
*/
30 changes: 30 additions & 0 deletions same-tree/juhui-jeong.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.

🏷️ 알고리즘 패턴 분석

  • 패턴: DFS, BFS
  • 설명: 이 코드는 재귀를 이용한 DFS와 반복문을 이용한 BFS 두 가지 방법으로 트리의 노드들을 순회하며 비교합니다. 두 패턴 모두 트리 구조 탐색에 적합합니다.

📊 시간/공간 복잡도 분석

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

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

피드백: 모든 노드를 한 번씩 방문하므로 시간 복잡도는 O(n). 재귀 호출로 인해 호출 스택이 트리 높이만큼 쌓이므로 공간 복잡도는 O(h) (h는 트리의 높이)입니다.

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

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

피드백: 모든 노드를 한 번씩 방문하므로 시간 복잡도는 O(n). 큐를 사용하는데, 최악의 경우 모든 노드가 큐에 저장되므로 공간 복잡도는 O(n)입니다.

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

Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,33 @@ public boolean isSameTree(TreeNode p, TreeNode q) {
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}

/*
* 시간 복잡도: O(n)
* 공간 복잡도: O(n)
*/
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
Queue<TreeNode> queueP = new LinkedList<>();
Queue<TreeNode> queueQ = new LinkedList<>();

queueP.offer(p);
queueQ.offer(q);

while(!queueP.isEmpty() && !queueQ.isEmpty()) {
TreeNode curP = queueP.poll();
TreeNode curQ = queueQ.poll();

if (curP == null && curQ == null) continue;
if (curP == null || curQ == null) return false;

if (curP.val != curQ.val) return false;

queueP.offer(curP.left);
queueQ.offer(curQ.left);
queueP.offer(curP.right);
queueQ.offer(curQ.right);
}
return true;
}
}
43 changes: 43 additions & 0 deletions serialize-and-deserialize-binary-tree/juhui-jeong.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.

🏷️ 알고리즘 패턴 분석

  • 패턴: DFS
  • 설명: 이 코드는 재귀적 방식으로 트리 구조를 직렬화와 역직렬화하는데, DFS(깊이 우선 탐색) 패턴을 활용하여 트리의 모든 노드를 방문합니다.

📊 시간/공간 복잡도 분석

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

풀이 1: Codec.serialize — Time: O(n) / Space: O(n)
복잡도
Time O(n)
Space O(n)

피드백: 모든 노드를 한 번씩 방문하여 문자열로 변환하므로 시간 복잡도는 O(n). 재귀 호출로 인한 호출 스택과 결과 문자열 크기 때문에 공간 복잡도도 O(n)입니다.

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

풀이 2: Codec.deserialize — Time: O(n) / Space: O(n)
복잡도
Time O(n)
Space O(n)

피드백: 입력 문자열을 배열로 분할 후, 재귀적으로 노드를 재구성하므로 시간 복잡도는 O(n). 배열 크기만큼 호출 스택이 쌓이므로 공간 복잡도도 O(n)입니다.

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

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

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

public class Codec {
private int index;

// Encodes a tree to a single string.(직렬화)
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
dfsSerialize(root, sb);
return sb.toString();
}

private void dfsSerialize(TreeNode node, StringBuilder sb) {
if (node == null) {
sb.append("null").append(",");
return;
}
sb.append(node.val).append(",");

dfsSerialize(node.left, sb);
dfsSerialize(node.right, sb);
}

// Decodes your encoded data to tree.(역직렬화)
public TreeNode deserialize(String data) {
String[] arr = data.split(",");
index = 0;
return dfsDeserialize(arr);
}

private TreeNode dfsDeserialize(String[] arr) {
String value = arr[index++];

if (value.equals("null")) {
return null;
}

TreeNode node = new TreeNode(Integer.parseInt(value));

node.left = dfsDeserialize(arr);
node.right = dfsDeserialize(arr);
return node;
}
}
Loading