Skip to content
20 changes: 20 additions & 0 deletions climbing-stairs/sonshn.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.

🏷️ 알고리즘 패턴 분석

  • 패턴: Dynamic Programming
  • 설명: 갈 수 있는 방법의 수를 피보나치 형태로 점화하는 DP 방식으로 해결합니다. dp 배열로 이전 두 단계의 합을 현재 단계로 확장하는 전형적인 동적계획법 패턴입니다.

📊 시간/공간 복잡도 분석

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

풀이 1: Solution.climbStairs — Time: O(n) / Space: O(n)
복잡도
Time O(n)
Space O(n)

피드백: 선형 시간으로 각 i에 대해 이전 두 값을 더해 계단 수를 구한다. 추가 공간으로 dp 배열이 필요하다.

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

풀이 2: sonshn.hammingWeight — Time: O( number of bits ) / Space: O(1)
복잡도
Time O( number of bits )
Space O(1)

피드백: 정수 비트 수만큼 루프를 돌며 각 비트를 확인한다. 공간은 상수이다.

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

풀이 3: Solution.isAnagram — Time: O(n log n) / Space: O(n)
복잡도
Time O(n log n)
Space O(n)

피드백: 정렬을 이용한 비교로 구현되었으며, 두 문자열의 길이를 n이라고 하면 시간은 O(n log n)이다.

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

풀이 4: Solution.isPalindrome — Time: O(n) / Space: O(1)
복잡도
Time O(n)
Space O(1)

피드백: 문자열을 한 번 스캔하며 필요없는 문자는 건너뛰고 소문자로 비교한다.

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

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* dp[i] = dp[i - 1] + dp[i - 2]
*/
class Solution {
public int climbStairs(int n) {
if (n <= 2) {
return n;
}

int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;

for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}

return dp[n];
}
}
19 changes: 19 additions & 0 deletions number-of-1-bits/sonshn.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의 개수를 세는 패턴으로, 비트 연산과 오른쪽 쉬프트를 이용한 비트 카운팅이다.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/**
* hammingWeight
* 정수 n의 이진수 표현에서 1의 개수를 반환
*
* 시간 복잡도: O(1)
* 공간 복잡도: O(1)
*/
public class sonshn {
public int hammingWeight(int n) {
int count = 0;

while (n != 0) {
count += (n & 1);
n >>>= 1;
}

return count;
}
}
19 changes: 19 additions & 0 deletions valid-anagram/sonshn.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.

🏷️ 알고리즘 패턴 분석

  • 패턴: Binary Search, Hash Map / Hash Set, Sorting
  • 설명: 주요 아이디어는 문자열을 문자 배열로 변환하고 정렬한 뒤 서로 비교하는 방식으로 동일 문자 구성인지 판단한다. 정렬은 O(n log n) 시간, O(n) 공간을 사용한다.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import java.util.*;

/**
* String to char array, sort, and compare
*
* 시간 복잡도: O(nlogn)
* 공간 복잡도: O(n)
*/
class Solution {
public boolean isAnagram(String s, String t) {
char[] sArray = s.toCharArray();
char[] tArray = t.toCharArray();

Arrays.sort(sArray);
Arrays.sort(tArray);

return Arrays.equals(sArray, tArray);
}
}
36 changes: 36 additions & 0 deletions valid-palindrome/sonshn.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, Greedy
  • 설명: 문자열의 양 끝에서 문자들을 비교하며, 비문자도 건너뛰고 대소문자 구분 없이 비교하므로 두 포인터가 서로를 향해 진행하는 패턴이 핵심이다. 일반적인 구현으로는 Two Pointers에 해당하며, 간단한 비교 로직은 그 자체로 Greedy에 준하는 의사결정(필요한 문자만 비교)으로 볼 수 있음.

Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* Palindrome 문자열인지 확인하는 문제
*
* Java에서 제공하는 Character.isLetterOrDigit() 메서드를 사용하여 알파벳과 숫자인지 확인하고,
* Character.toLowerCase() 메서드를 사용하여 대소문자를 구분하지 않고 비교
*
* 시간 복잡도: O(n)
* 공간 복잡도: O(1)
*/
class Solution {

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.

저는 문자열을 파싱하고나서 유효성 검사하는 방법이었는데, 파싱과 유효성을 동시에 검사하면 공간복잡도를 좀 더 줄일 수 있는 것 같아 보여서 좋아보입니다 !!

public boolean isPalindrome(String s) {
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--;
}

if (Character.toLowerCase(s.charAt(left))
!= Character.toLowerCase(s.charAt(right))) {
return false;
}

left++;
right--;
}

return true;
}
}
Loading