JS 알고리즘 문제풀이/섹션 5. 효율성(투포인터 알고리즘, 슬라이딩윈도우, 해쉬)

7.아나그램(Hash Map)

crab. 2022. 6. 20. 08:46
반응형

📌강의 정리

이번에도 해쉬(맵)를 써서 알고리즘을 짠다.

처음 맵에는 str1의 값을 키에는 영문자를 밸류에는 그 개수를 누적으로 구해주고

그 다음에는 각각의 str1의 키값을 str2의 문자들로 비교하여 있으면 밸류를 -1해주고 없거나 그 개수가 0이 되었으면 answer를 NO로 바꿔준다.

 

📌느낀점

Map을 쓴 두번째 풀이였다.

솔직히 그냥 정렬 2번써서 비교하면 편하겠다라는 생각을 수도 없이 했지만

그러면 그냥 푸는 의미가 없으니 이 악물고 Map으로 풀었다.

Map이 익숙하지 않아서 시간이 좀 걸렸고 심지어 풀이도 내가 for문 3개로 강사님 풀이보다

for문이 한 개 더 많다.

그 이유는 나는 map을 2개 만들고 그 둘을 다시 비교했지만 강사님은 하나만 만들고

그 안에서 증감하며 비교했기 때문이다.

코드를 간결하게 짜는걸 항상 생각해야 한다.

 

//나의 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(str1, str2) {
        let answer = "YES";
        let myMap1 = new Map();
        let myMap2 = new Map();
        for (let x of str1) {
          if (myMap1.has(x)) myMap1.set(x, myMap1.get(x) + 1);
          else myMap1.set(x, 1);
        }
        console.log(myMap1);
        for (let y of str2) {
          if (myMap2.has(y)) myMap2.set(y, myMap2.get(y) + 1);
          else myMap2.set(y, 1);
        }
        console.log(myMap2);
        for (let [k, v] of myMap1) {
          if (myMap2.get(k) !== v) answer = "NO";
        }
        return answer;
      }
      //반복문을 써서 str1과 str2의 각각의 키(A,B...)와 밸류(누적개수)의 맵을 만든다.
      //반복문으로 둘을 비교해 일치하는지 확인한다.has() 사용
      //객체 길이동안 다 true면 YES 아니면 NO이다.
      let a = "AbaAeCe";
      let b = "baeeACA";
      console.log(solution(a, b));
    </script>
  </body>
</html>
//강사님 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(str1, str2) {
        let answer = "YES";
        let sH = new Map();
        for (let x of str1) {
          if (sH.has(x)) sH.set(x, sH.get(x) + 1);
          else sH.set(x, 1);
        }
        for (let x of str2) {
          if (!sH.has(x) || sH.get(x) == 0) return "NO";
          sH.set(x, sH.get(x) - 1);
        }
        return answer;
      }

      let a = "AbaAeCe";
      let b = "baeeACA";
      console.log(solution(a, b));
    </script>
  </body>
</html>
반응형