Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions number-of-1-bits/ICE0208.java

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🏷️ 알고리즘 패턴 분석

  • 패턴: Bit Manipulation
  • 설명: 주어진 코드는 이진 비트 연산으로 1의 개수를 세는 방식으로, n의 비트를 직접 다루는 비트 조작 기법(특히 n & (n-1) 또는 비트 시프트)을 사용합니다. 이러한 접근은 Bit Manipulation 패턴에 속합니다.

📊 시간/공간 복잡도 분석

ℹ️ 이 파일에는 2가지 풀이가 포함되어 있어 각각 분석합니다.

풀이 1: Solution2.hammingWeight — Time: ✅ O(k) → O(k) / Space: ✅ O(1) → O(1)
유저 분석 실제 분석 결과
Time O(k) O(k)
Space O(1) O(1)

피드백: 비트를 하나 제거할 때마다 answer 를 증가시키므로 실제 반복 횟수는 n의 1비트 개수 k만큼 수행된다.

개선 제안: 현재 구현이 적절해 보입니다.

풀이 2: Solution1.hammingWeight — Time: ❌ O(b) → O(k) / Space: ✅ O(1) → O(1)
유저 분석 실제 분석 결과
Time O(b) O(k)
Space O(1) O(1)

피드백: 가장 오른쪽 비트를 확인하고 n을 오른쪽으로 시프트하는 방식으로 1의 비트 수만큼 반복한다.

개선 제안: 현재 구현이 적절해 보입니다.

Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
class Solution2 {
/*
* 시간 복잡도: O(k)
* - k는 n의 이진 표현에서 1인 비트의 개수이다.
* - n & (n - 1)을 할 때마다 가장 오른쪽 1 비트가 하나씩 제거되므로,
* 1의 개수만큼 반복한다.
* - 문제 조건상 n은 최대 31비트 정수이므로 실질적으로는 O(1)로 볼 수 있다.
*
* 공간 복잡도: O(1)
* - 추가 변수만 사용한다.
*/
public int hammingWeight(int n) {
int answer = 0;

while (n != 0) {
/*
* n & (n - 1)은 n의 가장 오른쪽 1 비트를 제거한다.
*
* 예를 들어 n = 1100일 때,
* n - 1 = 1011이 되고,
*
* 1100
* & 1011
* ------
* 1000
*
* 처럼 가장 오른쪽 1 비트가 제거된다.
*/
n = n & (n - 1);
answer++;
}

return answer;
}
}

class Solution1 {
/*
* 시간 복잡도: O(b)
* - b는 n의 이진 표현 길이이다.
* - 오른쪽 비트부터 하나씩 확인하므로 비트 수만큼 반복한다.
* - 문제 조건상 n은 최대 31비트 정수이므로 실질적으로는 O(1)로 볼 수 있다.
*
* 공간 복잡도: O(1)
* - 추가 변수만 사용한다.
*/
public int hammingWeight(int n) {
int answer = 0;

while (n != 0) {
// 가장 오른쪽 비트가 1이면 카운트한다.
if ((n & 1) == 1) {
answer++;
}

// 다음 비트를 확인하기 위해 오른쪽으로 한 칸 이동한다.
n >>>= 1;
}

return answer;
}
}
43 changes: 43 additions & 0 deletions valid-palindrome/ICE0208.java

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🏷️ 알고리즘 패턴 분석

  • 패턴: Two Pointers, Hash Map / Hash Set
  • 설명: 문자열을 좌우에서 각각 탐색하며 문자 여부 확인과 소문자 비교를 통해 대칭 여부를 판단하는 방식으로, 투 포인터(Two Pointers) 패턴에 해당하고 중간값 비교를 위해 보조 구조가 필요 없으므로 해시 맵은 직접적으로 사용되진 않지만 문자 처리에 히스토리적 활용이 아닌 상태이므로 핵심은 Two Pointers.

📊 시간/공간 복잡도 분석

복잡도
Time O(n)
Space O(1)

피드백: 좌우 포인터로 필요 문자만 건너뛰고 비교하는 표준 접근이다.

개선 제안: 현재 구현이 적절해 보입니다.

💡 풀이에 시간/공간 복잡도를 주석으로 남겨보세요!

Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
class Solution {

public boolean isPalindrome(String s) {
/*
* 문제에서는 대소문자를 구분하지 않고,
* 알파벳과 숫자만 남긴 뒤 팰린드롬인지 확인한다.
*
* Character.isLetterOrDigit(ch)는
* 현재 문자가 알파벳 또는 숫자인지 확인하는 함수다.
* 공백, 쉼표, 콜론 같은 문자는 비교 대상이 아니므로 건너뛴다.
*
* 입력은 printable ASCII 문자로 제한되어 있으므로
* charAt()으로 한 문자씩 확인해도 된다.
*
* 시간 복잡도: O(n)
* 공간 복잡도: O(1)
*/
int left = 0;
int right = s.length() - 1;

while (left < right) {
while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
left++;
}

while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
right--;
}

char leftChar = Character.toLowerCase(s.charAt(left));
char rightChar = Character.toLowerCase(s.charAt(right));

if (leftChar != rightChar) {
return false;
}

left++;
right--;
}

return true;
}
}
Loading