Skip to content

[WEEK04-2] 이지현#14

Merged
sik9252 merged 2 commits intomainfrom
sik9252
Mar 6, 2026
Merged

[WEEK04-2] 이지현#14
sik9252 merged 2 commits intomainfrom
sik9252

Conversation

@sik9252
Copy link
Collaborator

@sik9252 sik9252 commented Mar 4, 2026

이렇게 풀었어요

1. Climbing Stairs

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

1) 복잡도 계산

시간 복잡도: O(n)

공간 복잡도: O(n)


2) 접근 아이디어

한 번에 1칸 또는 2칸 올라갈 수 있을 때, n칸을 올라가는 서로 다른 방법의 수를 구하는 문제다.

핵심 아이디어는,

  1. n-1번째 계단에서 1칸 올라옴
  2. n-2번째 계단에서 2칸 올라옴

f(n) = f(n-1) + f(n-2) 라는 점화식이 만들어진다.

어디선가 많이 본 공식이다. 피보나치 형태의 전형적인 DP의 기본 문제다.


3) 회고

외워두었던 공식이 있어 빠르게 풀 수 있었는데, 조금만 심화된 DP가 나오면 바로 못푼다.^^
일단 기본 공식은 외우고 있기 때문에 아쉬운 느낌이 들어 공간 복잡도를 조금 최적화할 수 있는 방법을 찾아보았다.
지금 작성한 풀이는 new Array(n + 1)의 공간을 생성한 뒤 집어넣기 때문에 O(n)의 공간복잡도를 가지고 있다.
피보나치는 이전 두 값만 필요하다라는 것을 이용하면 공간을 O(1)로 최적화할 수 있다.

function climbStairs(n) {
  if (n <= 2) return n;

  let a = 1;
  let b = 2;

  for (let i = 3; i <= n; i++) {
    const c = a + b;
    a = b;
    b = c;
  }

  return b;
}

2. Longest Palindrome

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

1) 복잡도 계산

시간 복잡도: O(n)

공간 복잡도: O(n)


2) 접근 아이디어

주어진 문자열의 문자들을 재배열해서 만들 수 있는 가장 긴 palindrome 길이를 구하는 문제다.
재배열이란 키워드에서 얻을 수 있는 중요한 포인트는 문자 순서를 유지할 필요가 없다는 점이다.

palindrome의 정의는 아래와 같다.
ex) abba, racecar, aa, aba

즉, 앞에서 읽어도 뒤에서 읽어도 같은 문자열로 구조적으로 pair pair pair [center] pair pair pair 이란 공식을 세울 수 있다.

이 문제 풀이의 핵심 아이디어는 문자열을 모두 구할 필요 없이 길이만 구하면 된다는 점이다.

예시로 보면,

s = "abccccdd" 일 때,

문자열 순회가 끝난 후 아래 형태를 가지게 된다.

Set = {a, b}
length = 6

cc -> +2

cc -> +2

dd -> +2

따라서, length = 6

하지만, Set 안에 a, b 2가지 종류가 1개씩 남아있다.

이 중 딱 한가지만 center에 위치할 수 있다.

따라서 마지막에 아래 코드를 작성해주면 최종 길이가 완성된다.

if (set.size > 0) {
  length += 1;
}

3) 회고

처음에는 괄호 문제처럼 Stack에서 push, pop하면서 풀면 되나 하는 생각이 들었는데, Stack은 순서가 중요하고, LIFO 구조여야 의미있으며, 바로 이전 요소와 매칭해야하는 특징이 있다. 그런데, 이 문제는 문자 순서는 고려 대상이 아니다. 그래서 Stack은 안된다. 그다음엔 문자 개수 카운팅에 자주 쓰이는 Map이 생각났다. 이걸로 풀면 문자열을 순회하며 각 문자 빈도를 Map에 기록하고 짝수냐 홀수냐에 따라 최종 length를 count하면 된다.

Map으로 푸는 문제 풀이

function longestPalindrome(s) {
  const freq = new Map();

  for (const char of s) {
    freq.set(char, (freq.get(char) || 0) + 1);
  }

  let length = 0;
  let hasOdd = false;

  for (const count of freq.values()) {
    if (count % 2 === 0) {
      length += count;
    } else {
      length += count - 1;
      hasOdd = true;
    }
  }

  if (hasOdd) length += 1;

  return length;
}

그런데, Stack이 계속 머릿속에 멤돌며 더 쉽게 풀 수 있는 방법을 고민하다가 Set을 사용하는 방법도 있다는 것을 떠올리게 되었다. Map을 이용한 방식은 많이 풀어보았으니 Set을 이용한 새로운 방법으로 풀어보기로 했다.

그리고 Set을 사용하면 Map을 사용했을 때보다 코드 작성을 1줄 더 줄일 수 있다.

짝수 개 → 모두 사용
홀수 개 → count - 1 사용
홀수 문자가 하나라도 있으면 +1 (가운데)

이 3가지 조건을 다 작성해줘야하는 대신 첫번째, 세번째 조건만 따져주면된다.

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 {
set.add(char);
}
}
Copy link
Member

Choose a reason for hiding this comment

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

오 Set으로 푸는 방식 너무 좋네요 👍
반복문 한번으로 해결되니 이 풀이 너무 좋은걸료

Copy link
Collaborator

@raejun92 raejun92 left a comment

Choose a reason for hiding this comment

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

고생하셨습니다!
LongestPalindrome의 set로 접근한 아이디어는 정말 대박이군요

@sik9252 sik9252 merged commit 064f52e into main Mar 6, 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