[2164] ์นด๋“œ2 card2

๐Ÿ’ก
ํ, 211008
notion image

๋ฌธ์ œ

N์žฅ์˜ ์นด๋“œ๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นด๋“œ๋Š” ์ฐจ๋ก€๋กœ 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด ์žˆ์œผ๋ฉฐ, 1๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์œ„์—, N๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์•„๋ž˜์ธ ์ƒํƒœ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์นด๋“œ๊ฐ€ ๋†“์—ฌ ์žˆ๋‹ค.
์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ์นด๋“œ๊ฐ€ ํ•œ ์žฅ ๋‚จ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค. ์šฐ์„ , ์ œ์ผ ์œ„์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ๋ฐ”๋‹ฅ์— ๋ฒ„๋ฆฐ๋‹ค. ๊ทธ ๋‹ค์Œ, ์ œ์ผ ์œ„์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ์ œ์ผ ์•„๋ž˜์— ์žˆ๋Š” ์นด๋“œ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด N=4์ธ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. ์นด๋“œ๋Š” ์ œ์ผ ์œ„์—์„œ๋ถ€ํ„ฐ 1234 ์˜ ์ˆœ์„œ๋กœ ๋†“์—ฌ์žˆ๋‹ค. 1์„ ๋ฒ„๋ฆฌ๋ฉด 234๊ฐ€ ๋‚จ๋Š”๋‹ค. ์—ฌ๊ธฐ์„œ 2๋ฅผ ์ œ์ผ ์•„๋ž˜๋กœ ์˜ฎ๊ธฐ๋ฉด 342๊ฐ€ ๋œ๋‹ค. 3์„ ๋ฒ„๋ฆฌ๋ฉด 42๊ฐ€ ๋˜๊ณ , 4๋ฅผ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด 24๊ฐ€ ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ 2๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋‚˜๋ฉด, ๋‚จ๋Š” ์นด๋“œ๋Š” 4๊ฐ€ ๋œ๋‹ค.
N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ œ์ผ ๋งˆ์ง€๋ง‰์— ๋‚จ๊ฒŒ ๋˜๋Š” ์นด๋“œ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ N(1 โ‰ค N โ‰ค 500,000)์ด ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋‚จ๊ฒŒ ๋˜๋Š” ์นด๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1

6

์˜ˆ์ œ ์ถœ๋ ฅ 1

4

My solution


์ฃผ์–ด์ง„ ์„ค๋ช…๋Œ€๋กœ ๋กœ์ง์„ ์งœ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์•„์ฃผ ์‰ฝ๊ฒŒ ์งค ์ˆ˜ ์žˆ๋‹ค.
function solution(i) {
    let nums = i.toString().trim().split("\n");
    let cards = Array.from({ length: nums }).map((_, i) => (i + 1).toString());
    while (cards.length > 1) {
        cards.shift();
        cards.push(cards.shift());
    }
    console.log(cards[0]);

    return cards[0];
}

test("solution", () => {
    expect(solution("6")).toBe("4");
});
๊ทธ๋Ÿฐ๋ฐ ์ œ์ถœํ•˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.
ย 
์•„๋ž˜ ๊ธ€์„ ๋ณด๊ณ  ํžŒํŠธ๋ฅผ ์–ป์—ˆ๋‹ค. ์ผ๋‹จ์€ ์„ฑ๋Šฅ ๊ณ ๋ ค๋ฅผ ์•ˆํ•˜๊ณ  ํ†ต๊ณผํ•˜๋ฉด ๊ทธ๋•Œ๋ถ€ํ„ฐ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋ฉด์„œ ๊ณ ๋ คํ•˜๋Š” ํŽธ์ธ๋ฐ ์•„์˜ˆ ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ํ†ต๊ณผ๋ฅผ ์‹œํ‚ค์ง€ ์•Š์œผ๋‹ˆ ๊ฒ€์ƒ‰ํ•ด๋ณด์•˜๋‹ค.
์ด๋Ÿด ๋•Œ๋Š” ๊ทœ์น™์„ฑ ๋ฐœ๊ฒฌ์œผ๋กœ ์—์ง€ ์ผ€์ด์Šค ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.
1234๊ฐ€ ์žˆ์„ ๋•Œ 1์„ ๋ฒ„๋ฆฌ๊ณ  2๋ฅผ ๋’ค๋กœ ๋ณด๋‚ด๊ณ  3์„ ๋ฒ„๋ฆฌ๊ณ  ๋๋‚œ๋‹ค.
12345๊ฐ€ ์žˆ์œผ๋ฉด 1์„ ๋ฒ„๋ฆฌ๊ณ  2๋ฅผ ๋’ค๋กœ ๋ณด๋‚ด๊ณ  3์„ ๋ฒ„๋ฆฌ๊ณ  4๋ฅผ ๋’ค๋กœ ๋ณด๋‚ธ๋‹ค์Œ 5๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋๋‚œ๋‹ค.
์ฆ‰, ํ™€์ˆ˜๋ฒˆ์งธ(0๋ถ€ํ„ฐ ์‹œ์ž‘์ด์ง€๋งŒ)์— ์žˆ๋Š” ์นด๋“œ๋“ค์€ ๋ฒ„๋ ค์ง€๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์งค ์ˆ˜ ์žˆ๋‹ค.
function solution(i) {
    let nums = i.toString().trim().split("\n");
    let cards = Array.from({ length: nums })
        .map((_, i) => i + 1)
        .filter((_, i) => !((i + 1) % 2));
    console.log(cards);

    while (cards.length > 1) {
        cards.shift();
        cards.push(cards.shift());
    }
    console.log(cards.pop());

    return;
} ...
์—ฌ์ „ํžˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.
ย 
๊ทธ๋Ÿผ ๋ฐฐ์—ด์˜ shift() ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n)์ธ ์ด์œ ๋ฐ–์— ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฐฐ์—ด ๋งจ ์•ž์„ ๋ฝ‘์œผ๋ฉด ๋’ค์˜ ์›์†Œ๋“ค์„ ํ•œ์นธ์”ฉ ๋‹ค ์•ž๋‹น๊ฒจ์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ๋Š” ๋””ํํ•  ๋•Œ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(1)๋กœ ์•Œ๊ณ  ์žˆ๋‹ค. ์„ฑ๋Šฅ์„ ์ฐพ์•„๋ณด๋‹ˆ
JS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„: ํ(Queue) ๊ตฌํ˜„ vs Array ๋ฉ”์„œ๋“œ(shift, splice) ์‚ฌ์šฉํ–ˆ์„๋•Œ ์†๋„ ๋น„๊ต
์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ Queue ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์จ์•ผํ• ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ BFS๋ฅผ ๊ตฌํ˜„ํ• ๋•Œ์ฃ . C++์˜ ๊ฒฝ์šฐ STL์„ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , Python์˜ ๊ฒฝ์šฐ deque๋ฅผ ์จ์„œ ์‚ฝ์ž…, ์‚ญ์ œ ์‹œ O(1)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JavaScript์˜ ๊ฒฝ์šฐ ๊ทธ๋Ÿฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋”ฐ๋กœ ์—†๊ธฐ ๋•Œ๋ฌธ์—, Array.shift() ๋˜๋Š” Array.splice(0,1) ๋“ฑ array ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
JS ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„: ํ(Queue) ๊ตฌํ˜„ vs Array ๋ฉ”์„œ๋“œ(shift, splice) ์‚ฌ์šฉํ–ˆ์„๋•Œ ์†๋„ ๋น„๊ต
๊ฒฐ๋ก ๋งŒ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
notion image
ํ๋กœ ๊ตฌํ˜„ํ•ด์•ผ๋งŒ ํ†ต๊ณผํ•˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. js์—์„œ ํ ๊ตฌํ˜„์„ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•œ ๊ฒŒ ์•„๋‹ˆ์—ˆ์„๊นŒ ์‹ถ๋‹ค.
ย 
๊ทธ๋Ÿฐ๋ฐ ํ๋ฅผ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์™€ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ์ฒ˜์Œ์—๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋จผ์ € ์ฐพ์•„์„œ ๊ทธ๊ฑธ๋กœ ํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค๊ฐ€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฐ์—ด๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค๋Š” ๋ง์„ ๋“ฃ๊ณ  ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์™€ ๋ฐฐ์—ด์ด ์–ด๋–ค ์„ฑ๋Šฅ์ƒ์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ธ์ง€ ์ฐพ์•„๋ดค๋‹ค.
์šด์˜์ฒด์ œ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ ๋ฐฐ์› ๋˜ ๋‚ด์šฉ์ธ๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’๋“ค์€ ์บ์‹ฑํ•ด๋‘๊ณ  ๊ด€๋ จ๋œ ๊ฐ’๊นŒ์ง€ ๊ฐ™์ด ์บ์‹ฑ๋˜์–ด ์žˆ์–ด ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๋งŒ์•ฝ ์บ์‹ฑ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฐ’์„ ์š”๊ตฌํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค์‹œ ์ ‘๊ทผํ•ด์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๋ฏ€๋กœ ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ Cache locality์™€ Cache hit์„ ์•Œ๋ฉด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
ย 
cache hit: 1๊ณผ ๊ฐ™์ด ์ง€์—ญ์„ฑ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์บ์‰ฌ์— ์ €์žฅํ•ด๋†“์€ ๋ฉ”๋ชจ๋ฆฌ์— CPU๊ฐ€ ์ฐธ์กฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด cahce hit, ์บ์‰ฌ ์ ์ค‘์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ฐ˜๋Œ€์˜ ๊ฐœ๋…์€ cache miss.
cache locality: ์šด์˜์ฒด์ œ์—์„  ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ทผ์ ‘ํ•œ ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ์บ์‰ฌ์— ๋„ฃ์–ด๋‘ ์œผ๋กœ์จ CPU์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. ๋ฐฐ์—ด์€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์—ฐ์†๋œ ๊ณต๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ locality๋ฅผ ์ž˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
ย 
๋”ฐ๋ผ์„œ ๋ฐฐ์—ด๋กœ ํ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์˜ ์‚ฌ์ดํŠธ๋“ค์„ ์ฐธ๊ณ ํ–ˆ๋‹ค.
ย 
deque ํ•˜๋Š” ๋ถ€๋ถ„์ด ์ผ๋ฐ˜ ๋ฐฐ์—ด๊ณผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ž˜ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. ๋น„์–ด์žˆ์„ ๋•Œ๋Š” null์„ ๋ฆฌํ„ดํ•˜๊ณ ,
๋น„์–ด์žˆ์ง€ ์•Š์œผ๋ฉด ๋จผ์ € ํ•œ์นธ ์ด๋™์‹œํ‚จ๋‹ค.
๋งˆ์ง€๋ง‰์—๋Š” _element์˜ ๋งจ ์•ž์˜ ๊ฐ’์„ ์ œ์™ธํ•˜๊ณ  ๋‹ค์‹œ ๋งŒ๋“ ๋‹ค. ์ด ๋ฐฐ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด ๋งจ ์•ž์˜ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ธ๋ฑ์Šค์ธ _offset์€ 0์œผ๋กœ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์ด ๋ฐฉ์‹๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋„ˆ๋ฌด ๋Š๋ ค์„œ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
ย 
์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋กœ์ง์„ ์ฐจ๋ก€๋Œ€๋กœ ๋ณด๋ฉด,
deque : ๋งŒ์•ฝ ํ์— 5๊ฐœ๊ฐ€ ๋“ค์–ด์žˆ๊ณ  offset์ด 0์ด๊ณ  1๋งŒํผ ๋”ํ•ด์ ธ์„œ 1์ด ๋˜์—ˆ์„ ๋•Œ if(this.offset * 2 < this._element.length)์—์„œ 2 < 5๊ฐ€ ๋˜๋ฉด ๋งจ ์•ž์˜ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
deque : ๊ณ„์† ํ์— 5๊ฐœ๊ฐ€ ๋“ค์–ด์žˆ๊ณ  offset์ด 1์ด๊ณ  1๋งŒํผ ๋”ํ•ด์ ธ์„œ 2๊ฐ€ ๋˜์—ˆ์„ ๋•Œ if(this.offset * 2 < this._element.length)์—์„œ 4 < 5๊ฐ€ ๋˜๋ฉด ๋งจ ์•ž์˜ ๊ฐ’๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
deque : offset์€ ์ด์ œ 2๊ฐ€ ๋œ ์ƒํƒœ์ด๊ณ  first๋Š” ํ˜„์žฌ offset์ธ 2์˜ ์œ„์น˜์— ์žˆ๋Š”(๊ฐ€์žฅ ์•ž์— ์žˆ๋Š”) ๊ฐ’์ด ๋œ๋‹ค. offset์€ 3์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์ด๋•Œ if(this.offset * 2 < this.element.length) ์—์„œ 3 * 2 < 5 ๋กœ false๊ฐ€ ๋œ๋‹ค.
์ฆ‰, ํ์˜ ์ค‘๊ฐ„๊นŒ์ง€๋Š” ์œ„์˜ ๋ฐฉ์‹์œผ๋กœ ์„ฑ๋Šฅ์ƒ์˜ ์ด๋“์„ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” slice๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด์„ ์ž˜๋ผ์„œ ์žฌ์ •๋น„ํ•œ๋‹ค.
ย 
class Queue {
    constructor(elements) {
        // * : ์ฒ˜์Œ์— ๋ฐฐ์—ด์„ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
        this._elements = Array.isArray(elements) ? elements : [];
        // * : _offsset์€ ํ์˜ ๋งจ ์•ž์˜ ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
        this._offset = 0;
    }

    enqueue(element) {
        this._elements.push(element);
        return this;
    }

    dequeue() {
        if (this.isEmpty()) return null;

        // ๋งจ ์•ž์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  _offset์„ ํ•œ์นธ ์ด๋™
        const first = this.front();
        this._offset += 1;

        // ํ์˜ ์ค‘๊ฐ„๊นŒ์ง€๋Š” offset ๋งŒ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์„ฑ๋Šฅ๊ฐœ์„ , ์–ด์ฐจํ”ผ ๋ฉค๋ฒ„๋ณ€์ˆ˜๋Š” ์ •๋ณด์€๋‹‰์œผ๋กœ ์ ‘๊ทผ๋ถˆ๊ฐ€
        if (this._offset * 2 < this._elements.length) return first;

        // only remove dequeued elements when reaching half size
        // to decrease latency of shifting elements.
        this._elements = this._elements.slice(this._offset);
        this._offset = 0;
        return first;
    }

    front() {
        return this.size() > 0 ? this._elements[this._offset] : null;
    }

    back() {
        return this.size() > 0
            ? this._elements[this._elements.length - 1]
            : null;
    }

    size() {
        return this._elements.length - this._offset;
    }

    isEmpty() {
        return this.size() === 0;
    }

    clear() {
        this._elements = [];
        this._offset = 0;
    }
}
๊ทธ๋Ÿฐ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค.
notion image
ํ ๊ตฌํ˜„ํ•  ๋•Œ ๋จผ์ € ํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์จ์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ๋“ค์—ฌ์•ผ ๋œ๋‹ค. ํ•œ๋ฒˆ์— ๋งž์ถ”๋ฉด ํŽธํ•˜๊ธด ํ•œ๋ฐ ํ‹€๋ฆฐ ๊ธธ๋งŒ ๋‹ค ์ฐพ์•„๋ณธ ๋•๋ถ„์— ๋ชจ๋“  ๊ฑธ ๋‹ค ๊ฒช์œผ๋ฉด์„œ ์„ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
ย 
๋ฐฐ์—ด ์ด์šฉ์œผ๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚œ ํ›„ ํ ๊ตฌํ˜„์„ ๋’ค์ ๊ฑฐ๋ฆฌ๋‹ค๊ฐ€ Single Linked List๋ฅผ Queue๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•ด๋‘์—ˆ๋˜๋ฐ ๊ฒฐ๋ก ์ ์œผ๋กœ Queue๋ณด๋‹ค Single Linked List๋ฅผ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฒŒ ๋” ํ•„์š”ํ•˜๋‹ค.
ย 

์†Œ์Šค์ฝ”๋“œ

class Node {
    constructor(value) {
        this.value = value;
        this.next = null;
        this.prev = null;
    }
}

class LinkedList {
    constructor() {
        this.head = null;
        this.tail = null;
        this._size = 0;
    }

    add(value) {
        const newNode = new Node(value);

        if (!this.head) {
            this.head = newNode;
        } else {
            this.tail.next = newNode;
            newNode.prev = this.tail;
        }

        this.tail = newNode;
        this._size++;

        return newNode;
    }

    getHead() {
        return this.head.value;
    }

    removeHead() {
        this.head = this.head.next;
        this.head.prev = null;
        this._size--;
    }

    getSize() {
        return this._size;
    }
}

function solution(i) {
    let nums = i.toString().trim().split("\n");
    // console.log(cards);
    const cards = new LinkedList();
    for (let i = 1; i <= nums; i++) {
        cards.add(i);
    }
    let q = new LinkedList(cards);
    while (cards.getSize() !== 1) {
        cards.removeHead();
        cards.add(cards.getHead());
        cards.removeHead();
    }

    console.log(cards.getHead());

    return;
}

test("solution", () => {
    expect(solution("6")).toBe("4");
});