문제의 핵심 : 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
}
};
좋은 시도였어요! 하지만 이 풀이는 논리적으로 문제 요구사항을 만족하지 못하고, 실제로 오답을 반환합니다. 면접관의 입장에서 아래와 같이 피드백드릴 수 있어요.
두 문자열 s와 t가 **애너그램(anagram)**인지 판단하세요.
즉, 같은 문자를 같은 수만큼 포함해야 합니다.
s = "anagram", t = "nagaram" → ✅ Trues = "rat", t = "car" → ❌ Falsefor (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
}
t[i]가 s에 존재하는지만 확인하고 있음 → 문자 수가 달라도 true로 처리됨return이 for문 안에 있음 → i = 0일 때만 검사하고 바로 종료s = "aab", t = "ab" → 이 코드로는 true 반환됨 (틀림)var isAnagram = function(s, t) {
if (s.length !== t.length) return false;
return s.split('').sort().join('') === t.split('').sort().join('');
};
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);
};
💬 면접관이 하고 싶은 말
좋은 시작이지만, 현재 풀이는 논리적/기술적 결함이 있어서 정확한 해를 보장하지 못합니다.
애너그램은 문자 존재 여부뿐 아니라 문자 수까지 정확히 맞아야 하므로, 문자 카운팅 또는 정렬 방법 중 하나를 선택하는 것이 적절합니다.
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는 생각도 못했다