Conversation
raejun92
approved these changes
Mar 17, 2026
Collaborator
raejun92
left a comment
There was a problem hiding this comment.
여기서 slow, fast를 생각해내다니 정말 대단해요!
seulgichu
approved these changes
Mar 17, 2026
Contributor
seulgichu
left a comment
There was a problem hiding this comment.
풀이들이 깔끔하고 푼다음 공부하시는 게 좋네요 👍 많이 배워갑니다!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
이렇게 풀었어요
1. Middle of the Linked List
1) 복잡도 계산
시간 복잡도: O(n)
공간 복잡도: O(1)
2) 접근 아이디어
이 문제는 연결 리스트의 가운데 노드를 반환하는 문제이다. 처음에는 전체 길이를 구한 뒤 다시 한 번 순회하면서 가운데 위치의 노드를 찾는 방법을 떠올렸다. 하지만 이 경우 연결 리스트를 두 번 순회해야 한다.
조금 더 효율적인 방법으로는 slow와 fast 포인터를 사용하는 방식이 있다. slow는 한 번에 한 칸씩 이동하고, fast는 한 번에 두 칸씩 이동하도록 하면 fast가 리스트의 끝에 도달했을 때 slow는 자연스럽게 가운데 노드를 가리키게 된다. 이 방식은 연결 리스트를 한 번만 순회해도 되고, 추가 공간도 사용하지 않아서 효율적이다.
또한 리스트의 길이가 짝수일 경우 가운데 노드가 두 개가 되는데, 이 방식으로 진행하면 문제에서 요구하는 두 번째 가운데 노드를 반환할 수 있다.
즉, 핵심은 fast가 slow보다 2배 빠르게 움직이므로, 끝에 도착할 때 slow는 정확히 중간에 위치한다는 점이다.
3) 회고
이 문제를 통해 slow, fast 포인터를 활용하는 방식이 연결 리스트 문제에서 매우 자주 쓰이는 패턴이라는 점을 다시 느꼈다. 3주차 때 Linked List Cycle 문제 풀이 방식을 보면서 slow, fast 투포인터 방식을 처음 알게 되었는데, 그 때 공부했던 내용 덕분에 아이디어를 떠올릴 수 있었던 것 같다.
추가적으로 다른 풀이로는 리스트를 순회하면서 노드를 배열에 넣고,
return arr[Math.floor(arr.length / 2)];이렇게 풀이할 수도 있다고한다. 하지만 시간복잡도랑 공간복잡도가 모두 O(n)을 차지하게 된다.2. Maximum Depth of Binary Tree
1) 복잡도 계산
시간 복잡도: O(n)
공간 복잡도: O(n)
2) 접근 아이디어
이 문제는 이진 트리의 최대 깊이를 구하는 문제이다.
트리 문제는 재귀적으로 생각하면 훨씬 단순해진다. 어떤 노드의 최대 깊이는 결국 왼쪽 서브트리의 최대 깊이와 오른쪽 서브트리의 최대 깊이 중 더 큰 값에 현재 노드 1개를 더한 값이다. 따라서 root가 null이면 0을 반환하고, 그렇지 않으면 왼쪽과 오른쪽의 깊이를 각각 재귀적으로 구한 뒤 Math.max(left, right) + 1을 반환하면 된다.
이 방식은 트리의 모든 노드를 한 번씩 방문하면서 자연스럽게 최대 깊이를 계산할 수 있다.
3) 회고
바로 직전에 풀었던 Diameter of Binary Tree가 떠올랐다. DFS로 푼다는 점과 왼쪽 서브트리와 오른쪽 서브트리 결과를 이용해서 값을 계산한다는 점에서 내부 로직 자체는 비슷한 문제인듯하다. 오히려 Diameter 문제가 이 문제의 상위 버전이 아닐까 하는 생각이 들었다. 이 문제는 단순하게 높이만 구하면 되지만, Diameter 문제는 그 높이들을 이용해 가장 긴 경로를 찾아야했기 때문이다.