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

[haklee] week 6 #472

Merged
merged 1 commit into from
Sep 21, 2024
Merged

[haklee] week 6 #472

merged 1 commit into from
Sep 21, 2024

Conversation

haklee
Copy link
Contributor

@haklee haklee commented Sep 19, 2024

답안 제출 문제

Longest Increasing Subsequence (LIS)는 이거 유명한 알고리즘이 있었는데 절대 혼자서 못 떠올릴테니 풀이부터 봐야겠다- 하고 알고달레에 풀이 보러 갔다가 어마어마하게 깔끔한 코드를 보고 직접 풀어볼 의지를 잃어버리고 말았습니다 ㅇ<-<

체크 리스트

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

@haklee haklee requested a review from a team as a code owner September 19, 2024 11:01
@github-actions github-actions bot added the py label Sep 19, 2024
@haklee haklee requested a review from mangodm-web September 19, 2024 11:01
Comment on lines +3 to +79
아이디어:
높이 리스트 l이 주어졌다고 하자. 그리고 이 안에 있는 최대 수조 면적을 f(l)이라고 하자.

□ □ □
□ □ □ □
□ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □ □ □
□ □ □ □ □ □ □ □ □ □ □ □ □ □
2,5,3,3,1,3,1,2,2,5,3,5,3,4
^
l


그러면 다음이 항상 성립한다.

- l의 양 끝의 값 중 작은 값 x가 앞쪽에 있었다고 해보자. x를 뺀 리스트 l`을 만든다.
- 이때 작은 값이 뒷쪽에 있었어도 일반성을 잃지 않는다.

│□ □ □
│□ □ □ □
│□ □ □ □ □ □ □ □ □
□│□ □ □ □ □ □ □ □ □ □ □
□│□ □ □ □ □ □ □ □ □ □ □ □ □
2│5,3,3,1,3,1,2,2,5,3,5,3,4
^ ^
x l`


- f(l)은 그렇다면
- f(l`)이거나(즉, x를 쓰지 않았거나)
- x를 써서 만든 수조 면적 중에 있다.

- 그런데 x는 l의 양 끝 값 중에 작은 값이므로, 아래와 같은 분석을 할 수 있다.
1) x를 써서 만드는 수조의 높이는 아무리 높아도 x다. x보다 작아질 수는 있어도, x보다 커질 수는 없다.
2) x를 써서 만드는 수조의 폭은 l의 다른쪽 끝에 있는 높이를 선택했을때 최대가 된다.
- 그러므로, x를 써서 만들 수 있는 수조의 최대 크기는 l의 다른쪽 끝에 있는 높이를 선택한 경우 나온다.

위의 내용을 아래의 설명을 통해 시각적으로 확인할 수 있다.

- 양 끝을 선택한 경우 x로 만들 수 있는 최대 면적이다.

│□ □ □
│□ □ □ □
│□ □ □ □ □ □ □ □ □
■│■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■│■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
2│5,3,3,1,3,1,2,2,5,3,5,3,4
^ ^

- x는 그대로 둔 채 다른쪽 끝을 안쪽으로 더 이동하면 수조 높이는 동일한데 폭은 더 작아진다.

│□ □ □
│□ □ □ □
│□ □ □ □ □ □ □ □ □
■│■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ □
■│■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ □
2│5,3,3,1,3,1,2,2,5,3,5,3,4
^ ^

- 심지어 x보다 작은 높이 값을 선택한 경우 수조 높이도 작아지고 폭도 작아지는 일이 일어난다.

│□ □ □
│□ □ □ □
│□ □ □ □ □ □ □ □ □
□│□ □ □ □ □ □ □ □ □ □ □
■│■ ■ ■ ■ ■ ■ □ □ □ □ □ □ □
2│5,3,3,1,3,1,2,2,5,3,5,3,4


즉, 위의 내용을 종합하면 다음을 확인할 수 있다.
- f(l) = max( (l의 양 끝 높이를 선택해서 만든 수조 넓이), f(l`) )
- 그런데 f(l`)도 f(l)을 구한 것과 같은 방식으로 구할 수 있다. 즉, 새로 만들어진 l`의 양 끝 높이 중
짧은 쪽을 뺀 리스트 l``을 만들어서 위의 과정을 반복할 수 있다.
- 즉, f(l)은 아래의 과정을 반복하여 구할 수 있다.
- l의 양 끝 높이를 써서 수조 넓이를 구하고, 기존 최대 넓이와 비교하여 더 큰 값을 최대 넓이에 대입한다.
- l에서 짧은 쪽 높이를 뺀다.
- 위 과정을 l에 아이템이 하나만 남을 때까지 반복.
Copy link
Contributor

Choose a reason for hiding this comment

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

전달력 좋은 글에 다이어그램까지 제공해주시니까 최고였습니다

저는 ~니까 ~일 수밖에 없다라는 식으로만 접근했었는데, 이렇게 보다 정제된 표현들로 설명하니까 제 이해도도 함께 높아졌습니다 :)

Comment on lines +8 to +14
SC:
- trie의 노드 개수 O(n).
- dfs시 스택 깊이는 최대 w. 즉, O(w). 그런데 스택 깊이는 노드 개수보다 클 수 없다. 즉, O(w) < O(n).
- 종합하면, O(n) + O(w) < O(n) + O(n) = O(n).

TC:
- 최악의 경우 모든 노드 순회. O(n).
Copy link
Contributor

Choose a reason for hiding this comment

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

misc)

저는 Big O 분석을 input 값이 증가함에 따라 '함수'의 실행시간 및 공간사용량의 증가 추세가 어떻게 되느냐에 대해 이야기하는 것으로 이해하고 있습니다

그래서 Big O 분석을 WordDictionary 클래스에 대해서 논하는 것보다 각 method에 대해서 다루는 것이 좀 더 적절하다고 생각이 드는데, @haklee 님께서는 어떻게 생각하시나요?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

그래서 맨 위에 search시: TC: O(n), SC: O(n) 라는 단서를 달아두었는데 헷갈릴 수 있었겠네요..! trie 자체는 이전 구현을 그대로 가져오기도 했고, 이전 구현에서도 잘 알려진 일반적인 trie라 TC, SC 분석을 생략하고 넘어갔었어서 이번에도 은근슬쩍 넘어갔다가 딱 걸렸습니다 ㅠㅠ

Copy link
Contributor

Choose a reason for hiding this comment

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

아이고 맨 위에 코멘트를 제가 놓쳤네요..!

Copy link
Contributor

@bky373 bky373 left a comment

Choose a reason for hiding this comment

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

자세한 풀이 감사합니다~ 이번 한 주도 고생 많으셨습니다!

@haklee haklee merged commit ddd3676 into DaleStudy:main Sep 21, 2024
3 checks passed
@DaleSeo
Copy link
Contributor

DaleSeo commented Sep 24, 2024

Longest Increasing Subsequence (LIS)는 이거 유명한 알고리즘이 있었는데 절대 혼자서 못 떠올릴테니 풀이부터 봐야겠다- 하고 알고달레에 풀이 보러 갔다가 어마어마하게 깔끔한 코드를 보고 직접 풀어볼 의지를 잃어버리고 말았습니다 ㅇ<-<

@haklee 직접 푸실 의지가 생기시도록 유료화할까요? 😛

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.

4 participants