Jaeilit

배열 검사 본문

알고리즘

배열 검사

Jaeilit 2022. 8. 23. 00:05
728x90

배열 2개를 비교해서 중복을 검사하는 알고리즘

1.  함수로 배열 2개를 받아서 두번째 배열이 첫번째 배열의 제곱이 되는 수로 이루어져있는지 체크하는 알고리즘
 
[1, 2, 3, 2], [9, 1, 4, 4]
 
function same(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }
  for (let i = 0; i < arr1.length; i++) {
    let correctIndex = arr2.indexOf(arr1[i] ** 2);
    console.log(correctIndex);
    if (correctIndex === -1) {
      return false;
    }
    console.log(arr2);
    arr2.splice(correctIndex, 1);
  }
  return true;
}

same([1, 2, 3, 2], [9, 1, 4, 4]);

// (1)[(9, 1, 4, 4)];
// (1)[(9, 4, 4)];
// (0)[(9, 4)];
// (0)[4];
// true
 
 
배열의 indexOf 메서드로 첫번째 배열에서 제곱인 값을 찾아서 두번째 배열에 splice 해줌으로써 빈 배열로 만듬
최종적으로 빈 배열이 됬다는 것은 모두 일치하는 것이라 true 그리고 for 문 도중에 index를 찾지못하면 false를 반환한다.
 
문자열과 배열의 두가지 연습을 해볼 수 있다. index 라는 요소는 배열에서 중요하다.
인덱스가 중요한 이유는 여러있지만 시간복잡도 개념에서 보면 push 와 pop 과 같이 배열의 끝에서 Index 를 추가하고 제거 하는건 비교적 빠르지만 shift unshift 처럼 배열의 맨 앞에서 하는 작업은 상대적으로 느릴 수 있다. 이유는 index를 0부터 다시 할당해줘야하기 때문 에 이다. 하지만 그렇게 크게 신경 쓰면서까지 shift 와 unsfhit를 피할 정도는 아니다..
 
2. 아나그램
아나그램이 뭔가해서 찾아봤는데, 거꾸로해도 똑바로해도 우영우입니다와 비슷하게 말장난인데
같은 글자로 다른 의미의 단어를 만드는 것을 의미한다고 한다.
기러기 토마토 .. 역삼역? 
 
function validAnagram(str1, str2) {
  if (str1.length !== str2.length) {
    return false;
  }

  let ary = [];

  for (let key of str1) {
    ary.push(key);
  }

  for (let key of str2) {
    let index = ary.indexOf(key);
    if (index !== -1) {
      ary.splice(index, 1);
    }
    console.log(ary);
  }
  return !ary.length;
}

// console.log(validAnagram("", ""), "trim");
// console.log(validAnagram("aazbz", "zzabz")); // false

console.log(performance.now());
console.log(validAnagram("anagram", "nagaram")); // true
console.log(performance.now());

// 33.454707980155945
// [ 'a', 'a', 'g', 'r', 'a', 'm' ]
// [ 'a', 'g', 'r', 'a', 'm' ]
// [ 'a', 'r', 'a', 'm' ]
// [ 'r', 'a', 'm' ]
// [ 'a', 'm' ]
// [ 'm' ]
// []
// true
// 38.32233300805092
 
첫번째 문제와 풀이가 비슷하다고 느낄 수도 있다.
음 비슷하다 함수의 파라미터가 배열에서 문자열로 바꼇다지만
문자는 유사배열이기때문에 str.length 등 배열 메서드를 사용 할 수 있다 map 같은 건 못쓴다.
function validAnagram(str1, str2) {
  if (str1.length !== str2.length) {
    return false;
  }

  const ary = Array.from({ length: str1.length }, (v, i) => str1[i]);

  for (let key of str2) {
    let index = ary.indexOf(key);
    if (index !== -1) {
      ary.splice(index, 1);
    }
    console.log(ary);
  }
  return !ary.length;
}

// console.log(validAnagram("", ""), "trim");
// console.log(validAnagram("aazbz", "zzabz")); // false

console.log(performance.now());
console.log(validAnagram("anagram", "nagaram")); // true
console.log(performance.now());

// 34.627416998147964
// [ 'a', 'a', 'g', 'r', 'a', 'm' ]
// [ 'a', 'g', 'r', 'a', 'm' ]
// [ 'a', 'r', 'a', 'm' ]
// [ 'r', 'a', 'm' ]
// [ 'a', 'm' ]
// [ 'm' ]
// []
// true
// 39.582416981458664

조금 다른 풀이 방법인데 배열을 for 문과 push 로 채우지않고 array.from() 메서드로도 만들 수 있는데 첫번째보다 조금 느린 모습이다.

728x90

'알고리즘' 카테고리의 다른 글

카카오 신고 결과 받기  (0) 2022.08.30
투포인트 JS  (0) 2022.08.27
스택구조  (0) 2022.06.23
별찍기  (0) 2022.06.15
소수 찾기  (0) 2022.06.09