[seongmin36] WEEK 03 Solutions#2715
Conversation
📊 seongmin36 님의 학습 현황이번 주 제출 문제
누적 학습 요약
문제 풀이 현황
🤖 이 댓글은 GitHub App을 통해 자동으로 작성되었습니다. 🔢 API 사용량 (gpt-5-nano)
|
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Backtracking
- 설명: 정렬된 후보를 순차적으로 탐색하며 남은 합을 줄여가고, 조건이 맞으면 부분해를 결과에 추가하는 재귀 탐색 방식으로 구성되어 있어 Backtracking 패턴에 해당합니다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(k * n) |
| Space | O(n) |
피드백: 오름차순 정렬 후 같은 원소를 여러 번 재사용하는 백트래킹 방식으로 해를 찾으며 가지치기를 통해 불필요한 경로를 줄인다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Dynamic Programming, Two Pointers, Hash Map / Hash Set
- 설명: 주어진 코드는 문자열 분할의 경우의 수를 DP로 계산한다. 총 2자리 또는 1자리 해석 가능 여부를 점진적으로 누적해 비용을 합산하는 바텀업 DP 패턴이 핵심이다. Two Pointers나 Hash Map보다는 DP의 중요 패턴이 가장 두드러진다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 두 자리 숫자 가능 여부를 isAlphabet로 판단하고 dp 배열에 누적해 경우의 수를 합산한다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Greedy, Dynamic Programming
- 설명: 코드는 Kadane의 알고리즘으로 연속 부분 배열의 합의 최댓값을 구한다. 현재 합이 음수면 새로운 시작점을 선택하고, 양수면 계속 확장하는 방식으로 최적해를 얻는다. 따라서 Greedy와 DP의 아이디어를 모두 포함하는 대표적 패턴이다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(1) |
피드백: cur_sum과 result를 유지하며 음수 구간을 끊고 최대값을 갱신한다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Bit Manipulation, Greedy
- 설명: 비트 연산으로 1비트를 검사하고 우측으로 시프트하며 순차적으로 카운트하는 방식으로 최적화된 비트 조작 풀이이다. 덧붙여 숫자를 이진수로 변환하지 않고도 1의 개수를 구한다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(number of bits) |
| Space | O(1) |
피드백: n & 1으로 하위 비트를 확인하고 무조건 우측으로 시프트하는 루프 방식.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Two Pointers, Greedy
- 설명: 문자열을 정규화한 뒤 양 끝에서 포인터를 이동시키며 비교하는 방식으로 회문 여부를 판단한다. 두 포인터를 동시에 움직이며 중앙으로 수렴하는 패턴이다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 입력 문자열을 정규화하고 양 끝에서 투포인터로 비교한다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
togo26
left a comment
There was a problem hiding this comment.
전반적으로 로직 잘 구현해주셨습니다. 구현 노트도 함께 있어서 이해하기 쉬웠습니다. 시간/공간 복잡도도 남겨두시면 최적화 검토에 도움이 되실 것 같습니다. 3주차 수고하셨습니다👍
| if (isAlphabet(one_char)) { | ||
| dp[i] += dp[i - 1]; | ||
| } | ||
| if (i >= 2) { |
There was a problem hiding this comment.
로직 상 가장 위에서 0을 필터하기 때문에 첫번째 문자가 한가지 케이스라는 걸 보장합니다. 그래서 상단에 dp[1] = 1도 같이 초기화 할 수 있습니다. 그러면 루프 인덱스를 2로 시작할 수 있어 자연스럽게 i >= 2 삭제할 수 있습니다. (+ i 최대 범위도 조정해야 합니다)
| let one_char = s.substring(i - 1, i); | ||
| let two_char = s.substring(i - 2, i); |
There was a problem hiding this comment.
사소하지만 재할당이 없기 때문에 const 사용 가능합니다 :)
| let one_char = s.substring(i - 1, i); | |
| let two_char = s.substring(i - 2, i); | |
| const one_char = s.substring(i - 1, i); | |
| const two_char = s.substring(i - 2, i); |
| if (cur_sum <= 0) { | ||
| cur_sum = nums[i]; | ||
| } else if (cur_sum > 0) { | ||
| cur_sum = cur_sum + nums[i]; | ||
| } |
There was a problem hiding this comment.
이렇게 축약할 수 있을 것 같네요.
| if (cur_sum <= 0) { | |
| cur_sum = nums[i]; | |
| } else if (cur_sum > 0) { | |
| cur_sum = cur_sum + nums[i]; | |
| } | |
| cur_sum = Math.max(nums[i], cur_sum + nums[i]); |
| * @return {boolean} | ||
| */ | ||
| function isPalindrome(s) { | ||
| s = s.replace(/[^a-z0-9]/gi, "").toLowerCase(); |
There was a problem hiding this comment.
공간복잡도 관점에서 toLowerCase()는 내부적으로 문자열 길이만큼 새로운 문자열을 생성하기 때문에 문자열 n만큼 공간을 사용할 수 있습니다. 따라서 파라미터 값s 범위에 따라 현재 구현의 공간 사용은 선형적으로 증가하기 때문에 해당 메소드를 단일 문자열 검증에서 사용하면 복잡도를 상수로 낮출 수 있을 것 같습니다.
답안 제출 문제
작성자 체크 리스트
In Review로 설정해주세요.검토자 체크 리스트
Important
본인 답안 제출 뿐만 아니라 다른 분 PR 하나 이상을 반드시 검토를 해주셔야 합니다!