validAnagram 문제풀이

내 풀이

function validAnagram(str, str2) {
	// 접근
	// 1. 두 스트링을 모두 아스키 코드로 바꿔서 두 배열에 각각 담는다.
	// 2. 두 배열을 sort시킨다.
	// 3. 두 배열을 비교한다.
	var map = Array.prototype.map;
	var a = map.call(str, function(x) {
		return x.charCodeAt(0);
	});

	var b = map.call(str2, function(x){
		return x.charCodeAt(0);
	})

	a.sort();
	b.sort();


	return JSON.stringify(a)===JSON.stringify(b);
}

console.log(validAnagram('','')); // true
console.log(validAnagram('aaz','zza')); // false
console.log(validAnagram('anagram','nagaram')); // true
console.log(validAnagram('rat','car')); // false
console.log(validAnagram('awesome','awesom')); // false
console.log(validAnagram('qwerty','qeywrt')); // true
console.log(validAnagram('texttwisttime','timetwisttext')); // true

일단 간단하게 풀어봤다.
String에 map을 사용해서 각 문자의 ASCII 인코딩 값을 요소로 갖는 배열을 얻는 방법을 사용했다

	var map = Array.prototype.map;
	var a = map.call(str, function(x) {
		return x.charCodeAt(0);
	});

Array.prototype.map.call 을 사용하면, Array, NodeList, Str에 map 을 사용할 수 있다.

이후에는 sort를 사용하여 정렬을 한뒤, JSON.stringify(a)===JSON.stringify(b)을 사용하여 배열의 값을 비교했다.

배열 값 비교 js에서 어떤거 써야됨?

결과:

O(N)으로 풀이에 성공하긴 했지만, Best Practice 인지는 조금 더 생각해봐야겠다.

다른 풀이


function validAnagram_(first, second) {
    if (first.length !== second.length) {
        return false;
    }

    const letter = {};
    for (let i = 0; i < first.length; i++) {
        if (!letter[first[i]]) {
            letter[first[i]] = 1;
        } else {
            letter[first[i]] += 1;
        }
    }

    for (let i = 0; i < second.length; i++) {
        if (!letter[second[i]]) {
            return false;
        } else {
					letter[second[i]] -= 1;
        }
    }
		return true;
}
  • letter 객체에 해당 스트링을 key, 갯수를 value로 입력한다.
  • 두 번째 스트링을 for문을 돌면서 letter객체에서 해당 스트링의 개수를 하나씩 빼주면서 0이되거나 존재하지 않는 스트링일 때 false를 리턴한다.
  • 중첩 루프가 아닌 두개의 for문으로 간단하게 해결했다.
  • 나는 내 풀이가 더 좋다.

좋은 웹페이지 즐겨찾기