Skip to content

[WEEK01] 이지현#3

Merged
sik9252 merged 4 commits intomainfrom
sik9252
Feb 15, 2026
Merged

[WEEK01] 이지현#3
sik9252 merged 4 commits intomainfrom
sik9252

Conversation

@sik9252
Copy link
Collaborator

@sik9252 sik9252 commented Feb 13, 2026

이렇게 풀었어요

1. Two Sum

  • 문제를 풀었어요.
  • 풀이 시간 : 5분

1) 복잡도 계산

시간 복잡도: O(n²)

  • i를 도는 바깥쪽 for 문 N과 j를 도는 안쪽 for 문 N/2 -> 상수는 무시되므로 n²

공간 복잡도: O(1)


2) 접근 아이디어

배열의 모든 두 원소 조합을 직접 탐색하여 조건을 만족하는지 확인한다.

단계별 사고 과정

  1. 첫 번째 원소를 하나 고정한다. (i)
  2. 그 다음 원소부터 끝까지 순회하면서, (j)
  3. 두개를 더한 nums[i] + nums[j]가 target과 일치하는지 확인한다
  4. 조건을 만족하면 즉시 해당 원소 [i, j]를 반환한다.

3) 회고

이 코드는 직관적이고 구현이 간단하다. 그러나 입력 크기가 커지면 비효율적인 코드가 된다. 특히 시간 복잡도는 1억 이상으로 넘어가면 시간 초과가 날 확률이 높다고 했는데, N이 10,000만 되어도 이 코드로는 해결이 불가능할 수 있다. 고로 이 문제는 Map을 이용해서 O(N)으로 최적화할 수 있다.

Map을 활용한 알고리즘 흐름

  1. 빈 해시맵 생성 (값 → 인덱스)
  2. 배열을 한 번 순회
  3. 매 반복마다 -> complement = target - nums[i]
  4. 해시맵에 complement가 존재하면 → 정답
  5. 없으면 현재 값을 해시맵에 저장

var twoSum = function(nums, target) {
    const map = {};

    for (let i = 0; i < nums.length; i++) {
        const complement = target - nums[i];

        if (map[complement] !== undefined) {
            return [map[complement], i];
        }

        map[nums[i]] = i;
    }
};

2. Valid Parentheses

  • 문제를 풀었어요.
  • 풀이 시간 : 15분

1) 복잡도 계산

시간 복잡도: O(n)

  • 문자열 s 길이만큼 for-of로 순회 N, 내부의 push, pop, map[char]는 모두 상수시간

공간 복잡도: O(n)


2) 접근 아이디어

가장 최근에 열린 괄호가 가장 먼저 닫혀야 한다. -> 전형적인 LIFO 구조 -> Stack

단계별 사고 과정

  1. 문자열 길이가 홀수면 → 무조건 false이므로 바로 종료한다. (괄호는 항상 짝수 개)
  2. Stack을 생성한다.
  3. 닫는 괄호를 대응되는 여는 괄호와 비교한다.
  4. 최종적으로 Stack이 비어있어야 유효한 문자열이다.

3) 회고

예전에 어디서 풀어봤던 문제라 바로 Stack을 사용했지만, 만약 이걸 모르는 상태였으면 (), {}, []를 replace 했을 것 같다. 근데 이건 최악의 경우 O(n²)의 시간 복잡도를 가지므로 좋은 방법은 아닌 것 같다.


3. Merge Two Sorted List

  • 문제를 풀었어요.
  • 풀이 시간 : 40분

1) 복잡도 계산

시간 복잡도: O(N+M)

  • 두 리스트 노드를 각각 한 번씩만 방문함

공간 복잡도: O(1)

  • 노드 새로 생성 없이 포인터만 변경함

2) 접근 아이디어

포인터를 옮기며 값을 탐색하는게 핵심이다. 따라서 각 리스트에 포인터를 옮겨가며 최솟값을 탐색해야한다.

단계별 사고 과정

  1. 결과 리스트의 꼬리를 가리키는 더미 헤드를 준비한다.
  2. list1, list2가 둘 다 남아있는 한 계속 반복한다.
  3. list1.val <= list2.val이면 list1 노드를 결과에 연결, 아니면 list2 노드를 연결
  4. 연결한 쪽 리스트와 curr(결과) 리스트의 포인터를 다음으로 이동
  5. 반복이 끝나고 남아있는 리스트를 통째로 이어 붙인다. (리스트는 이미 정렬되어있으므로 그냥 붙이면 됨)

3) 회고

사실 스스로 풀었다고는 못하겠다. 결국 해결책을 찾지 못해서 답을 보았다. 그리고, 재귀로도 해결할 수 있을 것 같은데 길이가 길면 스택오버플로우 발생 확률이 있어서 좋은 방법은 아닌것 같다.

재귀로 푸는 방법

var mergeTwoLists = function(list1, list2) {
    if (list1 === null) return list2;
    if (list2 === null) return list1;

    if (list1.val <= list2.val) {
        list1.next = mergeTwoLists(list1.next, list2);
        return list1;
    } else {
        list2.next = mergeTwoLists(list1, list2.next);
        return list2;
    }
};

4. Best Time To Buy And Sell Stock

  • 문제를 풀었어요.
  • 풀이 시간 : 10분

1) 복잡도 계산

시간 복잡도: O(N)
공간 복잡도: O(1)


2) 접근 아이디어

오늘 판다고 가정했을 때, 과거 중 가장 싼 날에 샀다면 이익이 최대가 된다.

단계별 사고 과정

  1. minPrice(현재 최솟값), currentProfit(현재 이익) 2개의 변수를 준비한다.
  2. 순회하면서 최솟값을 갱신한다.
  3. prices[i] - minPrice을 통해 매번 이익을 계산한다.
  4. prices[i] - minPrice > currentProfit를 통해 최대 이익을 갱신한다.

3) 회고

@sik9252 sik9252 changed the title Sik9252 [WEEK 01] 이지현 Feb 13, 2026
@sik9252 sik9252 changed the title [WEEK 01] 이지현 [WEEK01] 이지현 Feb 13, 2026
Comment on lines +5 to +9
const map = {
")": "(",
"]": "[",
"}": "{",
};
Copy link
Collaborator

Choose a reason for hiding this comment

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

오우 아이디어가 좋네요!

Copy link
Collaborator

Choose a reason for hiding this comment

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

아이디어가 너무 좋네요!
배우고 갑니다

Copy link
Member

@doitchuu doitchuu left a comment

Choose a reason for hiding this comment

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

풀이가 깔끔하고 잘 푸셔서 많이 배워갑니다 👍
많이 자극받구가욤

} else if (prices[i] - minPrice > currentProfit) {
currentProfit = prices[i] - minPrice;
}
}
Copy link
Member

Choose a reason for hiding this comment

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

else 문이 없다보니 아래처럼 풀어도 좋지 않을까 싶긴하네요 👍
기존 풀이도 깔끔해서 좋은 거 같아요!

for (let i = 0; i < prices.length; i++) {
  if (prices[i] < minPrice) {
    minPrice = prices[i];
    continue;
  }

  const profit = prices[i] - minPrice;
  if (profit > currentProfit) currentProfit = profit;
}

@sik9252 sik9252 merged commit 39bf342 into main Feb 15, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants