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

[forest000014] Week 6 #907

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open

Conversation

forest000014
Copy link
Contributor

@forest000014 forest000014 commented Jan 14, 2025

답안 제출 문제

체크 리스트

  • 우측 메뉴에서 PR을 Projects에 추가해주세요.
  • Projects의 오른쪽 버튼(▼)을 눌러 확장한 뒤, Week를 현재 주차로 설정해주세요.
  • 바로 앞에 PR을 열어주신 분을 코드 검토자로 지정해주세요.
  • 문제를 모두 푸시면 프로젝트에서 StatusIn Review로 설정해주세요.
  • 코드 검토자 1분 이상으로부터 승인을 받으셨다면 PR을 병합해주세요.

@forest000014 forest000014 self-assigned this Jan 14, 2025
@forest000014 forest000014 requested a review from a team as a code owner January 14, 2025 15:02
@github-actions github-actions bot added the java label Jan 14, 2025
@forest000014
Copy link
Contributor Author

forest000014 commented Jan 14, 2025

Design Add and Search Words Data Structure 문제에서, AlgoDale 풀이의 풀이 3(Trie 2)과 동일한 접근으로 풀었습니다 (제가 맞게 이해했다면요 😅)

AlgoDale 풀이에서는 시간 복잡도를 O(26^w)라고 적어주셨는데요, 저는 .이 최대 2번만 나오기 때문에, 시간 복잡도가 O(26^2 * w) = O(w)라고 생각되어서요... 만약 .이 word 길이만큼 등장할 수 있다면 O(26^w)가 맞겠지만, 2번이라는 제한이 있어서 좀 다르게 볼 수 있지 않을까요?
(풀이를 다시 읽어보니 .이 최대 2번 등장한다는 제한 조건 없이 설명해주신 것 같은데, 혹시 그 사이에 문제의 제한 조건이 변경되었을까용 🤔)

@forest000014
Copy link
Contributor Author

Container With Most Water 문제는 열심히 고민해서 나름대로 잘 풀었다고(O(nlogn)으로) 생각했는데, 풀이를 보니 O(n)의 접근이 가능했었네요 (조금은 허탈..ㅎㅎ)
2 포인터를 쓸 수 있는 근거에 대해서 스스로 명확히 납득이 될 만한 논리를 좀 고민해봐야 할 것 같습니다 😄

@forest000014
Copy link
Contributor Author

forest000014 commented Jan 14, 2025

(셀프 피드백) 다른 분 (bus710님) 코드를 보니, Valid Parentheses 문제에서 문자열 길이가 홀수인 경우는 굳이 탐색할 필요 없이 false로 early return하면 더 좋을 것 같네요

@forest000014
Copy link
Contributor Author

(셀프 피드백) 호돌이님 코드👍를 보고, Design Add and Search Words Data Structure 문제의 addWord() 구현에서, curr.ends = true로 세팅하는 코드를 좀 더 간결하게 수정했습니다.

*/
class Solution {
public boolean isValid(String s) {
Stack<Character> st = new Stack<>();
Copy link
Contributor

Choose a reason for hiding this comment

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

안녕하세요! 제가 자바를 거의 써보지 않아서 리뷰가 정확하지 않을 수 있는 점 양해 부탁드립니다 :) 꼭 모두 고치지 않으셔도 되고, 참고만 해주세요!

혹시 ArrayDeque를 사용하면 Stack보다 성능이 더 나아질까요?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ArrayDeque은 잘 몰랐는데, 말씀해주신 덕분에 좀 찾아보았습니다.

시간 복잡도 측면에서는 ArrayDeque이나 Stack 모두 push/pop이 O(1)이고, 공간 복잡도도 O(n)으로 동일한 것 같습니다.
(capacity가 가득 찼을 때 특별한 설정이 없으면 둘 다 2배씩 resize하기 때문에, push()의 시간 복잡도가 amortized O(1)이 된다고 이해했습니다.)

다만, Stack은 Vector를 상속받았는데, Vector는 동기화 때문에 주요 메소드들의 속도가 좀 더 느리다고 하네요. 다음 번에 Stack 쓸 일이 있을 땐, ArrayDeque을 써봐야겠습니다 👍

}

for (char ch : s.toCharArray()) {
if (ch == '(' || ch == '{' || ch == '[') {
Copy link
Contributor

Choose a reason for hiding this comment

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

각 pair들을 담은 Map을 사용하면 조건문을 많이 줄일 수 있을 것 같습니다.

@forest000014
Copy link
Contributor Author

Container With Most Water를 먼저 풀고 나서 Longest Increasing Subsequence를 풀어서인지, 왠지 비슷한 결의 풀이가 나왔네요. 인덱스 트리를 사용했는데, 구현량이 좀 있다보니 실전에서 실수 없이 짤 수 있을지 고민이 됩니다...ㅎㅎ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: In Review
Development

Successfully merging this pull request may close these issues.

2 participants