[Yiseull] WEEK 03 Solutions#2720
Conversation
📊 Yiseull 님의 학습 현황이번 주 제출 문제
누적 학습 요약
문제 풀이 현황
🤖 이 댓글은 GitHub App을 통해 자동으로 작성되었습니다. 🔢 API 사용량 (gpt-5-nano)
|
(cherry picked from commit d881c4d)
| @@ -0,0 +1,5 @@ | |||
| class Solution { | |||
| public int hammingWeight(int n) { | |||
| return Integer.bitCount(n); | |||
There was a problem hiding this comment.
옷, 요런 풀이는 출제 의도와 맞지 않을지도? 면접관이 Integer.bitCount이 어떻게 동작하는 깊고 파고 들면 인터뷰가 말릴 수도 있고요. 코딩 테스트에서 표준 라이브러리를 사용하는 것은 양날의 검이 될 수 있으니 참고 바랍니다.
There was a problem hiding this comment.
말씀하신 대로 코딩테스트 준비 과정에서는 라이브러리 사용을 자제하고 직접 구현해서 푸는 게 맞는 것 같습니다.
이 문제는 풀이를 알고 있어서 간단히 Integer.bitCount로 처리했는데, 앞으로는 내부 동작까지 설명할 수 있도록 직접 구현하는 방향으로 연습하겠습니다. 좋은 피드백 감사합니다! 🙏
There was a problem hiding this comment.
openjdk 구현체의 경우엔 2비트로 쪼개서 좌측 비트를 빼는 식으로 계산을 하네요. POPCNT 지원하는 cpu의 경우 JVM에서 체크해서 해당 명령어 사용하도록 최적화 하는 방식인 것 같습니다. 코드 링크도 첨부해드립니다~
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}There was a problem hiding this comment.
코드까지 찾아서 알려주셔서 내부 구현 코드까지 확인했네요 감사합니다!👍 한 번에 이해는 안돼서 클로드랑 같이 이해 해봐야겠네요 ㅎㅎ
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Backtracking, Depth-First Search
- 설명: 깊이 우선 탐색으로 가능한 모든 조합을 탐색하며, 타깃에 도달하면 해를 수집하는 백트래킹 패턴의 전형적인 구현입니다. 중복 없이 선택 가능하도록 시작 인덱스를 유지합니다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(K * N) |
| Space | O(N) |
피드백: 정렬 후 가지치기를 통해 불필요한 경로를 제거하고, 현재 조합에 같은 원소를 재사용 가능하도록 인덱스 i를 유지한다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Dynamic Programming
- 설명: 주어진 코드는 문자열을 1,2자리 숫자로 해석해 가능한 경우의 수를 누적 합으로 계산하는 전형적인 DP(0/1 계단식) 문제 풀이 패턴이다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(n) |
피드백: 두 자리 수의 유효성 판단과 한 자리 수의 가능성을 합쳐 누적합으로 해결한다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Greedy, Dynamic Programming
- 설명: 최대 부분배열 문제를 한 루프에서 누적합과 부분해를 비교하는 방식으로 해결하므로 그리디 패턴에 속하며, 부분합의 최댓값을 유지하는 점에서 DP의 최적 부분구조 아이디어와도 연관된다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(1) |
피드백: 현재 풀이에서 tmp를 누적하고 최댓값을 갱신하는 표준 방식이다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Bit Manipulation
- 설명: 주어진 코드는 비트 연산을 이용해 1비트의 개수를 세는 방식이다. n & (n-1) 연산으로 최하위 1을 제거하는 트릭은 비트 조작 패턴의 대표 예이다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(k) |
| Space | O(1) |
피드백: n & (n-1) 트릭으로 1비트를 제거하며 반복한다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
There was a problem hiding this comment.
🏷️ 알고리즘 패턴 분석
- 패턴: Two Pointers, Greedy, Hash Map / Hash Set
- 설명: 주 코드의 두 번째 풀이에서 좌우 포인터를 이동하면서 문자 필터링 및 대소문자 비교를 통해 회문 여부를 판단한다. 필요한 경우 양쪽에서 각각 비교하며 조건에 맞지 않으면 즉시 반환하므로 투 포인터(좌우 포인터) 패턴에 해당한다. 필요 시 불필요 문자 건너뛰기 로직은 그리디적 흐름으로 진행된다.
📊 시간/공간 복잡도 분석
| 복잡도 | |
|---|---|
| Time | O(n) |
| Space | O(1) |
피드백: 2가지 구현 중 현재는 투 포인터 방식으로 추가 공간 없이 진행한다.
개선 제안: 현재 구현이 적절해 보입니다.
💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!
| int answer = -10001, tmp = 0; | ||
|
|
||
| for (int i = 0; i < nums.length; i++) { | ||
| tmp += nums[i]; | ||
| answer = Math.max(answer, tmp); | ||
| tmp = Math.max(tmp, 0); | ||
| } | ||
|
|
||
| return answer; | ||
| } |
There was a problem hiding this comment.
tmp가 임시 변수로 의미 없는 값인 줄 알았는데 실제 로직에서는 의미가 있어서 적절한 네이밍 해주시면 더 좋을 거 같습니다!
There was a problem hiding this comment.
의미있는 네이밍 currentSum으로 변경했습니다! 피드백 감사합니다!
답안 제출 문제
작성자 체크 리스트
In Review로 설정해주세요.검토자 체크 리스트
Important
본인 답안 제출 뿐만 아니라 다른 분 PR 하나 이상을 반드시 검토를 해주셔야 합니다!