Skip to content
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

[EGON] Week15 Solutions #609

Merged
merged 7 commits into from
Nov 23, 2024
Merged

[EGON] Week15 Solutions #609

merged 7 commits into from
Nov 23, 2024

Conversation

EgonD3V
Copy link
Contributor

@EgonD3V EgonD3V commented Nov 22, 2024

답안 제출 문제

체크 리스트

  • PR을 프로젝트에 추가하고 Week를 현재 주차로 설정해주세요.
  • 바로 앞에 PR을 열어주신 분을 코드 검토자로 지정해주세요.
  • 문제를 모두 푸시면 프로젝트에서 Status를 In Review로 설정해주세요.
  • 코드 검토자 1분 이상으로부터 승인을 받으셨다면 PR을 병합해주세요.

@EgonD3V EgonD3V added the py label Nov 22, 2024
@EgonD3V EgonD3V requested a review from obzva November 22, 2024 21:15
@EgonD3V EgonD3V self-assigned this Nov 22, 2024
@EgonD3V EgonD3V requested a review from a team as a code owner November 22, 2024 21:15
Copy link
Contributor

@obzva obzva left a comment

Choose a reason for hiding this comment

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

수고하셨습니다 Egon님!! 15주가 금방 지나갔네요, 앞으로도 연이 닿는다면 같이 공부할 기회가 있으면 좋겠습니다 ㅎㅎㅎ
몇가지 질문사항 남겨두었습니다

Time Complexity: O(n ^ 3)
- s의 길이를 n이라 하면, s의 길이 - 1 만큼 조회하는데 O(n - 1)
- 각 문자마다 sliding_window를 2회 호출하는데, 각 호출마다 최대 s의 길이만큼 반복하므로, * 2 * O(n), upper bound
- 반복 후 s를 slicing하는데 최대 * O(n), upper bound
Copy link
Contributor

Choose a reason for hiding this comment

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

저는 이 부분의 시간복잡도가 좀 아깝게 느껴졌습니다
str slicing이 꽤 무거운 연산인 것으로 보이는데, 시작과 끝 인덱스를 반환하는 방식으로 sliding_window함수를 수정하면 시간복잡도를 3차원에서 2차원까지 낮출 수 있을 것 같아요 :)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

저는 이 부분의 시간복잡도가 좀 아깝게 느껴졌습니다 str slicing이 꽤 무거운 연산인 것으로 보이는데, 시작과 끝 인덱스를 반환하는 방식으로 sliding_window함수를 수정하면 시간복잡도를 3차원에서 2차원까지 낮출 수 있을 것 같아요 :)

이전에 이 문제를 풀었던 적이 있어서 기존 모범 답안을 그대로 제출했는데, 실행 환경에 따른 GC 호출 차이 때문인지 문자열 슬라이싱을 미리해서 리턴하면 훨씬 메모리가 좋더라고요. 시간복잡도는 투 포인터로 풀면 나아지는건 맞긴한데, 애초에 팰린드롬 문제 자체의 제약사항이 1000자 아래여서 별 차이가 없는 걸 알고있긴 했습니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@obzva manacher 알고리즘도 이번에 알게되어서 추가해봤는데 한 번 보시면 도움되실 것 같아 남깁니다 :)

Copy link
Contributor

Choose a reason for hiding this comment

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

그렇군요 ㅎㅎㅎ 그런 이유라면 에곤님 본래의 풀이가 더 합리적인 선택 같습니다

Time Complexity: O(n ^ 3)
- s의 길이를 n이라 하면, s의 길이 - 1 만큼 조회하는데 O(n - 1)
- 각 문자마다 sliding_window를 2회 호출하는데, 각 호출마다 최대 s의 길이만큼 반복하므로, * 2 * O(n), upper bound
- 반복 후 s를 slicing하는데 최대 * O(n), upper bound
Copy link
Contributor

Choose a reason for hiding this comment

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

저는 이 부분의 시간복잡도가 좀 아깝게 느껴졌습니다
str slicing이 꽤 무거운 연산인 것으로 보이는데, 시작과 끝 인덱스를 반환하는 방식으로 sliding_window함수를 수정하면 시간복잡도를 3차원에서 2차원까지 낮출 수 있을 것 같아요 :)

Copy link
Contributor

Choose a reason for hiding this comment

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

그럼 공간복잡도도 O(1)으로 자연스레 개선될 것 같아요


"""
Runtime: 0 ms (Beats 100.00%)
Time Complexity: O(n ^ 2)
Copy link
Contributor

Choose a reason for hiding this comment

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

기막힌 풀이네요 ㅋㅋㅋ 잘 배웠습니다!!

Space Complexity: O(max(n, m))
- stack의 최대 크기는 root 트리가 편향된 경우이며, 이는 root 트리의 노드의 총 갯수와 같으므로 O(n), upper bound
- is_same_tree 함수의 재귀 스택의 최대 깊이는 subRoot 트리가 편향된 경우이며, 이는 subRoot 트리의 노드의 총 갯수와 같으므로 O(m), upper bound
> O(n) + O(m) ~= O(max(n, m))
Copy link
Contributor

Choose a reason for hiding this comment

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

제가 좌변까지는 이해했는데 우변으로 이어지는 논리는 이해하지 못했습니다 @lymchgmk 님 ㅜ
혹시 O(N + M) ~= O(max(N, M)) 이 되는 이유에 대해 설명 부탁드려도 될까요?
제 생각엔, 스택의 공간복잡도와 is_same_tree의 공간복잡도는 독립적인 것 같아서 O(N + M)이라고 봐야 할 것 같아서요 😵‍💫

Copy link
Contributor Author

Choose a reason for hiding this comment

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

제가 좌변까지는 이해했는데 우변으로 이어지는 논리는 이해하지 못했습니다 @lymchgmk 님 ㅜ 혹시 O(N + M) ~= O(max(N, M)) 이 되는 이유에 대해 설명 부탁드려도 될까요? 제 생각엔, 스택의 공간복잡도와 is_same_tree의 공간복잡도는 독립적인 것 같아서 O(N + M)이라고 봐야 할 것 같아서요 😵‍💫

말씀하신 것 처럼 둘이 독립인게 맞습니다. O(n + m)으로 수정하겠습니다. 감사합니다.

@EgonD3V EgonD3V merged commit 72e93b7 into DaleStudy:main Nov 23, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
No open projects
Status: Completed
Development

Successfully merging this pull request may close these issues.

2 participants