[xeulbn] WEEK 02 solutions#2693
Conversation
📊 xeulbn 님의 학습 현황이번 주 제출 문제
누적 학습 요약
문제 풀이 현황
🤖 이 댓글은 GitHub App을 통해 자동으로 작성되었습니다. 🔢 API 사용량 (gpt-5-nano)
|
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Two Pointers, Sorting, Hash Map / Hash Set
- 설명: 3Sum 문제에서 정렬 후 두 포인터를 활용해 합이 0이 되면 정답을 수집하고, 합이 작으면 왼쪽 포인터를, 크면 오른쪽 포인터를 이동합니다. 중복 제거를 위한 추가 조건도 포함되어 있어 Two Pointers 패턴이 핵심입니다.
📊 시간/공간 복잡도 분석
ℹ️ 이 파일에는 2가지 풀이가 포함되어 있어 각각 분석합니다.
풀이 1: Solution.threeSum — Time: O(n^2) / Space: O(1)
| 복잡도 | |
|---|---|
| Time | O(n^2) |
| Space | O(1) |
피드백: 정렬과 두 포인터 탐색으로 중복을 제거하고 필요 시 건너뛰기 처리까지 잘 구현되어 있습니다.
개선 제안: 현재 구현이 적절해 보입니다.
풀이 2: Solution.threeSum — Time: O(n^2) / Space: O(1)
| 복잡도 | |
|---|---|
| Time | O(n^2) |
| Space | O(1) |
피드백: 중복 제거 로직이 올바르게 작동하며 시간 복잡도도 최적에 가깝습니다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Dynamic Programming, Greedy
- 설명: 피보나치 형태의 부분 문제를 해결하며, DP로 각 단계의 최적 해를 저장하고 이를 이용해 최종 해를 구한다. 공간 최적화 여지가 있지만 본 코드에서는 배열을 사용한다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 정확한 동작과 적절한 초기값 설정으로 선형 시간/공간 복잡도를 만족합니다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Hash Map / Hash Set, Greedy
- 설명: 중복 여부를 확인하기 위해 해시 세트를 사용하여 한 번 방문한 값은 재방문 여부를 빠르게 체크하는 방식으로 중복 탐지를 수행합니다. 전형적인 해시 기반 탐색으로, 시간 복잡도는 O(n), 추가 공간은 O(n) 입니다.
📊 시간/공간 복잡도 분석
ℹ️ 이 파일에는 2가지 풀이가 포함되어 있어 각각 분석합니다.
풀이 1: Solution.containsDuplicate — Time: O(n) / Space: O(n)
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 해시 세트를 이용한 선형 시간 검사로 최적의 해결
개선 제안: 현재 구현이 적절해 보입니다.
풀이 2: Solution.containsDuplicate — Time: O(n) / Space: O(n)
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 해시 세트를 이용한 선형 시간 검사로 최적의 해결
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Dynamic Programming
- 설명: 배열의 부분 문제로 최대 금액을 구하는 점화식 dp[i] = max(dp[i-1], dp[i-2] + nums[i])를 이용한 전형적인 DP 풀이이며, 중복 계산을 피하기 위한 최적 부분구조를 활용합니다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 연속되게 커지는 값을 피하기 위한 최적 부분구조를 올바르게 활용
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Hash Map / Hash Set, Greedy, Two Pointers
- 설명: 집합에 존재 여부를 빠르게 확인하고, 시작점에서 연속 부분을 확장하는 방식으로 최댓값을 구하므로 해시 세트와 탐색 방향의 확장으로 구성된 그리디/투 포인터 유사 패턴에 해당합니다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 각 수를 한 번씩만 탐색하는 방식으로 최적의 시간 복잡도 확보
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Two Pointers, Hash Map / Hash Set, Dynamic Programming
- 설명: 배열의 각 원소를 곱으로 만들되 자기 자신은 제외하는 결과를 구하기 위해, 좌우 누적곱을 각각 미리 계산한 뒤 곱해 최종 값을 얻는 방식으로 진행합니다. 공간을 상수 배치로 유지하기 위해 결과 배열을 활용하는 점이 특징입니다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(1) |
피드백: 두 패스 방식으로 불필요한 나눗셈 없이 구현
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
| @@ -0,0 +1,52 @@ | |||
| import java.util.*; | |||
|
|
|||
| //시간복잡도 : O(n^2), 공간복잡도 : O(nlogn) | |||
There was a problem hiding this comment.
혹시 이거 왜 공간복잡도가 O(n log n)이 되는지 설명해주실 수 있나요?
sort에 쓰이는 추가 공간복잡도가 logn 정도는 될 것 같은데.. 그것외에는 nlogn까지 올라가는 이유가 코드상으로는 와닿지 않아서 여쭤봅니다!
| //시간복잡도 : O(n), 공간복잡도 : O(n) | ||
| //이전 두 값만 필요하기에, 공간복잡도는 O(1)까지 최적화가 가능. |
There was a problem hiding this comment.
이 문제도 위의 climb stairs 문제와 비슷하게 최적화가 가능할것 같아요!
There was a problem hiding this comment.
우선순위큐를 둬서 나중에 순서정렬 안한 것은 좋은 아이디어 같습니다!
이렇게 풀이를 할 때, 시공간 복잡도가 어떻게 될지 주석으로 적어두면 좋을 것 같습니다!
Zero-1016
left a comment
There was a problem hiding this comment.
고생하셨습니다 :) java 코드로 풀이하신거보니 재밌네요.
DaleStudy 레포지토리가 기본적으로 Squash Merge를 지원하고 있어서 지난주에 풀이하신 문제 5개가 변경사항으로 들어왔어요.
There was a problem hiding this comment.
Java에는 우선순위 큐라는 개념이 존재하군요. 새롭게 알아갑니다.
| class Solution { | ||
| public List<List<Integer>> threeSum(int[] nums) { | ||
|
|
||
| Arrays.sort(nums); |
There was a problem hiding this comment.
TMI) js는 기본이 문자열 정렬이라 이 풀이를 그대로 js로 옮기면 틀려요 java 좋네요
[10, 2, 1].sort(); // → [1, 10, 2] 😱 비교자 없으면 문자열 정렬
[10, 2, 1].sort((a,b)=>a-b); // → [1, 2, 10] 이렇게 해야 함
parkhojeong
left a comment
There was a problem hiding this comment.
다른 분들이 리뷰 꼼꼼하게 해주셨네요! 몇가지 커멘트 남겼습니다~ 수고하셨습니다!
| if(sum==0){ | ||
| // 정답 추가 | ||
| List<Integer> tmpList = new ArrayList<>(); | ||
| tmpList.add(nums[i]); | ||
| tmpList.add(nums[leftIndex]); | ||
| tmpList.add(nums[rightIndex]); | ||
|
|
||
| answer.add(tmpList); | ||
|
|
||
| // left++, right-- | ||
| leftIndex+=1; | ||
| rightIndex-=1; |
There was a problem hiding this comment.
List.of를 사용하면 tmpList 를 사용 안해도 될거 같고, 정답추가와 left++, right-- 주석은 코드로 충분히 설명이 되어서 없어도 괜찮을 거 같습니다! :)
| if(sum==0){ | |
| // 정답 추가 | |
| List<Integer> tmpList = new ArrayList<>(); | |
| tmpList.add(nums[i]); | |
| tmpList.add(nums[leftIndex]); | |
| tmpList.add(nums[rightIndex]); | |
| answer.add(tmpList); | |
| // left++, right-- | |
| leftIndex+=1; | |
| rightIndex-=1; | |
| if(sum==0){ | |
| answer.add(List.of(nums[i], nums[leftIndex], nums[rightIndex])); | |
| leftIndex+=1; | |
| rightIndex-=1; |
| return n; | ||
| } | ||
|
|
||
| int[] dp =new int[n+1]; |
There was a problem hiding this comment.
대체로 할당/산술 연산자 좌우로 스페이스를 한 칸 쓰시는 게 많은게 일관되게 맞춰주시면 좋을 거 같습니다! 문제마다 조금씩 다르네요 :)
| int[] dp =new int[n+1]; | |
| int[] dp = new int[n+1]; |
There was a problem hiding this comment.
변수 명을 공들여서 쓰시는 느낌이 드는 거 같습니다! 좋네요 :)
| if(!characterMap.containsKey(c)){ | ||
| return false; | ||
| } | ||
|
|
||
| characterMap.put(c, characterMap.get(c) - 1); | ||
| if(characterMap.get(c)<0){ | ||
| return false; | ||
| } | ||
| } |
There was a problem hiding this comment.
characterMap.get(c)<0은 조건식을 합쳐도 좋을 거 같습니다 :)
| if(!characterMap.containsKey(c)){ | |
| return false; | |
| } | |
| characterMap.put(c, characterMap.get(c) - 1); | |
| if(characterMap.get(c)<0){ | |
| return false; | |
| } | |
| } | |
| if(!characterMap.containsKey(c) || characterMap.get(c)<=0){ | |
| return false; | |
| } | |
| characterMap.put(c, characterMap.get(c) - 1); | |
| } |
| class Solution { | ||
| public boolean isValidBST(TreeNode root) { | ||
| return validate(root, Long.MIN_VALUE, Long.MAX_VALUE); | ||
| } | ||
|
|
||
| private boolean validate(TreeNode node, long min, long max) { | ||
| if (node == null) { | ||
| return true; | ||
| } | ||
|
|
||
| if (node.val <= min || node.val >= max) { | ||
| return false; | ||
| } | ||
|
|
||
| return validate(node.left, min, node.val) && validate(node.right, node.val, max); | ||
| } | ||
| } |
There was a problem hiding this comment.
코드가 매우 깔끔해서 좋은 거 같습니다 :)
답안 제출 문제
작성자 체크 리스트
In Review로 설정해주세요.검토자 체크 리스트
Important
본인 답안 제출 뿐만 아니라 다른 분 PR 하나 이상을 반드시 검토를 해주셔야 합니다!