Skip to content

[WEEK02] 이지현#4

Merged
sik9252 merged 4 commits intomainfrom
sik9252
Feb 22, 2026
Merged

[WEEK02] 이지현#4
sik9252 merged 4 commits intomainfrom
sik9252

Conversation

@sik9252
Copy link
Collaborator

@sik9252 sik9252 commented Feb 19, 2026

이렇게 풀었어요

1. Invert Binary Tree

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

1) 복잡도 계산

시간 복잡도: O(n)

  • 모든 노드를 한 번씩 방문한다
  • 각 노드에서 수행하는 swap 연산은 상수 시간

공간 복잡도: O(n)

  • 재귀 호출 스택 사용
  • 트리의 높이에 영향. 최악의 경우인 편향 트리의 경우 O(n)

2) 접근 아이디어

모든 노드에서 왼쪽 자식과 오른쪽 자식을 서로 바꿔주면 된다.
트리 전체를 한 번 순회하면서 swap을 수행하면 되므로 BFS보다는 DFS(재귀) 방식이 가장 직관적이라고 판단했다.

단계별 사고 과정

  1. 현재 노드가 null이면 종료한다
  2. 현재 노드의 left와 right를 swap한다
  3. 왼쪽 서브트리에 대해 재귀 호출한다
  4. 오른쪽 서브트리에 대해 재귀 호출한다
  5. 최종적으로 루트를 반환한다

이 문제는 순회 방식(전위/후위)에 크게 영향을 받지 않는다.
각 노드에서 swap만 수행하면 되기 때문이다.


3) 회고

반복문이 3번 이상 중첩되거나 조건이 복잡해지면 못 푸는 경향이 있다. DFS 재귀 패턴에 더 익숙해질 필요가 있다고 느꼈다.


2. Valid Anagram

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

1) 복잡도 계산

시간 복잡도: O(n)

  • 문자열 s, t를 각각 한 번씩 순회
  • Map의 get/set은 평균 O(1)

공간 복잡도: O(n)

  • 서로 다른 문자 개수에 영향
  • 소문자 알파벳만이라면 최대 26 → 사실상 O(1)

2) 접근 아이디어

두 문자열이 애너그램인지 판단하려면 문자 구성과 개수가 완전히 동일해야 한다.
따라서 “문자 빈도”를 비교하면 된다고 생각했다.

단계별 사고 과정

  1. 두 문자열 길이가 다르면 바로 false
  2. Map을 생성해 s의 문자 빈도를 증가시킨다
  3. t를 순회하면서 해당 문자 빈도를 감소시킨다
  4. 감소 과정에서 존재하지 않거나 음수가 되면 false
  5. 끝까지 통과하면 true

정렬로도 풀 수 있지만 O(n log n)이라 해시맵을 사용하는 O(n) 방식이 더 효율적이다.

정렬로 하는 풀이

  1. 두 문자열 길이가 다르면 false
  2. 두 문자열을 정렬
  3. 정렬된 결과가 같으면 true

3) 회고

정렬 방식이 직관적이었지만, 이 문제의 본질은 “문자 빈도 비교”라는 걸 인지하는 게 더 중요하다고 느꼈다.
해시맵을 사용하는 문제는 “존재 여부 확인”인지 “개수 관리”인지 구분하는 연습이 필요하다.


3. Binary Search

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

1) 복잡도 계산

시간 복잡도: O(log n)

  • 탐색 범위를 매번 절반으로 줄인다

공간 복잡도: O(1)

  • 반복문으로 구현하여 추가 공간을 사용하지 않는다
  • 재귀로 구현하면 O(log n)

2) 접근 아이디어

보통 정렬하고 시작하지만, 이 문제는 이미 정렬된 배열이 주어진다.
그리고 범위가 -10^4 < nums[i], target < 10^4로 1억이다. 즉, 선형 탐색이 아니라 이분 탐색을 사용해야 한다고 판단했다.

단계별 사고 과정

  1. left = 0, right = nums.length - 1
  2. mid = (left + right) / 2
  3. nums[mid]와 target 비교
  4. 같으면 return mid
  5. 작으면 left = mid + 1
  6. 크면 right = mid - 1
  7. left > right가 되면 종료
  8. 못 찾으면 -1 반환

핵심은 “탐색 범위를 절반으로 줄인다”는 점이다.


3) 회고

이분 탐색은 알고리즘 자체는 단순하지만 경계 조건(left <= right)과 포인터 이동을 정확히 이해하는 게 중요하다고 느꼈다.
또한, 공부하면서 알게 된 점은 이분 탐색은 "정렬 + 단조성"이 있는 경우에만 사용 가능하다. 즉, 값이 증가하거나 감소하는 구조를 가진 배열 혹은 조건이 한쪽 방향으로 변하는 경우를 의미한다.

4. Flood Fill

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

1) 복잡도 계산

시간 복잡도: O(m x n)

  • 최악의 경우 image의 모든 칸을 한 번씩 방문하게 됨
  • 각 칸에서 상하좌우 4방향을 확인하므로 상수배 연산으로 m x n

공간 복잡도: O(m x n)

  • BFS의 큐에 최악의 경우 모든 칸이 들어갈 수 있음

2) 접근 아이디어

시작 좌표(sr, sc)에서 출발해 start 지점의 색상과 같은 색을 가진 모든 연결된 영역을 새로운 색으로 바꾼다. 전형적인 BFS, DFS 탐색 문제.

단계별 사고 과정

  1. 시작 색을 저장한다(image[sr][sc])
  2. 시작 색과 바꿀 색(color)이 같으면 바로 종료한다.
  3. 큐를 생성하고 시작 좌표를 넣는다.
  4. 시작 지점을 바로 color로 변경한다.
  5. 큐가 빌 때까지 현재 좌표를 꺼내고, 4방향을 탐색해, 조건에 따라 color로 변경하는 탐색 작업을 반복한다.
  6. 최종적으로 변경된 image를 반환한다.

3) 회고

처음에는 visited 배열을 따로 만들어야 하나 고민했지만,색을 바꾸는 행위 자체가 방문 체크가 된다는 점을 이해하고 나서 구조가 단순해졌다.
또한, 문제 풀이 후 다른 풀이 방식에 대해 탐색하다가 알게된 점이 있는데 shift()는 내부적으로 배열을 한 칸씩 당기기 때문에 queue 크기가 n일 때, 최악의 경우 O(n²)이 된다. 이러한 경우 head 포인터를 사용하면 O(n)으로 성능을 최적화할 수 있다.

let queue = [];
// 포인터로 사용할 head 선언
let head = 0;

queue.push([sr, sc]);

while (head < queue.length) {
  // shift 대신 이렇게 포인터를 사용해서 한칸씩 옮겨가는것
  const [x, y] = queue[head++];
}

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.

풀이가 정석적으로 완벽한 것 같습니다.

var invertTree = function (root) {
if (root === null) return null;

[root.left, root.right] = [root.right, root.left];
Copy link
Collaborator

Choose a reason for hiding this comment

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

와 진짜 똑똑하시군요!

Comment on lines +6 to +7
invertTree(root.left);
invertTree(root.right);
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.

매우 풀이가 깔끔하네요

}

return image;
};
Copy link
Member

Choose a reason for hiding this comment

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

오 정석적인 BFS 풀이네요 👍
초기 예외 케이스 적용이나 변수처리가 깔끔해서
읽기 좋은 거 같아요

var invertTree = function (root) {
if (root === null) return null;

[root.left, root.right] = [root.right, root.left];
Copy link
Member

Choose a reason for hiding this comment

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

요론 방법이 👍

var isAnagram = function (s, t) {
if (s.length !== t.length) return false;

const map = new Map();
Copy link
Member

Choose a reason for hiding this comment

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

s, t 각각 Map을 사용했었는데 하나로 해도좋은 거 같아요! 👍 💯

@sik9252 sik9252 merged commit 54c1094 into main Feb 22, 2026
1 check passed
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