DEV

LeetCode #242쉬움

242. Valid Anagram

242. Valid Anagram

String
해설 읽기 3
typescript

문제 설명

Given two strings s and t, return true if t is an anagram of s, and false otherwise. Example 1: Input: s = "anagram", t = "nagaram" Output: true Example 2: Input: s = "rat", t = "car" Output: false

⚠️제약 조건

  • 1 <= s.length, t.length <= 5 * 10^4

  • s와 t는 소문자 영어 알파벳으로 구성되어 있습니다.

해결 방법

🎯접근 방식

이 문제는 두 문자열이 애너그램인지 확인하는 문제로, 해시맵(Map)을 사용하여 각 문자열의 문자 빈도를 비교하는 방식으로 해결했습니다. 먼저 첫 번째 문자열 s의 각 문자의 빈도를 해시맵에 저장하고, 두 번째 문자열 t를 순회하며 해당 문자의 빈도를 감소시킵니다. 최종적으로 모든 문자의 빈도가 0이 되면 두 문자열은 애너그램입니다. 핵심 아이디어는 두 문자열의 각 문자의 출현 빈도가 동일해야 한다는 점입니다.

솔루션 코드

복잡도 분석

시간 복잡도:O(n)
공간 복잡도:O(n)

💡상세 설명

이 문제는 두 문자열 st가 주어졌을 때, ts의 애너그램인지 확인하는 것입니다. 애너그램이란 문자의 순서는 다르지만 동일한 문자로 구성된 두 문자열을 의미합니다. 예를 들어, "anagram"과 "nagaram"은 서로 애너그램입니다.

이제 주어진 해결 코드에 대해 자세히 설명하겠습니다.

1. 알고리즘의 핵심 아이디어

이 알고리즘의 핵심은 두 문자열이 같은 문자 구성으로 이루어져 있는지를 확인하는 것입니다. 이를 위해 각 문자열의 문자를 세어 비교하는 방법을 사용합니다. 두 문자열이 애너그램이라면, 각 문자의 출현 빈도가 같아야 합니다.

2. 코드의 주요 로직 설명

  1. 길이 비교: 두 문자열의 길이가 다르면 애너그램일 수 없으므로 바로 false를 반환합니다.
  2. 문자 빈도 계산: 첫 번째 문자열 s의 각 문자의 빈도를 Map을 사용하여 저장합니다.
  3. 빈도 비교 및 감소: 두 번째 문자열 t의 각 문자를 Map에서 찾아 빈도를 감소시킵니다. 만약 t의 문자가 Map에 없거나 빈도가 0보다 작다면 애너그램이 아니므로 false를 반환합니다.
  4. 최종 결과 반환: 모든 문자가 적절히 감소되었다면 true를 반환합니다.

3. 각 단계별 동작 과정

  • 길이 비교 단계: if (s.length !== t.length) return false;
    두 문자열의 길이를 비교하여 다르면 즉시 false를 반환합니다. 이는 기본적인 애너그램 조건을 빠르게 체크할 수 있는 방법입니다.

  • 문자 빈도 계산 단계:

    for (let i = 0; i < s.length; i++) {
      case1.set(s[i], case1.has(s[i]) ? case1.get(s[i]) + 1 : 1);
    }
    

    문자열 s의 각 문자를 Map에 저장합니다. Map의 키는 문자이며, 값은 해당 문자의 빈도입니다. 이미 존재하는 문자라면 빈도를 1 증가시킵니다.

  • 빈도 비교 및 감소 단계:

    for (let i = 0; i < t.length; i++) {
      if (case1.has(t[i])) {
        if (case1.get(t[i]) > 0) {
          case1.set(t[i], case1.get(t[i]) - 1);
        } else {
          return false;
        }
      } else {
        return false;
      }
    }
    

    문자열 t의 각 문자를 Map에서 찾아 빈도를 감소시킵니다. 만약 t의 문자가 Map에 없거나 빈도가 0이라면 false를 반환합니다.

  • 최종 결과 반환: 모든 검사가 끝난 후 true를 반환합니다.

4. 핵심 변수들의 역할

  • case1: Map 객체로, 문자열 s의 각 문자의 빈도를 저장합니다. 이를 통해 문자열 t의 각 문자가 s와 같은 빈도로 존재하는지를 확인할 수 있습니다.

5. 왜 이 방법이 효과적인지

이 방법은 각 문자열을 한 번씩 순회하며 문자의 빈도를 계산하고 비교하기 때문에 시간 복잡도가 O(n)입니다. 이는 문자열의 길이에 비례하여 매우 효율적입니다. 또한, Map을 사용하여 문자의 빈도를 관리함으로써 빠른 조회와 업데이트가 가능하여 전체 알고리즘의 성능을 높입니다. 이러한 점에서 이 방법은 애너그램 판별에 효과적입니다.

관련 문제