๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/์ธํ”„๋Ÿฐ(inflearn)

[ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ] section07 - 5 - Least Recently Used(์นด์นด์˜ค ์บ์‹œ ๋ฌธ์ œ ๋ณ€ํ˜•)

by YWTechIT 2021. 9. 10.
728x90

๐Ÿ“ section07 - 5 - Least Recently Used(์นด์นด์˜ค ์บ์‹œ ๋ฌธ์ œ ๋ณ€ํ˜•)

๊ฐ„๋žตํ•œ ๋ฌธ์ œ ์„ค๋ช…: LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฒƒ์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋งŒ์•ฝ, Cache Miss์ผ ๋• ๋‹ค์Œ task๊ฐ€ cache์˜ ๋งจ ์•ž์— ์˜ค๊ณ  ๋ชจ๋“  ์ž‘์—…์ด ๋’ค๋กœ ๋ฐ€๋ฆฌ๊ณ , Cache Hit ์ผ ๋• ๋‹ค์Œ task์™€ ๋™์ผํ•œ cache์•ˆ์— ์žˆ๋Š” ๊ฐ’์„ ๋งจ ์•ž์œผ๋กœ ๋‹น๊ฒจ์˜ค๊ณ  ๋‚˜๋จธ์ง€๋Š” ํ•œ ์นธ์”ฉ ๋’ค๋กœ ๋ฏธ๋ฃจ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ cache๊ฐ€ [1, 2, 3, 0, 0]์ด๊ณ  ๋‹ค์Œ task๋Š” 2๋ผ๋ฉด [2, 1, 3, 0, 0, 0]์ด ๋œ๋‹ค.

 

์ด ๋ฌธ์ œ๋Š” ์‚ฝ์ž… ์ •๋ ฌ์˜ ํŠน์ง•์ธ target์„ temp์— ์ €์žฅํ•˜๊ณ  temp๋ณด๋‹ค arr[i]=arr[i-1]์ฒ˜๋Ÿผ ๋ฎ์–ด ์”Œ์šฐ๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ฉด ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ์‹คํ–‰ ์†๋„๋ฅผ ์–ผ๋งˆ๋ƒ ๋นจ๋ฆฌ ํ•˜๋Š๋ƒ์ธ๋ฐ, ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” 3์ค‘ ๋ฐ˜๋ณต๋ฌธ์ด์—ˆ๊ณ , ๊ฐ•์˜ ์ฝ”๋“œ๋Š” 2์ค‘ ๋ฐ˜๋ณต๋ฌธ์ด์—ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ 4๊ฐ€์ง€์ธ๋ฐ, ์ž์‹ ์˜ ์ž…๋ง›๋Œ€๋กœ ํ’€๋ฉด ๋œ๋‹ค.

 

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ hit | miss ์ผ๋•Œ ๋ชจ๋‘ ํ•œ ์นธ์”ฉ ์•ž์œผ๋กœ ๋ฐ€๊ฑฐ๋‚˜ ๋‹น๊ธฐ๋Š” ๋ฐฉ๋ฒ•์ธ๋ฐ ์ฉ ์™€๋‹ฟ์ง€ ์•Š์•„์„œ ์ง์ ‘ ๊ทธ๋ ค๋ดค๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค์— ๋น„ํ•ด ์ฝ”๋“œ๊ฐ€ ์งง์€ ๊ฒƒ์ด ์žฅ์ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋ฒˆ์— ํ’€์—ˆ๋˜ ๋ฐฐ์—ด๋Œ๋ฆฌ๊ธฐ3 ๋ฌธ์ œ์ฒ˜๋Ÿผ ์ง€๊ธˆ๊ณผ ๊ฐ™์ด target์„ temp๋กœ ๋นผ๋‘๊ณ  ๋ฎ์–ด ์”Œ์šฐ๋‹ค๊ฐ€ ์ œ์ผ ๋งˆ์ง€๋ง‰ index์— ํ• ๋‹นํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์ข…์ข… ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค.(์žŠ์ง€ ์•Š์œผ๋ ค๊ณ  ๊ธ€๊นŒ์ง€ ์ ์—ˆ๋Š”๋ฐ.. ์ด์ œ๋Š” ๊นŒ๋จน์ง€ ๋ง๊ณ  ์ œ๋•Œ ์‚ฌ์šฉํ•˜์ž!!)

 

 

  1. hit, miss ๋‘˜ ๋‹ค ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด์„œ ํ•œ ์นธ์”ฉ ๋ฐ€๊ฑฐ๋‚˜ ๋‹น๊ธฐ๊ณ  ๋งˆ์ง€๋ง‰์— cache[0]=x๋ฅผ ๋„ฃ๋Š”๋‹ค.
  2. hit์ผ๋•Œ for๋ฌธ์„ ๊ฑฐ๊พธ๋กœ ๋ฎ์–ด ์”Œ์šฐ๊ณ , miss ์ผ ๋•Œ unshift๋ฅผ ์ด์šฉํ•œ๋‹ค.
  3. hit์ผ๋•Œ while๋ฌธ์„ ๊ฑฐ๊พธ๋กœ ๋ฎ์–ด ์”Œ์šฐ๊ณ , miss ์ผ ๋•Œ unshift๋ฅผ ์ด์šฉํ•œ๋‹ค.
  4. hit์ผ๋•Œ splice(pos,1)์œผ๋กœ ํ•ด๋‹น ์›์†Œ๋งŒ ๋นผ๋‚ด์–ด ๋งจ ์•ž์— unshiftํ•ด์ฃผ๊ณ , miss ์ผ ๋•Œ unshift๋ฅผ ์ด์šฉํ•œ๋‹ค.

 

728x90

 

// ๋ฐฉ๋ฒ•1
let s = 5;
let n = 9;
let order = [1, 2, 3, 2, 6, 2, 3, 5, 7];

console.log(solution(s, n, order));

function solution(s, n, order){
    let cache = Array.from({length: s}, () => 0);

    for (let x of order){
        let pos=-1;
        for(let i=0; i<s; i++) if (cache[i] === x) pos=i;
        if (pos === -1){
            for(let i=s-1; i>=1; i--) cache[i]=cache[i-1]
        }else{
            for(let i=pos; i>=1; i--) cache[i]=cache[i-1]
        }
        cache[0]=x
    }
    return cache.join(" ");
}

 

// ๋ฐฉ๋ฒ•2
let s = 5;
let n = 9;
let order = [1, 2, 3, 2, 6, 2, 3, 5, 7];

console.log(solution(s, n, order));

function solution(s, n, order){
    let cache = Array.from({length: s}, () => 0);
    for (let x of order){
        let pos=-1;
        for (let i=0; i<n; i++){
            if (cache[i]===x) pos=i
        }
        if (pos === -1){
             cache.unshift(x);
             if (cache.length > s) cache.pop();
        }
        else{
            let temp = cache[pos];
            for (let i=pos; i>=0; i--) cache[i] = cache[i-1];
            cache[0] = temp;
        }
    }
    return cache.join(" ");
}

 

// ๋ฐฉ๋ฒ•3
let s = 5;
let n = 9;
let order = [1, 2, 3, 2, 6, 2, 3, 5, 7];

console.log(solution(s, n, order));

function solution(s, n, order){
    let cache = Array.from({length: s}, () => 0);

    for (let x of order){
        let pos=-1;
        for (let i=0; i<n; i++){
            if (cache[i]===x) pos=i
        }

        if (pos === -1){
            cache.unshift(x);
            if (cache.length > s) cache.pop();
        }
        else{
            let temp = cache[pos];
            let left = pos-1;
            while(left>=0) {
                cache[left+1] = cache[left];
                left--;
            }
            cache[0] = temp;
        }
    }
    return cache.join(" ");
}

 

// ๋ฐฉ๋ฒ•4
let s = 5;
let n = 9;
let order = [1, 2, 3, 2, 6, 2, 3, 5, 7];

console.log(solution(s, n, order));

function solution(s, n, order){
    order.forEach((val) => {
        let pos = -1;
        for (let i=0; i<s; i++) if (cache[i] === val) pos = i;
        if (pos === -1) {
            cache.unshift(val);
            if(cache.length>s) cache.pop();
        } else {
            cache.splice(pos, 1);
            cache.unshift(val)
        }
        return cache.join(" ");
    });
}
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€