JS 알고리즘 문제풀이/섹션 7. 정렬과 그리디, 결정알고리즘

5.Least Recently Used(카카오 캐시 문제 변형)

crab. 2022. 7. 3. 18:48
반응형

📌강의 정리

캐시의 사이즈에 하나씩 최신 값들을 배열의 제일 앞으로 넣되 넣기전에 배열에 그 값이 있으면 그 값을 splice로 자르고 unshift로 넣는다.

또한 배열의 사이즈가 5를 넘으면 하나씩 pop()해준다.

 

📌느낀점

분명 같은 방식인데 좀 다르다.. 원인은 나는 splice를 안쓰고 진짜 반복문을 써서 순수하게 삽입정렬을 구현했기 때문이다.

문제를 구현해낸건 맞긴하지만 복잡도 측면에서 손해를 보기 때문에 간단한 메서드를 응용하는 법을 항상 연습해야 한다.

 

//나의 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(size, arr) {
        let answer = Array.from({ length: size }, () => 0);
        for (let x of arr) {
          if (answer.includes(x)) {
            for (let i = answer.indexOf(x); i > 0; i--) {
              [answer[i - 1], answer[i]] = [answer[i], answer[i - 1]];
            }
            continue;
          } else answer.unshift(x);
          answer.pop();
        }
        return answer;
      }

      //for문을 돌리되 if를 사용해 두가지 경우로 나눈다.
      //x가 answer배열에 없는 경우, 그냥 x를 unshift한다.
      //x가 answer배열에 있는 경우, 삽입정렬로 그 있는 수를
      //제일 앞으로 가져온다.
      //항상 하나의 수를 삽입하거나 가져오고 pop()해서 사이즈를 맞춘다.
      let arr = [1, 2, 3, 2, 6, 2, 3, 5, 7];
      console.log(solution(5, arr));
    </script>
  </body>
</html>
//강사님 코드
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(size, arr) {
        let answer = Array.from({ length: size }, () => 0);
        arr.forEach((x) => {
          let pos = -1;
          for (let i = 0; i < size; i++) if (x === answer[i]) pos = i;
          if (pos === -1) {
            for (let i = size - 1; i >= 1; i--) {
              answer[i] = answer[i - 1];
            }
          } else {
            for (let i = pos; i >= 1; i--) {
              answer[i] = answer[i - 1];
            }
          }
          answer[0] = x;
        });

        return answer;
      }

      let arr = [1, 2, 3, 2, 6, 2, 3, 5, 7];
      console.log(solution(5, arr));
    </script>
  </body>
</html>

<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(size, arr) {
        let answer = [];
        arr.forEach((x) => {
          let pos = -1;
          for (let i = 0; i < size; i++) if (x === answer[i]) pos = i;
          if (pos === -1) {
            answer.unshift(x);
            if (answer.length > size) answer.pop();
          } else {
            answer.splice(pos, 1);
            answer.unshift(x);
          }
        });

        return answer;
      }

      let arr = [1, 2, 3, 2, 6, 2, 3, 5, 7];
      console.log(solution(5, arr));
    </script>
  </body>
</html>
반응형

'JS 알고리즘 문제풀이 > 섹션 7. 정렬과 그리디, 결정알고리즘' 카테고리의 다른 글

7.좌표 정렬  (0) 2022.07.05
6.장난꾸러기 현수  (0) 2022.07.04
4.삽입정렬  (0) 2022.07.02
3.Special Sort(버블정렬응용)  (0) 2022.07.01
2.버블정렬  (0) 2022.06.30