[dolphinflow86] WEEK 05 Solutions#2762
Conversation
📊 dolphinflow86 님의 학습 현황이번 주 제출 문제
누적 학습 요약
문제 풀이 현황
🤖 이 댓글은 GitHub App을 통해 자동으로 작성되었습니다. 🔢 API 사용량 (gpt-5-nano)
|
|
@dolphinflow86 안녕하세요~ 상태 In Review로 설정되어 있는데 의도하신게 맞는지 확인 부탁드립니다! |
안녕하세요! In Review로 된 것은 의도가 맞습니다. 예전에 스터디 가이드쪽에서 미리 PR을 올리고 리뷰를 길게 받으면서 가는게 좋다고 하신걸 본적이 있어서요. In Review로 바꾸는 것은 제가 잘못 봤을수도 있습니다 -> Solving으로 바꿔놓았습니다~ |
There was a problem hiding this comment.
깔끔하게 잘 해결해 주셨네요!
best time to buy and sell stock, 즉 해당 문제는
뒤에 로마 숫자를 붙혀서 1, 2, 3, 4, 5 총 다섯종류가 있는데요
dp 연습하기에 정말 괜찮은 문제라고 생각해서
2번문제
II는 한번 풀어보시길 추천드려요!
There was a problem hiding this comment.
오! 네 문제 추천 감사합니다! 한번 풀어볼게요 👍
| for price in prices: | ||
| max_profit = max(max_profit, price - min_price) | ||
| min_price = min(min_price, price) |
There was a problem hiding this comment.
사소하지만 더 최적화 할 수 있는 부분은 min, max 일 거 같아요. 고민해보셔도 좋을 거 같습니다!
There was a problem hiding this comment.
같은 의견입니다! min, max가 생각보다 비용이 크더라구요
There was a problem hiding this comment.
두분 의견 감사합니다! if문으로 인라인 처리하면 함수 호출 오버헤드 등을 줄일 수 있겠네요.
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Two Pointers, Greedy, Hash Map / Hash Set
- 설명: 주어진 코드는 단순히 현재 최소가를 유지하며 가격을 순회하면서 최대 이익을 갱신하는 방식으로 구현되어 있습니다. 한 번의 순회로 최적해를 구하는 그리디 접근이며, 투 포인터의 개념으로 좌우의 값을 관리합니다.
📊 시간/공간 복잡도 분석
| 유저 분석 | 실제 분석 | 결과 | |
|---|---|---|---|
| Time | O(N) | O(n) | ✅ |
| Space | O(1) | O(1) | ✅ |
피드백: 한 번의 순회를 통해 현재 가격과 최소 가격을 비교하며 최대 이익을 갱신합니다.
개선 제안: 현재 구현이 적절해 보입니다.
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Greedy, Hash Map / Hash Set, Dynamic Programming, Two Pointers, Sliding Window, Binary Search, Monotonic Stack, Heap / Priority Queue, DFS, BFS, Backtracking, Divide and Conquer, Union Find, Trie, Bit Manipulation
- 설명: 주어진 코드는 문자열 인코딩/디코딩에서 길이 정보를 이용해 분리하는 방식으로 구성됩니다. 정확한 패턴으로는 문자열 처리 흐름의 순차 탐색(Two Pointers와 직접적 연결)과 길이 마커를 활용한 고정 포맷 파싱이 핵심이며, 전체적으로 특정 자료구조를 활용한 문제풀이보다는 문자열 조작 및 탐색에 가깝습니다.
📊 시간/공간 복잡도 분석
ℹ️ 이 파일에는 2가지 풀이가 포함되어 있어 각각 분석합니다.
풀이 1: Solution.encode — Time: O(n) / Space: O(n)
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 선형 탐색으로 문자열들을 연결하므로 시간/공간 복잡도는 입력 총 길이에 비례합니다.
개선 제안: 현재 구현이 적절해 보입니다.
풀이 2: Solution.decode — Time: O(n) / Space: O(n)
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 인코딩과 대칭적인 단일 패스 파싱으로 작동합니다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Hash Map / Hash Set, Greedy, Divide and Conquer
- 설명: 문자열의 정렬 결과를 키로 사용해 해시 맵에 그룹화하는 방식으로, 키 생성과 묶음은 해시 맵 기반의 카운트/그룹화 패턴에 해당합니다. 각 문자열을 정렬해 동일한 키를 모으는 전형적인 해시 맵 활용 예시입니다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n * k log k) |
| Space | O(n) |
피드백: 각 문자열을 정렬하는 비용이 주요 요인이며, 해시 맵으로 묶는 비효율 없이 처리합니다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Trie, Hash Map / Hash Set
- 설명: 트라이 구현은 Trie 패턴의 대표 예로, 각 노드에 자식 배열을 두고 문자열의 존재 여부를 탐색/삽입한다. 이 문제의 구현은 트라이의 기본 구조와 prefix 검색 동작을 보여준다.
📊 시간/공간 복잡도 분석
ℹ️ 이 파일에는 3가지 풀이가 포함되어 있어 각각 분석합니다.
풀이 1: Trie.insert — Time: O(n) / Space: O(n * alphabet)
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n * alphabet) |
피드백: Trie 구조를 직접 구현해 삽입/검색/접두사 검색을 제공합니다.
개선 제안: 현재 구현이 적절해 보입니다.
풀이 2: Trie.search — Time: O(n) / Space: O(1)
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(1) |
피드백: 정확히 동작하도록 구성되어 있습니다.
개선 제안: 현재 구현이 적절해 보입니다.
풀이 3: Trie.startsWith — Time: O(n) / Space: O(1)
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(1) |
피드백: 접두사 검색 요구를 만족합니다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Dynamic Programming, Hash Map / Hash Set
- 설명: 문자열 부분문제의 해를 기억해 부분문제 결과를 이용하는 DP 패턴과 단어 사전을 빠르게 확인하기 위한 해시 세트 사용이 핵심입니다.
📊 시간/공간 복잡도 분석
| 유저 분석 | 실제 분석 | 결과 | |
|---|---|---|---|
| Time | O(N^3) | O(n^2) | ❌ |
| Space | O(N + L) | O(n) | ❌ |
피드백: DP 테이블의 각 위치에서 앞선 위치를 체크해 문제를 부분 문제로 해결합니다.
개선 제안: 현재 구현이 적절해 보입니다.
okyungjin
left a comment
There was a problem hiding this comment.
이번 주도 고생하셨습니다! 다음 주도 파이팅하세요 🔥
| for price in prices: | ||
| max_profit = max(max_profit, price - min_price) | ||
| min_price = min(min_price, price) |
There was a problem hiding this comment.
같은 의견입니다! min, max가 생각보다 비용이 크더라구요
| answer = "" | ||
| for s in strs: | ||
| answer += f"{len(s)}%{s}" |
There was a problem hiding this comment.
저도 이번에 공부하면서 배운 내용인데, 아래와 같이 작성하면 최적화가 가능한 것 같습니다.
- 리스트 대신 제너레이터 표현식 사용해서 메모리 최적화
- 문자열
+=연산으로 매번 새로운 문자열 생성하는대신, join으로 문자열 한번에 합치기
def encode(self, strs: list[str]) -> str:
return "".join(f"{len(s)}%{s}" for s in strs)혹은
def encode(self, strs: list[str]) -> str:
parts = (f"{len(s)}%{s}" for s in strs)
return "".join(parts)There was a problem hiding this comment.
저도 블로그로 정리하다 join으로 개선하는 부분 발견했는데, 짚어주셔서 감사합니다. 파이썬은 문자열이 immutable이라 조심해야겠더라고요. join이 재너레이터 표현식 방식으로 동작하는것도 잘 알아갑니다! 감사합니다.
|
|
||
| result = [] | ||
| while right < str_len: | ||
| while s[right] != "%": |
There was a problem hiding this comment.
개인적인 의견이지만 % 같은 구분자는 상수처리하면 가독성이 좋을 것 같습니다!
There was a problem hiding this comment.
BFS나 Trie 자료구조 사용한 풀이법도 적용해보면 좋을 것 같습니다!
There was a problem hiding this comment.
찾아보니 작년에 BFS로 풀었더라고요? 이번에는 그 방법이 안떠올라서 조금 난감했네요 ㅎㅎ BFS나 Trie 방법도 고려해보겠습니다!
There was a problem hiding this comment.
리뷰 누락이 있어서 추가로 남깁니다.
str은 파이썬 클래스와 혼동이 있을 수 있어서 가급적이면 변수명으로 쓰지 않는 것이 좋을 것 같습니다.- 저도 리뷰 받았던 내용인데, sorted의 정렬 대신 다르게 구현하여 시간 복잡도를 개선해보면 좋을 것 같습니다.
There was a problem hiding this comment.
c++ 습관이 자꾸 나오네요 ㅎㅎ str은 사용하지 않아야겠습니다. 두번째 방법도 한번 생각해볼게요! 꼼꼼하게 리뷰해주셔서 감사합니다 🙏
답안 제출 문제
작성자 체크 리스트
In Review로 설정해주세요.검토자 체크 리스트
Important
본인 답안 제출 뿐만 아니라 다른 분 PR 하나 이상을 반드시 검토를 해주셔야 합니다!