2023. 11. 6. 10:17ใ์ธํ๋ฐ/์๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์ ๋ฌธ : ์ฝ๋ฉํ ์คํธ ๋๋น
https://hyejin.tistory.com/1242
-> ์ด์ ๋ฌธ์ ํ์ด
4. Least Recently Used
์ค๋ช
์บ์๋ฉ๋ชจ๋ฆฌ๋ CPU์ ์ฃผ๊ธฐ์ต์ฅ์น(DRAM) ์ฌ์ด์ ๊ณ ์์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ก์ CPU๊ฐ ์ฒ๋ฆฌํ ์์ ์ ์ ์ฅํด ๋์๋ค๊ฐ
ํ์ํ ๋ฐ๋ก ์ฌ์ฉํด์ ์ฒ๋ฆฌ์๋๋ฅผ ๋์ด๋ ์ฅ์น์ด๋ค. ์๋ ๋น์ธ๊ณ ์ฉ๋์ด ์์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ค.
์ฒ ์์ ์ปดํจํฐ๋ ์บ์๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ๊ท์น์ด LRU ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ฅธ๋ค.
LRU ์๊ณ ๋ฆฌ์ฆ์ Least Recently Used ์ ์ฝ์๋ก ์ง์ญํ์๋ฉด ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉ๋์ง ์์ ๊ฒ ์ ๋์ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์บ์์์ ์์ ์ ์ ๊ฑฐํ ๋ ๊ฐ์ฅ ์ค๋ซ๋์ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ์ ๊ฑฐํ๊ฒ ๋ค๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
์บ์์ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ง๊ณ , ์บ์๊ฐ ๋น์ด์๋ ์ํ์์ N๊ฐ์ ์์ ์ CPU๊ฐ ์ฐจ๋ก๋ก ์ฒ๋ฆฌํ๋ค๋ฉด N๊ฐ์ ์์ ์ ์ฒ๋ฆฌํ ํ
์บ์๋ฉ๋ชจ๋ฆฌ์ ์ํ๋ฅผ ๊ฐ์ฅ ์ต๊ทผ ์ฌ์ฉ๋ ์์ ๋ถํฐ ์ฐจ๋ก๋๋ก ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ์บ์์ ํฌ๊ธฐ์ธ S(3<=S<=10)์ ์์ ์ ๊ฐ์ N(5<=N<=1,000)์ด ์ ๋ ฅ๋๋ค.
๋ ๋ฒ์งธ ์ค์ N๊ฐ์ ์์ ๋ฒํธ๊ฐ ์ฒ๋ฆฌ์์ผ๋ก ์ฃผ์ด์ง๋ค. ์์ ๋ฒํธ๋ 1 ~100 ์ด๋ค.
์ถ๋ ฅ
๋ง์ง๋ง ์์ ํ ์บ์๋ฉ๋ชจ๋ฆฌ์ ์ํ๋ฅผ ๊ฐ์ฅ ์ต๊ทผ ์ฌ์ฉ๋ ์์ ๋ถํฐ ์ฐจ๋ก๋ก ์ถ๋ ฅํฉ๋๋ค.
์์ ์ ๋ ฅ 1
5 9
1 2 3 2 6 2 3 5 7
์์ ์ถ๋ ฅ 1
7 5 3 2 6
ํํธ
๋ฌธ์ ํ์ด 1
public ArrayList<Integer> solution(int s, int n, int[] arr)
{
ArrayList<Integer> answer = new ArrayList<>();
for (int i = 0; i < s-1; i++)
{
answer.add(0);
}
for (int i : arr)
{
if (answer.size() < s) {
if (!answer.contains(i)) {
answer.add(0,i);
}else
{
answer.remove(Integer.valueOf(i));
answer.add(0, i);
}
}else
{
if (answer.contains(i)) {
answer.remove(Integer.valueOf(i));
answer.add(0, i);
}else
{
answer.remove(s-1);
answer.add(0, i);
}
}
}
return answer;
}
๐ฉ๐ป : ๋๋ ์ด ๋ฌธ์ ๋ฅผ ํ ๋ Arraylist๋ฅผ ์ด์ฉํด์ ํ์๋๋ฐ... ใ ๊ฐ์ฌ๋์ด ๊ทธ๋ ๊ฒ ํ์ง ๋ง๋ผ๊ณ ํ์ จ๋ค ํํณ
์ด์ ์ ์ฝ์ ์ ๋ ฌ์ ๋ํด์ ๋ฐฐ์ ์ผ๋ ์ฝ์ ์ ๋ ฌ์ ์ด์ฉํ๋ผ๊ณ ..!
์ฐ์ ์ด๊ฒ๋ ์ ๋ต์ ์ ๋ต์ด์์ผ๋.. ๋์ ํ์ด์ ๋ํด์ ์ค๋ช ํด๋ณด๋ ค๊ณ ํ๋ค.
ArrayList<Integer> answer = new ArrayList<>();
for (int i = 0; i < s-1; i++)
{
answer.add(0);
}
-> Arraylist๋ฅผ ์์ฑํ๊ณ , ์ฃผ์ด์ง ํฌ๊ธฐ s -1 ์ ๊น์ง ๋ฐ๋ณต๋ฌธ ๋๋ฉด์ answer์ 0 ๊ฐ์ ๋ฃ์ด์คฌ๋ค.
if (answer.size() < s) {
if (!answer.contains(i)) {
answer.add(0,i);
}else
{
answer.remove(Integer.valueOf(i));
answer.add(0, i);
}
}
-> ๊ทธ ๋ค์ ์ฃผ์ด์ง ๋ฐฐ์ด arr์ ๋ฐ๋ณต๋ฌธ ๋๋๋ฐ, ์ด๋ answer์ sizer๊ฐ ์ฃผ์ด์ง ํฌ๊ธฐ s๋ณด๋ค ์์ผ๋ฉด์ i๊ฐ ํฌํจ๋์ง ์๋๋ค๋ฉด answer์ addํ ๋ ์ธ๋ฑ์ค ์์น๋ฅผ 0์ผ๋ก ์ง์ ํด์ i ๊ฐ์ ๋ฃ์ด์คฌ๋ค. ๊ทธ๋ฆฌ๊ณ i๊ฐ ํฌํจ๋๋ค๋ฉด answer ๋ฆฌ์คํธ์์ ํด๋น ๊ฐ์ remove ํด์คฌ๊ณ , ๊ทธ ๋ค์ ๋ค์ answer ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค ์์น๋ 0์ผ๋ก ์ง์ ํด์ i ๊ฐ์ addํ๋ค.
else
{
if (answer.contains(i)) {
answer.remove(Integer.valueOf(i));
answer.add(0, i);
}else
{
answer.remove(s-1);
answer.add(0, i);
}
}
-> ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ answer์ ํฌ๊ธฐ๊ฐ s๋ณด๋ค ํด ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฝ ์ฐผ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก i ๊ฐ answer ๋ฆฌ์คํธ์ ์ด๋ฏธ ์๋ ๊ฐ์ด๋ผ๋ฉด ์์์ ํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ answer์ ๊ทธ ๊ฐ์ ์ ๊ฑฐํ๊ณ ๋ค์ ์ธ๋ฑ์ค์ ์์น๊ฐ 0 ์ i ๊ฐ์ add ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ answer์ ํฌํจ๋์ง ์์ ๊ฐ์ด๋ผ๋ฉด answer์ s-1 ์ธ๋ฑ์ค์ ๊ฐ์ remove ํด์ฃผ๊ณ , ๊ทธ ๋ค์ ์ธ๋ฑ์ค ์์น 0์ i ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
ํ๊ธด.. ์ด ๋ฌธ์ ํ๋ฉด์๋ ์ด๊ฑธ ์ ์ด ์น์ 6์๋ค ๋ฃ์์ง..? ํ๋ฉด์ ํ์๋๋ฐ ..ใ ใ ์ญ์๋ Arraylist๋ก ํ๋๋ก ๋ธ ๋ฌธ์ ๊ฐ ์๋์๋คใ
๋ฌธ์ ํ์ด 2
public int[] solution2(int size, int n, int[] arr)
{
int[] cache = new int[size];
for (int x : arr)
{
int pos = -1; // ์ธ๋ฑ์ค ๋ฒํธ (์์น)
for (int i = 0; i< size; i++)
{
if (x == cache[i]) { // hit !
pos = i;
}
}
if (pos == -1) { // miss ์ํฉ
for (int i = size-1; i >= 1; i--)
{
cache[i] = cache[i - 1];
}
}else // hit ์ฒ๋ฆฌ
{
for (int i = pos; i >= 1; i--)
{
cache[i] = cache[i - 1];
}
}
cache[0] = x;
}
return cache;
}
๐พ : ๊ฐ์ฌ๋์ ์ด ๋ฌธ์ ๋ฅผ Arraylist๊ฐ ์๋๋ผ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ ํ๋ผ๊ณ ํ์ จ๊ธฐ ๋๋ฌธ์ cache๋ผ๋ ํฌ๊ธฐ๊ฐ ์ฃผ์ด์ง size ์ธ int ๋ฐฐ์ด์ ๋ง๋ค์๋ค.
๊ทธ ๋ค์ ์ฃผ์ด์ง ๋ฐฐ์ด arr๋ฅผ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋๋๋ฐ ์ด๋ pos ๋ผ๋ ๋ณ์ ํ๋๋ฅผ ๋ง๋ค๊ณ ์ด ๋ณ์๋ hit ๋ ์ธ๋ฑ์ค์ ์์น๋ฅผ ์ ์ฅํ ๋ณ์์ด๋ค. ๋จผ์ cache ๋ฐฐ์ด์ x ๊ฐ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ์ for๋ฌธ์ ๋๋ฉด์ x == cache[i] ์ด๋ฉด ๋ฉ๋ชจ๋ฆฌ์ x ๊ฐ์ด ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก pos์ i ๊ฐ์ ์ ์ฅํ๋ค.
๋ฐ๋ณต๋ฌธ์ ๋ค ๋๊ณ ๋์ ๋ง์ฝ pos๊ฐ -1์ด๋ผ๋ ๊ฑด hit๋ ๊ฐ์ด ์๋ค๋ ๊ฒ์ด๋ฏ๋ก ๋ฐฐ์ด์ ๋ฃ์ด์ผ ํ๋๋ฐ
์ด๋ ๋ฃ์ ๋๋ ์์ผ๋ก(์ค๋ฅธ์ชฝ์ผ๋ก) ๊ฐ์ ๋ฐ๋ฉด์ ๋์๊ฐ์ผ ํ๊ธฐ ๋๋ฌธ์
if (pos == -1) { // miss ์ํฉ
for (int i = size-1; i >= 1; i--)
{
cache[i] = cache[i - 1];
}
}
for๋ฌธ์ ๋ ๋ i๊ฐ size-1 ๋ถํฐ 1๊น์ง๋ง ๋๋ฉด์ cache[i]์ ๊ฐ์ cache[i-1] ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
else // hit ์ฒ๋ฆฌ
{
for (int i = pos; i >= 1; i--)
{
cache[i] = cache[i - 1];
}
}
๋๋ pos๊ฐ -1์ด ์๋๋ผ๋ ๊ฑด hit๋๋ค๋ ๊ฒ์ด๋ฏ๋ก for๋ฌธ ๋ฐ๋ณต๋ฌธ์ hit๋ ์์น pos ๋ถํฐ 1๊น์ง๋ง ๋๋ฉด์ ๊ฐ์ ๋ฐ์ด์ค๋ค.
cache[0] = x;
๋ฐ๋ณต์ ๋ง์น๊ณ ๋ cache[0]์ x ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. (์ต์ ๊ฐ)