valid-anagram

Jeenie·2025년 5월 8일

원리

문제의 핵심 : anagram을 검증하라 (문자의 길이와 요소 동일 검증)

초기제출 (실패)

  • 문제의 요구사항을 만족시키지 못함

테케는 통과했는데 제출에 실패했다.
s와 t 문자열의 길이가 다를 경우를 전혀 고려하지 않아서인 듯...
문제를 풀 때 너무 짧게만 생각하는 경향이 있다

var isAnagram = function (s, t) {
    // 전제 : t의 문자들은 반드시 s에도 존재해야한다

    // 1. 이중 for문으로 가능
    let hasChar = false
    for (let i = 0; i < t.length; i++) {
        for (let j = 0; j < s.length; j++) {
            if (t[i] === s[j]) {
                // 문자가 존재한다
                hasChar = true
            }
        }
        return hasChar
    }
};

chatGPT의 피드백

좋은 시도였어요! 하지만 이 풀이는 논리적으로 문제 요구사항을 만족하지 못하고, 실제로 오답을 반환합니다. 면접관의 입장에서 아래와 같이 피드백드릴 수 있어요.


🔍 문제 요구사항 복습

두 문자열 st가 **애너그램(anagram)**인지 판단하세요.
즉, 같은 문자를 같은 수만큼 포함해야 합니다.

  • s = "anagram", t = "nagaram" → ✅ True
  • s = "rat", t = "car" → ❌ False

🔎 현재 코드의 문제점

for (let i = 0; i < t.length; i++) {
    for (let j = 0; j < s.length; j++) {
        if (t[i] !== s[j]) {
            // 문자가 존재한다
        } else {
            hasChar = true
        }
    }
    return hasChar
}

❌ 잘못된 점

  1. 문자 개수 검증 없음: 단순히 t[i]s에 존재하는지만 확인하고 있음 → 문자 수가 달라도 true로 처리됨
  2. return이 for문 안에 있음i = 0일 때만 검사하고 바로 종료
  3. 중복 문자 처리 안됨 → 예: s = "aab", t = "ab" → 이 코드로는 true 반환됨 (틀림)

✅ 면접관이 기대하는 풀이 방향

  1. 정렬 기반 풀이 (가장 직관적)
var isAnagram = function(s, t) {
    if (s.length !== t.length) return false;
    return s.split('').sort().join('') === t.split('').sort().join('');
};
  • 시간복잡도: O(n log n) (정렬)
  • 공간복잡도: O(1) (in-place 정렬 가능)

2. 해시맵 (문자 카운팅) 풀이 – 효율적

var isAnagram = function(s, t) {
    if (s.length !== t.length) return false;

    const map = {};

    for (let i = 0; i < s.length; i++) {
        map[s[i]] = (map[s[i]] || 0) + 1;
        map[t[i]] = (map[t[i]] || 0) - 1;
    }

    return Object.values(map).every(v => v === 0);
};
  • 시간복잡도: O(n)
  • 공간복잡도: O(1) (영어 알파벳 수가 고정 26자)

💬 면접관이 하고 싶은 말
좋은 시작이지만, 현재 풀이는 논리적/기술적 결함이 있어서 정확한 해를 보장하지 못합니다.
애너그램은 문자 존재 여부뿐 아니라 문자 수까지 정확히 맞아야 하므로, 문자 카운팅 또는 정렬 방법 중 하나를 선택하는 것이 적절합니다.

개선

var isAnagram = function (s, t) {
    // 전제 : t의 문자들은 반드시 s에도 존재해야한다

    // 1. 길이가 동일한가
    if (s.length !== t.length) return false;

    // 2. 중복을 포함해서 모든 문자가 동일한가
    return s.split('').sort().join('') === t.split('').sort().join('')
};

느낀 점

이렇게 간단하게 끝낼 수가 있구나.... sort는 생각도 못했다

profile
Web Front-end developer

0개의 댓글