Skip to content

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
Member

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