Skip to content

[WEEK03] 이지현#8

Merged
sik9252 merged 4 commits intomainfrom
sik9252
Mar 2, 2026
Merged

[WEEK03] 이지현#8
sik9252 merged 4 commits intomainfrom
sik9252

Conversation

@sik9252
Copy link
Collaborator

@sik9252 sik9252 commented Feb 23, 2026

이렇게 풀었어요

1. Linked List Cycle

  • 문제를 풀었어요.
  • 풀이 시간 : 7분

1) 복잡도 계산

시간 복잡도: O(n)

공간 복잡도: O(n)


2) 접근 아이디어

단순하게 가장 먼저 떠오른 방법은 LinkedList를 순회하며 현재 지점의 값을 Set을 사용해 저장해둔다. 그리고 포인터를 하나씩 옮겨가며 옮겨진 지점의 값이 이미 이전에 나왔던 값인지 검사한다.

단계별 사고 과정

  1. 빈 Set 생성
  2. 노드를 하나씩 순회

이 과정에서, 아래와 같이 조건 분기를 하면 된다.

  1. 현재 노드가 이미 Set에 있다면 → true
  2. 아니라면 Set에 추가
  3. 끝까지 가면 → false

플고 나서 보니, 문제 설명의 하단에 이런 문구가 있었다.
Follow up: Can you solve it using O(1) (i.e. constant) memory?
O(1)의 공간 복잡도를 가지게 구현할 수 있는가? 라는 질문인듯 한데, 이를 만족하도록 구현하기 위한 방법인 토끼와 거북이 알고리즘 (Slow & Fast Pointer)이란 것이 있다고 한다...


3) 회고

모르는 알고리즘이 너무 많다. 언제 다 공부할까?


이렇게 풀었어요

2. Implement Queue using Stacks

  • 문제를 풀었어요.
  • 풀이 시간 : 18분

1) 복잡도 계산

시간 복잡도

  • push: O(1)
  • pop: O(n)
  • peek: O(n)
  • empty: O(1)

공간 복잡도: O(n)


2) 접근 아이디어

push, empty는 단순하게 stack에 .push()하고, length를 통해 비어있는지 확인하면 된다.

문제는 pop, peek이였는데 Queue는 FIFO 구조로 pop하는 경우 가장 처음에 들어간게 가장 먼저 나와야한다. 단순한게 stack[0]을 쓰면 안되나 했는데 문제에 You must use only standard operations of a stack, which means only push to top, peek/pop from top, size, and is empty operations are valid.로 stack의 기본 연산만을 사용하라는 조건이 있었다. 그래서 결국 재귀로 구현했다.

const top = this.stack.pop(); // 위에서 하나 꺼내고
const result = this.pop(); // 재귀로 맨 아래 찾기
this.stack.push(top); // 다시 복구

플고 나서 보니, 문제 설명의 하단에 이번에는 시간복잡도를 O(1)로 구현할 수 있는가? 라는 질문이 있었다. 아이디어가 떠오르지 않아 찾아보니 inStack, outStack 2개의 stack을 사용하면 된다고 한다. 2개를 쓰면 현재 사용하는 모든 연산(push, pop, peek, empty)를 O(1)로 최적화할 수 있다.


3) 회고

stack의 기본 연산만 사용하라고해서 pop 구현하는데 아이디어가 안떠올랐다. 근데 stack을 2개 사용하는 방법은 어떻게 떠올리는거지? 처음 문제를 보자마자 떠올리면 천재겠지..


1. Lowest Common Ancestor of a Binary Search Tree

  • 문제를 풀었어요.
  • 풀이 시간 : 40분

1) 복잡도 계산

시간 복잡도: O(n)

공간 복잡도: O(1)


2) 접근 아이디어

Binary Search Tree가 주어지고, 두 노드 p/q가 주어진다. 이때 이 둘(p/q)의 가장 가까운 공통 조상을 찾는 문제다.
BST는 각 노드가 왼쪽 서브트리 < 현재 노드 < 오른쪽 서브트리 라는 특징을 가지고 있다.
따라서 이 성질을 이용하면 일반 이진트리처럼 전체를 탐색할 필요 없이 p와 q가 갈라지는 지점을 따라 내려가며 LCA를 찾을 수 있다.

단계별 사고 과정

  1. p.val, q.val 중 작은 값을 low, 큰 값을 high로 정리한다. (비교를 단순화)
  2. 현재 노드를 cur = root로 두고 탐색을 시작한다.
  3. 반복하면서 현재 노드 값 cur.val을 기준으로 3가지 경우를 나눈다.

경우 1) high < cur.val 인 경우

  • p와 q가 모두 현재 노드보다 작다
  • 둘 다 왼쪽 서브트리에 있으므로 cur = cur.left로 이동한다.

경우 2) low > cur.val 인 경우

  • p와 q가 모두 현재 노드보다 크다
  • 둘 다 오른쪽 서브트리에 있으므로 cur = cur.right로 이동한다.

경우 3) 그 외의 경우 (low <= cur.val <= high)

  • 하나는 왼쪽, 하나는 오른쪽에 있거나
  • 현재 노드가 p 또는 q 중 하나인 경우
  • 이때 현재 노드가 두 노드가 갈라지는 첫 지점이므로 LCA이다.
  • cur를 반환한다.

3) 회고

그냥 트리도 잘 모르는데 BST의 최소 공통 조상을 어떻게 찾아야 되는가에 대한 아이디어가 딱 떠오르지 않았다. 그래서 공부를 먼저 해본 결과 BST는 일반 이진트리와 다르게 정렬 특성을 가지고 있으며, 이 특성에 의해 매 단계마다 탐색 범위를 한쪽 서브트리로 확정할 수 있다는 것을 알게 되었다. (즉, p와 q가 같은 방향에 있으면 안되고, 서로 다른 방향으로 갈라지는 순간의 노드가 LCA다.) 근데 사실 아직도 어렵다. 일단 제출하고 다시 깊게 파볼 생각이다.


2. Balanced Binary Tree

  • 문제를 풀었어요.
  • 풀이 시간 : 1시간

1) 복잡도 계산

시간 복잡도: O(n²)

공간 복잡도: O(1)


2) 접근 아이디어

균형 트리란?
모든 노드에서 왼쪽 서브트리와 오른쪽 서브트리의 높이 차이가 1 이하인 트리
즉, 이 조건을 만족하면 true 아니면 false를 반환하는 문제이다.

단계별 사고 과정

  • getHeight(node): 특정 노드의 높이를 계산
  • check(node): 현재 노드의 높이 차이를 확인하고, 왼쪽/오른쪽 서브트리도 재귀적으로 균형인지 확인
  1. 각 노드에서 균형 여부를 판단하려면 왼쪽/오른쪽 서브트리의 높이가 필요하다.

  2. 높이를 구하기 위해 getHeight 함수를 만든다.

  3. check 함수에서 현재 노드 기준으로 아래 항목을 계산한다.

    • leftH = getHeight(node.left)
    • rightH = getHeight(node.right)
  4. |leftH - rightH| > 1이면 현재 노드는 불균형이므로 false를 반환한다.

  5. 현재 노드가 균형이라도, “모든 노드가 균형이어야” 하므로

  6. check(node.left)와 check(node.right)도 모두 true인지 확인한다.

  7. 루트부터 check(root)를 호출해 최종 결과를 반환한다.


3) 회고

처음엔 “각 노드에서 높이를 구해서 차이를 비교하면 되겠다”라고 생각해서 위처럼 구현했다.
로직은 직관적이지만, check를 도는 과정에서 getHeight가 계속 중복 호출되어 비효율적일 수 있다는 점을 알게 되었다. -> O(n²)까지 커질 수 있음

그래서 다음 최적화 아이디어도 같이 공부해봤다.

개선 지점

(1) “높이 계산”과 “균형 체크”를 한 DFS에서 결합하자

현재 구현은 check가 높이를 필요로 할 때마다 getHeight를 별도로 호출한다.
별도 호출 대신 DFS 한 번으로:

  • 왼쪽 높이 계산
  • 오른쪽 높이 계산
  • 높이 차이 검사
  • 현재 높이 반환

이걸 한 번에 처리하면 중복 방문이 사라져 O(n)으로 개선된다.

(2) 불균형을 발견하면 -1로 조기 종료할 수 있다는 점

DFS 함수가 높이를 반환하되,

  • 균형이면 “정상 높이(0 이상)” 반환
  • 불균형이면 “-1” 반환
  • 하위에서 -1이 올라오면 상위도 바로 -1을 반환해서 더 깊이 계산하지 않고 종료할 수 있다.

이 방식은 중복 계산을 없애서 시간 복잡도를 O(n)으로 줄일 수 있고, 불균형을 빨리 찾으면 더 빠르게 종료할 수 있다는 점이 장점이다.

Copy link
Member

@doitchuu doitchuu left a comment

Choose a reason for hiding this comment

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

엇 지현님..! 이 풀이들 이번 주 풀이 아닌 거 같아요 ㅠㅠ
Grid 사이트 세팅이 다르면 문제 순서가 뒤죽박죽이더라구요..!
아마 사이트 그 순서대로 푸신 것 같네욥 ㅠ

정리를 잘해오셔서 저희도 안풀기 아깝네용! 이 문제들을 저랑 준호님이 금요일까지 풀고,
화요일까지 풀어야할 문제들을 이번주 금요일까지 풀어오시는 걸로 할까요?
(저랑 준호님 풀이는 답이니 PR 리뷰는 하지말고 금요일에 리뷰 바꿔하시죠!)

@raejun92 준호님도 참고 부탁드려요!

}

const top = this.stack.pop();
const result = this.peek();
Copy link
Member

Choose a reason for hiding this comment

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

재귀를 잘 쓰시는 군요..... 👍
스택 하나로 queue 구현은 이렇게 할 수 있겠네요!
다른 풀이법 하나 참고할 수 있어 좋네요! 💯

Comment on lines +2 to +5
function getHeight(node) {
if (node === null) return 0;
return Math.max(getHeight(node.left), getHeight(node.right)) + 1;
}
Copy link
Member

Choose a reason for hiding this comment

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

높이 구하는 부분을 함수로 분리하셨네요 👍 깔끔!

Copy link
Collaborator

@raejun92 raejun92 left a comment

Choose a reason for hiding this comment

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

고생 많으셨습니다!
많이 배워갑니다

Copy link
Collaborator

Choose a reason for hiding this comment

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

완벽한 풀이군요! 이런 생각을 할 수 있다는 게 정말 대단한 거 같아요

var isBalanced = function (root) {
function getHeight(node) {
if (node === null) return 0;
return Math.max(getHeight(node.left), getHeight(node.right)) + 1;
Copy link
Collaborator

Choose a reason for hiding this comment

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

와 이런 코드는 어떻게 생각하시는 거죠?! 한 수 배워가요

Copy link
Collaborator

Choose a reason for hiding this comment

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

오래 걸리시긴해도 풀이가 가능하신 게 넘 부럽습니다.

@doitchuu doitchuu changed the title [WEEK03-1] 이지현 [WEEK03] 이지현 Mar 1, 2026
@doitchuu
Copy link
Member

doitchuu commented Mar 1, 2026

@sik9252 지현님, 해당 PR 머지 부탁드리구, 다른 분들 PR approve 부탁드려욥~! :)

@sik9252 sik9252 merged commit 56c6279 into main Mar 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants