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
53 changes: 53 additions & 0 deletions 3sum/dahyeong-yun.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, Sorting
  • 설명: 세 수의 합을 0으로 만드는 조합을 찾기 위해 배열을 오름차순으로 정렬한 뒤, 고정된 하나의 수에 대해 좌우 포인터를 움직여 필요한 합을 찾는 방식으로 중복 제거를 수행합니다. 이 패턴은 Two Pointers의 대표적 예이며, 공간은 상수로 유지됩니다.

📊 시간/공간 복잡도 분석

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

피드백: 정렬 후 한 바퀴 루프에서 두 포인터로 조합을 탐색하고 중복 제거를 수행합니다.

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

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/**
* 0. 풀이 개요
* - 시간복잡도 : O(n^2)
* - 공간복잡도 : O(1)
*/

class Solution {
/**
* 1. 풀이 과정
* 1.1 문제 이해
* - 세 수의 합이 0이 되는 중복 없는 전체 조합 찾기
* 1.2 제약 사항
* - 인덱스의 조합이 아닌 값의 조합이므로 배열의 원본을 유지할 필요는 없음
* - 조합의 중복을 어떻게 제외 시킬지가 관건
* 1.3 풀이 아이디어
* - 하나의 값이 고정되어 있으면 나머지 두 원소의 합이 고정값 * -1 이 되어야 하는 형태라고도 볼 수 있음
* - 배열의 인덱스는 몰라도 되므로 배열을 오름차순으로 정렬할 수 있음
* - 이때 고정값 하나는 반복문 안에서 루프를 돌면서 정하고, 나머지 두 수는 투 포인터로 원하는 조합을 찾을 수 있음
* - 배열이 오름차순으로 정렬되어 있으므로, 만약 합이 0 보다 크다면 숫자가 작아져야 하고, 0보다 작다면 숫자가 커져야 함.
* - 따라서 세 수의 합이 작아져야 한다면 우측 포인터를 좌측으로 옮기면서 숫자를 줄일 수 있고,
* - 합이 커져야 한다면 좌측 포인터를 우측으로 옮기면서 전체 합을 키울 수 있음.
* - 여기에 더해 중복을 제외하기 위해서 같은 수의 경우는 포인터를 건너뛰는 식으로 처리할 수 있음.
* - 시간복잡도는 배열의 원소(n)만큼 루프를 돌면서, 그 안에서 최악의 경우 n - 2 번 순회 하게 되므로 N(N-2) 가 되어 n^2 이라 볼 수 있음.
* - 추가적인 공간을 일부 만들기는 하는데 n에 차수에 대응하는 수가 없으므로 공간복잡도는 O(1)로 판단.
*/
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> answer = new ArrayList<>();

for(int i=0; i < nums.length - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}

int left = i+1;
int right = nums.length - 1;

while(left < right) {
if(nums[i] + nums[left] + nums[right] == 0) {
List<Integer> triple = List.of(nums[i], nums[left], nums[right]);
answer.add(triple);
while(left+1 < right && nums[left] == nums[left+1]) left++;
while(right > 0 && nums[right] == nums[right-1]) right--;
left++;
right--;
} else if(nums[i] + nums[left] + nums[right] > 0) right--;
else left++;
}
}

return answer;
}
}
36 changes: 36 additions & 0 deletions climbing-stairs/dahyeong-yun.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) 문제입니다. 배열 또는 최적화를 통한 상태 저장으로 n 단계까지의 가짓수를 구합니다.

📊 시간/공간 복잡도 분석

유저 분석 실제 분석 결과
Time O(1) O(n)
Space O(1) O(n)

피드백: 상향식 DP로 각 단계의 경우의 수를 저장합니다.

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* 0. 풀이 개요
* - 시간복잡도 : O(n)
* - 공간복잡도 : O(n)
*/
class Solution {
/**
* 1. 풀이 과정
* 1.1 이해
* - n 이 계단 수고 그 계단을 오르는 방법의 가짓 수를
* 1.2 제약
* - n이 1부터 45까지 임.
* 1.3 아이디어
* - 전형적인 DP 로 보이긴 함.
* - 현 단계로 오기 위해서는 전 단계에서 + 1을 하던지 전전단계에서 + 2 하던지 하는 방법이 있음
* - 즉 전 단계 까지의 가짓 수 + 전전 단계까지의 가짓 수 = 현 단계의 가짓 수 됨
* - 1번째와 2번째는 전전 단계가 없으므로 직접 계산 해준다.
* - n까지 순회하면서 계산하며, 각 단계의 가짓 수는 O(1)에 조회되므로 시간복잡도는 O(n) 이다.
* - 별도 배열이 n+1 만큼 필요하므로 O(n)의 공간복잡도를 가진다.
* 2. 최적화
* - 각 단계의 숫자는 계속 가지고 있을 필요 없이 별도 변수로 처리하면 공간복잡도를 O(1)로 최적화 할 수 있다.
*/
public int climbStairs(int n) {
if(n == 1) return 1;
if(n == 2) return 2;

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

for(int i=3; i<=n; i++) {
steps[i] = steps[i-1] + steps[i-2];
}
return steps[n];
}
}
43 changes: 43 additions & 0 deletions product-of-array-except-self/dahyeong-yun.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, Dynamic Programming, Hash Map / Hash Set
  • 설명: 두 포인터의 개념과 유사하게 왼쪽/오른쪽 곱을 누적하는 배열을 이용해 한 번씩 순회하는 아이디어로 구현, 부분적으로는 prefix/suffix 누적을 활용하는 패턴이며, 부분적으로 DP적 관계를 이용해 결과를 계산합니다. 해시맵은 사용되지 않으므로 다른 패턴은 제외합니다.

📊 시간/공간 복잡도 분석

유저 분석 실제 분석 결과
Time O(n) O(n)
Space O(n) O(1)

피드백: 두 패스를 통해 각 위치의 곱을 구하는 표준 풀이를 사용합니다.

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/**
* 0. 풀이 개요
* - 시간복잡도 : O(n)
* - 공간복잡도 : O(n)
*/
class Solution {
/**
* 1. 풀이 과정
* 1.1 이해
* - 각 배열의 원소가 본인을 제외한 모든 것이 곱해진 상태를 출력하면 됨.
* 1.2 제약
* - n이 2부터 10^5까지 임. 배열을 순회하는 경우 n^2은 어려워 보임(10^8 기준). 따라서 n log n 이하가 필요
* 1.3 아이디어
* - 사실 문제를 몇번 풀었어서 외워져 버림
* - 시각적으로 보이자면 2개의 배열을 활용하는 셈
* - | 배열 원소를 변수로 치환 | a | b | c | d |
* | prefix 의 상태 | 1 | 1 * a = a | a * b = ab | ab * c = abc |
* | suffix 의 상태 | bcd | cd | d | 1 |
* | prefix * suffix | bcd | acd | abd | abc |
* - 시간복잡도는 n 번씩 두번 순회 하므로 2n 번 순회로 O(n)이 됨.
* - 공간복잡도는 n 크기 만큼의 배열을 추가로 생성하므로 O(n)이 됨.
*/
public int[] productExceptSelf(int[] nums) {
int prefix = 1;
int suffix = 1;

int len = nums.length;
int[] answer = new int[len];

answer[0] = 1;
for(int i = 1; i < len; i++) {
answer[i] = prefix * nums[i-1];
prefix *= nums[i-1];
}

for(int i = len-1; i >= 0; i--) {
answer[i] = answer[i] * suffix;
suffix *= nums[i];
}

return answer;
}
}
28 changes: 28 additions & 0 deletions valid-anagram/dahyeong-yun.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.

🏷️ 알고리즘 패턴 분석

  • 패턴: Sorting
  • 설명: 두 문자열을 각각 배열로 변환한 후 정렬하고, 정렬된 배열의 동일성으로 애너그램 여부를 판별하는 아이디어로, 전체 흐름은 정렬 기반 접근에 해당합니다.

📊 시간/공간 복잡도 분석

유저 분석 실제 분석 결과
Time O(n log n) O(n log n)
Space O(n) O(n)

피드백: 정렬 기반 비교로 구현되어 있습니다.

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/**
* 0. 풀이 개요
* - 시간복잡도 : O(n log n)
* - 공간복잡도 : O(n)
*/
class Solution {
/**
* 1. 풀이 과정
* 1.1 문제 이해
* - 애니어램이 가능한 문자열인지 판단하는 문제임. 두 문자열 s와 t가 주어지고, t가 s의 애니어그램이라면 true를 반환
* 1.2 제약 사항
* - s, 와 t의 문자열의 길이가 5 * 10^4 이므로 문자열 길이 만큼 순회해야 한다면 O(n^2)은 불가능해 보임. O(n log n) 이하가 필요.
* - 문자는 반드시 영소문자로만 구성되어 있으나, 만약 Follow up 질문 처럼 유니코드를 포함해야 된다면 이를 포괄하는 자료형이 필요.
* 1.3 풀이 아이디어
* - 문자열을 정렬했을 때, 같은 문자열이라면 애니그램이 될 것.
* - 문자열의 character를 배열로 만들고 정렬하면, bulit-in 메서드에 의해 O(n log n)의 시간복잡도가 가짐,
* - 문자열의 길이만큼 character 배열이 필요하므로 2n 만큼의 공간이 더 필요하므로 O(n)의 공간복잡도를 가짐.
*/
public boolean isAnagram(String s, String t) {
char[] arrayS = s.toCharArray();
char[] arrayT = t.toCharArray();

Arrays.sort(arrayS);
Arrays.sort(arrayT);

return Arrays.equals(arrayS, arrayT);
}
}
28 changes: 28 additions & 0 deletions validate-binary-search-tree/dahyeong-yun.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, Greedy, Divide and Conquer, Two Pointers, Sliding Window, Fast & Slow Pointers, BFS, DFS, Backtracking, Dynamic Programming, Monotonic Stack, Heap / Priority Queue, Union Find, Trie, Bit Manipulation
  • 설명: 주어진 코드는 애니그램 판단을 위해 문자열을 정렬한 후 비교하는 방식으로, 두 문자열 간의 문자 다중집합 동등성 확인에 해당하는 패턴입니다. 정렬은 n log n 시간, 추가 배열 두 개로 O(n) 공간을 사용합니다.

📊 시간/공간 복잡도 분석

유저 분석 실제 분석 결과
Time O(n log n) O(n log n)
Space O(n) O(n)

피드백: 잘못된 문제 기재로 보이며 본문이 일관되지 않습니다.

개선 제안: 유효한 BST 검증 예시 코드로 교체하는 것이 좋습니다.

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/**
* 0. 풀이 개요
* - 시간복잡도 : O(n log n)
* - 공간복잡도 : O(n)
*/
class Solution {
/**
* 1. 풀이 과정
* 1.1 문제 이해
* - 애니어그램이 가능한 문자열인지 판단하는 문제임. 두 문자열 s와 t가 주어지고, t가 s의 애니어그램이라면 true를 반환
* 1.2 제약 사항
* - s, 와 t의 문자열의 길이가 5 * 10^4 이므로 문자열 길이 만큼 순회해야 한다면 O(n^2)은 불가능해 보임. O(n log n) 이하가 필요.
* - 문자는 반드시 영소문자로만 구성되어 있으나, 만약 Follow up 질문 처럼 유니코드를 포함해야 된다면 이를 포괄하는 자료형이 필요.
* 1.3 풀이 아이디어
* - 문자열을 정렬했을 때, 같은 문자열이라면 애니어그램이 될 것.
* - 문자열의 character를 배열로 만들고 정렬하면, bulit-in 메서드에 의해 O(n log n)의 시간복잡도가 가짐,
* - 문자열의 길이만큼 character 배열이 필요하므로 2n 만큼의 공간이 더 필요하므로 O(n)의 공간복잡도를 가짐.
*/
public boolean isAnagram(String s, String t) {
char[] arrayS = s.toCharArray();
char[] arrayT = t.toCharArray();

Arrays.sort(arrayS);
Arrays.sort(arrayT);

return Arrays.equals(arrayS, arrayT);
}
}
Loading