์ฒดํฌํฌ์ธํŠธ

  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•™์Šต(ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„, ๋ถˆ๋ณ€์„ฑ, ์ฐธ์กฐํˆฌ์˜์„ฑ, ์ˆœ์ˆ˜ํ•จ์ˆ˜) - 2์‹œ 30๋ถ„๊นŒ์ง€ โœ… 2024-07-25
  • MovieRank ์„ค๊ณ„ โœ… 2024-07-25
  • addํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ โœ… 2024-07-25
  • updateTicket ํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ โœ… 2024-07-25
  • updateTheaters ํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ โœ… 2024-07-25
  • delete ํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ โœ… 2024-07-25
  • sortBydateํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ โœ… 2024-07-25
  • top10Tickets ํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ โœ… 2024-07-25
  • findByDirector ํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ โœ… 2024-07-25
  • findByActor ํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ โœ… 2024-07-25
  • totalTheaters ํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ โœ… 2024-07-25
  • MovieRank ๊ตฌํ˜„ โœ… 2024-07-25
  • ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ โœ… 2024-07-25

Movie ํด๋ž˜์Šค + MovieRank ์„ค๊ณ„

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ์ˆœ์ˆ˜ํ•จ์ˆ˜ : ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์—†๊ณ , ๊ฐ™์€ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜(์ฐธ์กฐํˆฌ๋ช…์„ฑ)
  • ๋ถˆ๋ณ€์„ฑ : ์–ด๋–ค ๊ฐ’์˜ ์ƒํƒœ๋ฅผ(๋ฉ”๋ชจ๋ฆฌ์— ์ด๋ฏธ ๋‹ด๊ธด ์ƒํƒœ๋ฅผ) ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์ด๋Ÿฌํ•œ ํ•ต์‹ฌ์„ ์œ„๋ฐฐํ•˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ๋ฌธ์ œ๊ฐ€ ๋๋˜ ์ ์€ ๋ถ€์ˆ˜ํšจ๊ณผ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด add(movie)๋ฅผ ํ•œ๋‹ค๊ณ  ์น˜์ž. ๊ทธ๋ ‡๋‹ค๋ฉด add(movie)๋กœ ์ƒˆ๋กœ์šด movie ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค ์น˜๋”๋ผ๋„ ์ด๋Ÿฌํ•œ movie๋“ค์„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ๋งŽ์•˜๋‹ค. ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ํ•œ๊ฐ€์ง€ ๋ฐฉํ–ฅ์ด๋‹ค ํ•˜๋”๋ผ๋„ Next ๋…ธ๋“œ์— ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ์˜ ๋…ธ๋“œ๊ฐ€ ์–ด๋””๊นŒ์ง€ ์žˆ๋Š”์ง€ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๊ณผ์ •์—์„œ ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ๋ฉ€๋ฆฌํ•˜๊ณ  ์ˆœ์ˆ˜ํ•จ์ˆ˜ ํ•ฉ์„ฑ์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•˜๊ณ  add์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ฝ”๋“œ๋ฅผ ์•ก์…˜๊ณผ ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ƒ๊ฐํ•˜๊ณ , ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ํ•ฉ์น˜๋Š” ํ˜•ํƒœ๋กœ ๋งŒ๋“  ๋‹ค์Œ ์ด๋ฅผ ์กฐํ•ฉํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ๊ฐ€์•ผํ•œ๋‹ค. ๋˜ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์–ธ์–ด์—์„œ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์นดํ”ผ์˜จ๋ผ์ดํŠธ์™€ ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ฅผ ํ™œ์šฉํ•ด๋ณด์ž.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ๋ฐฉ๋ฒ•์€ ํ•จ์ˆ˜ ์•ˆ์—์„œ ํ•จ์ˆ˜๋“ค์„ ํด๋กœ์ €๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ’์„ ๋‘๊ณ , ๊ทธ ๊ฐ’์„ ๊ณ„์†ํ•ด์„œ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ณผ์ •์—์„œ ์นดํ”ผ์˜จ๋ผ์ดํŠธ๋ฅผ ํ†ตํ•ด ๋‚ด๋ถ€ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์„œ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฐ’์ด ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ํ•˜์—ฌ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ์—†์•ด๋‹ค. ๋˜ํ•œ ๊ฐ ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜์˜ ํŠน์„ฑ์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๊ฐ™์€ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค๋ฉด ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์„ ์ตœ๋Œ€ํ•œ ๊ณ ๋ คํ•ด์„œ ํ•จ์ˆ˜๋“ค์„ ์ž‘์„ฑํ–ˆ๋‹ค.

export function movieRank(
  info = { root: null, movieList: [], totalTheaters: 0 }
) {
  var movies = {
    root: info.root,
    movieList: info.movieList,
  };
...

์—ฌ๊ธฐ์—์„œ ํด๋กœ์ €๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ’๋“ค์€ movies ๋ณ€์ˆ˜์ด๋‹ค. ํ•จ์ˆ˜ ์•ˆ์˜ ๊ฐ’๋“ค์€ ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜์—ฌ ๋ณ€ํ™˜์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ง„๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค. ํ•ด๋‹น ๋ณ€์ˆ˜์˜ root์—๋Š” ๊ฐ Movie ๋…ธ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ํด๋ž˜์Šค์˜ next property๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

export class Movie {
  constructor(
    title,
    year,
    director,
    actorA,
    actorB,
    tickets,
    theaters,
    next = null
  ) {
    this.title = title;
    this.year = year;
    this.director = director;
    this.actorA = actorA;
    this.actorB = actorB;
    this.tickets = tickets;
    this.theaters = theaters;
    this.next = next;
  }
}
 

ํ•ด๋‹น Movie ํด๋ž˜์Šค์˜ ๊ฐ’์„ ์กฐ์ž‘ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ๋”ฐ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค. ์–ด์ฐจํ”ผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์— ํ•ด๋‹น ํด๋ž˜์Šค ์ž์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ œํ•œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž๋งŒ ๊ตฌํ˜„ํ•ด๋ƒˆ๋‹ค.

addํ•จ์ˆ˜

function add(movie) {
    let newRank = {
      ...movies,
    };
    if (newRank.movieList.includes(movie.title)) return movieRank(newRank);
    if (!newRank.root) {
      newRank.root = newMovie(movie);
      newRank.movieList.push(movie.title);
      return movieRank(newRank);
    }
    let nextMovie = newRank.root;
    while (nextMovie.next !== null) {
      nextMovie = nextMovie.next;
    }
    newRank.movieList.push(movie.title);
    nextMovie.next = newMovie({ ...movie, prev: nextMovie });
    return movieRank(newRank);
  }

addํ•จ์ˆ˜์—์„œ๋Š” ์นดํ”ผ์˜จ๋ผ์ดํŠธ ๋ฐฉ์‹์œผ๋กœ ๋งจ ์ฒ˜์Œ ๊ฐ์ฒด๋“ค์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋…ธ๋“œ๋“ค์„ ๋”ฐ๋ผ๊ฐ€ next๊ฐ’์ด null, ์ฆ‰ ๋ ์œ„์น˜๊นŒ์ง€ ์ด๋™ํ•œ ๋’ค์— ํ•ด๋‹น ๋นˆ ๊ณต๊ฐ„์— ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ , ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ๋ฆฌํ„ด์‹œ์ผœ ์ฃผ์–ด ๋‘ ๊ฐ’์ด ๋‹ค๋ฅด๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค. ์ƒ์‹์ ์œผ๋กœ ๊ฐ™์€ ์˜ํ™”๋Š” ์ค‘๋ณต๋˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ์— ์ œ๋ชฉ์ด ๊ฐ™์€ ์˜ํ™”๊ฐ€ add๋  ๊ฒฝ์šฐ์— ๋”ฐ๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ์ง€ ์•Š๊ธฐ๋กœ ํ–ˆ๋‹ค.

updateTickets, updateTheaters ํ•จ์ˆ˜

 
  function updateTickets(title, tickets) {
    let newRank = {
      ...movies,
    };
    let movie = newRank.root;
    let prev = null;
    while (movie !== null) {
      if (movie.title === title) {
        console.log("์ฐจ์คŒ");
        movie = newMovie({
          ...movie.info,
          tickets: tickets,
        });
        if (!prev) {
          newRank.root = movie;
          return movieRank(newRank);
        }
        prev.next = movie;
        return movieRank(newRank);
      }
      prev = movie;
      movie = movie.next;
    }
    throw new Error("์˜ํ™” ์ œ๋ชฉ๊ณผ ์ผ์น˜ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
  }
  function updateTheaters(title, theaters) {
    let newRank = {
      ...movies,
    };
    let movie = newRank.root;
    let prev = null;
    while (movie !== null) {
      if (movie.title === title) {
        movie = newMovie({
          ...movie.info,
          theaters: theaters,
        });
        if (!prev) {
          newRank.root = movie;
          return movieRank(newRank);
        }
        prev.next = movie;
        return movieRank(newRank);
      }
      prev = movie;
      movie = movie.next;
    }
 
    throw new Error("์˜ํ™” ์ œ๋ชฉ๊ณผ ์ผ์น˜ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
  }

์ด ๋‘ ํ•จ์ˆ˜๋Š” ์ž‘๋™ ๋ฐฉ์‹์€ ๊ฐ™๋‹ค. ๋ณ€๊ฒฝํ•˜๋Š” ๊ฐ’๋งŒ ๋‹ค๋ฅด๋‹ค. ๋‚˜๋Š” updateํ•จ์ˆ˜์—์„œ ๋ฌด์—‡์„ ๋ณด๊ณ  ํ•ด๋‹น ํ•˜๋Š” ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์„ ๋ฐ”๊ฟ€ ๊ฒƒ์ด๋ƒ? ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์•„๋ฌด๋ž˜๋„ uniqueํ•œ ์˜ํ™” ์ œ๋ชฉ๊ฐ’์„ ๋ณด๊ณ  ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์„ ๊ฒƒ ๊ฐ™์•„์„œ title๊ณผ ๋ณ€๊ฒฝํ•  theaters๋ฅผ ๋ฐ›์•˜๋‹ค.

์ธ์ˆ˜๋กœ ๋ฐ›์€ title์„ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฑด๋„ˆ๊ฐ€๋ฉด์„œ ํ•ด๋‹นํ•˜๋Š” title๊ณผ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ์ฐพ๊ณ , ๋งŒ์•ฝ์— ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ๊ฐ’์„ ๋ณต์‚ฌํ•œ ํ›„์— ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ด์ „๋…ธ๋“œ์˜ ๋‹ค์Œ๋…ธ๋“œ์— ์—ฐ๊ฒฐ์‹œ์ผœ ์ฃผ์—ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ด์ „ ๋…ธ๋“œ๋Š” ์ „๊ณผ๋Š” ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ›์€ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„ ์™ธ๋ถ€์˜ ๊ฐ’์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Deleteํ•จ์ˆ˜

  function deleteMovie(title) {
    let newRank = {
      ...movies,
    };
    let movie = newRank.root;
    let prevMovie = null;
    while (movie !== null) {
      if (movie.title === title) {
        if (prevMovie) prevMovie.next = movie.next;
        newRank.movieList.splice(
          newRank.movieList.findIndex((mov) => mov === title),
          1
        );
        return movieRank(newRank);
      }
      prevMovie = movie;
      movie = movie.next;
    }
    throw new Error("์˜ํ™” ์ œ๋ชฉ๊ณผ ์ผ์น˜ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
  }

deleteํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค๊ณผ ๊ฐ™์ด ๋…ธ๋“œ๋ฅผ ์ฐพ๊ณ , ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „ ๋…ธ๋“œ๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. ์‚ญ์ œํ•  ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณด์ด๋ฉด ์ด์ „๋…ธ๋“œ๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋ฉด ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฐ’์ด ์—†์–ด ์‚ฌ๋ผ์ง„๋‹ค.

SortByDate, get10Tickets, findBy ํ•จ์ˆ˜

 
function sortByDate() {
    if (!movies.root) throw new Error("์˜ํ™” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
    let dateSorted = getMoviesArray();
    dateSorted.sort((a, b) => a.year - b.year);
    return dateSorted;
  }
 
  function get10Tickets() {
    if (!movies.root) throw new Error("์˜ํ™” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
    let topSelledMovies = getMoviesArray();
    topSelledMovies.sort((a, b) => b.tickets - a.tickets);
    return topSelledMovies.slice(0, 10).map((movie) => movie.title);
  }
 
  function findByDirector(director) {
    if (!movies.root) throw new Error("์˜ํ™” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
    let directors = getMoviesArray();
    return directors
      .filter((movie) => movie.director === director)
      .map((movie) => movie.title);
  }
 
  function findByActor(actor) {
    if (!movies.root) throw new Error("์˜ํ™” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.");
    let actors = getMoviesArray();
    return actors
      .filter((movie) => movie.actorA === actor || movie.actorB === actor)
      .map((movie) => movie.title);
  }
  
  function getMoviesArray() {
    let arr = [];
    let movie = movies.root;
    while (movie !== null) {
      arr.push(movie);
      movie = movie.next;
    }
    return arr;
  }

SortByDate, get10Tickets, findByํ•จ์ˆ˜๋Š” ๋ฆฌํ„ด๊ฐ’์ด ๋ฐฐ์—ด์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋Œ์•„๊ฐ€๋ฉด์„œ ๋ฐฐ์—ด์— ๋„ฃ์–ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ํ•จ์ˆ˜๋กœ ๋นผ๋’€๋‹ค.

getMoviesArrayํ•จ์ˆ˜๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ž‘๋™ํ•˜๋ฉฐ, ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.

์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋ชจ๋“  ์˜ํ™” ์ธ์Šคํ„ด์Šค๋“ค์ด ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ , ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด๋‹น๋˜๋Š” ์ธ์Šคํ„ด์Šค๋“ค๋งŒ ๊ณจ๋ผ๋‚ด์–ด ๋ฆฌํ„ด์‹œ์ผœ ์ฃผ์—ˆ๋‹ค.

map, filter, displayํ•จ์ˆ˜

 
 
  function callbackMap(result, node, idx, callback) {
    if (!node) return;
    result[idx] = callback(node);
    if (node.next) callbackMap(result, node.next, idx + 1, callback);
  }
 
  function map(callback) {
    if (!movies.root) throw new Error("ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ์˜ํ™”๋“ค์ด ์—†์Šต๋‹ˆ๋‹ค.");
    let result = {};
    callbackMap(result, movies.root, 0, callback);
    return result;
  }
 
  function callbackFilter(result, node, idx, callback) {
    if (!node) return;
    if (callback(node)) {
      result[idx] = node;
      idx++;
    }
    if (node.next) callbackFilter(result, node.next, idx, callback);
  }
 
  function filter(callback) {
    if (!movies.root) throw new Error("ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ์˜ํ™”๋“ค์ด ์—†์Šต๋‹ˆ๋‹ค.");
    let result = {};
    callbackFilter(result, movies.root, 0, callback);
    return result;
  }
 
  function callbackDisplay(node, callback) {
    if (!node) return;
    callback(node);
    if (node.next) callbackDisplay(node.next, callback);
  }
  function display(callback) {
    if (!movies.root) throw new Error("ํ˜„์žฌ ์กด์žฌํ•˜๋Š” ์˜ํ™”๋“ค์ด ์—†์Šต๋‹ˆ๋‹ค.");
    callbackDisplay(movies.root, callback);
  }

์ด ์„ธ ํ•จ์ˆ˜๋“ค์€ ๋ฆฌํ„ด๊ฐ’์ด ๋ฐฐ์—ด์ด๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด์„œ ํ•ด๋‹น๋˜๋Š” ์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•˜์—ฌ ์•Œ๋งž์€ ๊ฐ’์„ ์ธ๋ฑ์Šค: ๊ฐ’์˜ ํ˜•ํƒœ๋กœ ๋œ object๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ์„ค๊ณ„ํ•˜์˜€๋‹ค. ๋”ฐ๋กœ callback์„ ์จ์„œ ์žฌ๊ท€์‹œํ‚ค๋Š” ๋ถ€๋ถ„์„ ๋ชจ๋‘ ํ•จ์ˆ˜๋กœ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ–ˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ callback~ ํ•จ์ˆ˜๋“ค์„ ํ†ตํ•ด ์žฌ๊ท€์ ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ›์€ ๋ฆฌํ„ด๊ฐ’์„ ์ตœ์ƒ์œ„์—์„œ ๋ฐ›์•„ ๋ฆฌํ„ด์‹œํ‚จ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

async function mainLoop() {
  let movieData = movieRank();
  let running = true;
 
  while (running) {
    const line = await askQuestion(
      "์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q\n"
    );
    switch (line) {
      case "a":
        movieData = await handleAdd(movieData);
        console.log(movieData.getInfo());
        break;
      case "b":
        movieData = await handleUpdateTickets(movieData);
        console.log(movieData.getInfo());
        break;
      case "c":
        movieData = await handleUpdateTheaters(movieData);
        console.log(movieData.getInfo());
        break;
      case "d":
        handleSortByDate(movieData);
        break;
      case "e":
        handleTopTickets(movieData);
        break;
      case "f":
        await handleFindByDirector(movieData);
        break;
      case "g":
        await handleFindByActor(movieData);
        break;
      case "h":
        handleTotalTheaters(movieData);
        break;
      case "i":
        movieData = await handleDelete(movieData);
        console.log(movieData.getInfo());
        break;
      case "q":
        running = false;
        rl.close();
        break;
      default:
        console.log("์ž˜๋ชป๋œ ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.");
        break;
    }
  }
}
 
mainLoop();

ํ”„๋กœ๊ทธ๋žจ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฝ์šฐ ๊ณ„์†ํ•ด์„œ ๋ช…๋ น์–ด๋ฅผ ๋ฐ›๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค. ๋‹ค์‹œ๊ธˆ question์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ฐ’์„ ๋ฐ›๋Š” ๋ถ€๋ถ„์ด ํ•„์š”ํ•œ ํ•จ์ˆ˜๋“ค์€ ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก await ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ ์ˆœ์„œ๋ฅผ ์ •๋ ฌ์‹œ์ผฐ๋‹ค.

๊ฐ ๋ช…๋ น์— ๋Œ€ํ•ด ๋”ฐ๋กœ ํ•ด๋‹น ํŒŒ์ผ์—์„œ ๋งŒ๋“  ํ•จ์ˆ˜๋ฅผ ์“ฐ๋Š”๋ฐ, ๋ฐ›๋Š” ์ธ์ˆ˜์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ , add์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ๋‚˜์ค‘์— ๋ฆฌํ„ด๋ฐ›์„ ๋•Œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์ ธ์„œ ๋ฐ›๋Š”๋‹ค.

์‹คํ–‰๊ฒฐ๊ณผ

์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
a
์˜ํ™” ์ œ๋ชฉ(๊ณต๋ฐฑ ๋ฏธํฌํ•จ), ์ตœ์ดˆ ์ƒ์˜์—ฐ๋„, ๊ฐ๋…, ์ฃผ์—ฐ๋ฐฐ์šฐ 2๋ช…, ๊ด€๋žŒ์ธ์›, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜๋ฅผ ๊ณต๋ฐฑ ํฌํ•จ ์ž…๋ ฅํ•˜์„ธ์š”: insideout2 2024 ์บ˜์‹œ๋งจ ์—์ด๋ฏธ ๋งˆ์•ผ 101112 199
{
  root: Movie {
    title: 'insideout2',
    year: 2024,
    director: '์บ˜์‹œ๋งจ',
    actorA: '์—์ด๋ฏธ',
    actorB: '๋งˆ์•ผ',
    tickets: 101112,
    theaters: 199,
    next: null
  },
  movieList: [ 'insideout2' ]
}
์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
a
์˜ํ™” ์ œ๋ชฉ(๊ณต๋ฐฑ ๋ฏธํฌํ•จ), ์ตœ์ดˆ ์ƒ์˜์—ฐ๋„, ๊ฐ๋…, ์ฃผ์—ฐ๋ฐฐ์šฐ 2๋ช…, ๊ด€๋žŒ์ธ์›, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜๋ฅผ ๊ณต๋ฐฑ ํฌํ•จ ์ž…๋ ฅํ•˜์„ธ์š”: ์œ„๋Œ€ํ•œ์‡ผ๋งจ 2017 ๋งˆ์ดํด ํœด์žญ๋งจ ์žญ์—ํ”„๋ก  10022 9999
{
  root: Movie {
    title: 'insideout2',
    year: 2024,
    director: '์บ˜์‹œ๋งจ',
    actorA: '์—์ด๋ฏธ',
    actorB: '๋งˆ์•ผ',
    tickets: 101112,
    theaters: 199,
    next: Movie {
      title: '์œ„๋Œ€ํ•œ์‡ผ๋งจ',
      year: 2017,
      director: '๋งˆ์ดํด',
      actorA: 'ํœด์žญ๋งจ',
      actorB: '์žญ์—ํ”„๋ก ',
      tickets: 10022,
      theaters: 9999,
      next: null
    }
  },
  movieList: [ 'insideout2', '์œ„๋Œ€ํ•œ์‡ผ๋งจ' ]
}
์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
b
์˜ํ™”์˜ ์ œ๋ชฉ๊ณผ ์—…๋ฐ์ดํŠธ ์‹œํ‚ฌ ์ธ์›์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ์ž…๋ ฅํ•˜์„ธ์š”: insideout2 100
์ฐจ์คŒ
{
  root: Movie {
    title: 'insideout2',
    year: 2024,
    director: '์บ˜์‹œ๋งจ',
    actorA: '์—์ด๋ฏธ',
    actorB: '๋งˆ์•ผ',
    tickets: 100,
    theaters: 199,
    next: Movie {
      title: '์œ„๋Œ€ํ•œ์‡ผ๋งจ',
      year: 2017,
      director: '๋งˆ์ดํด',
      actorA: 'ํœด์žญ๋งจ',
      actorB: '์žญ์—ํ”„๋ก ',
      tickets: 10022,
      theaters: 9999,
      next: null
    }
  },
  movieList: [ 'insideout2', '์œ„๋Œ€ํ•œ์‡ผ๋งจ' ]
}
์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
c
์˜ํ™”์˜ ์ œ๋ชฉ๊ณผ ์—…๋ฐ์ดํŠธ ์‹œํ‚ฌ ์ƒ์˜๊ด€ ์ˆ˜๋ฅผ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ์ž…๋ ฅํ•˜์„ธ์š”: ์œ„๋Œ€ํ•œ์‡ผ๋งจ 29
{
  root: Movie {
    title: 'insideout2',
    year: 2024,
    director: '์บ˜์‹œ๋งจ',
    actorA: '์—์ด๋ฏธ',
    actorB: '๋งˆ์•ผ',
    tickets: 100,
    theaters: 199,
    next: Movie {
      title: '์œ„๋Œ€ํ•œ์‡ผ๋งจ',
      year: 2017,
      director: '๋งˆ์ดํด',
      actorA: 'ํœด์žญ๋งจ',
      actorB: '์žญ์—ํ”„๋ก ',
      tickets: 10022,
      theaters: 29,
      next: null
    }
  },
  movieList: [ 'insideout2', '์œ„๋Œ€ํ•œ์‡ผ๋งจ' ]
}
์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
d
[
  Movie {
    title: '์œ„๋Œ€ํ•œ์‡ผ๋งจ',
    year: 2017,
    director: '๋งˆ์ดํด',
    actorA: 'ํœด์žญ๋งจ',
    actorB: '์žญ์—ํ”„๋ก ',
    tickets: 10022,
    theaters: 29,
    next: null
  },
  Movie {
    title: 'insideout2',
    year: 2024,
    director: '์บ˜์‹œ๋งจ',
    actorA: '์—์ด๋ฏธ',
    actorB: '๋งˆ์•ผ',
    tickets: 100,
    theaters: 199,
    next: Movie {
      title: '์œ„๋Œ€ํ•œ์‡ผ๋งจ',
      year: 2017,
      director: '๋งˆ์ดํด',
      actorA: 'ํœด์žญ๋งจ',
      actorB: '์žญ์—ํ”„๋ก ',
      tickets: 10022,
      theaters: 29,
      next: null
    }
  }
]
์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
e
[ '์œ„๋Œ€ํ•œ์‡ผ๋งจ', 'insideout2' ]
์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
f
๊ฐ๋… ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”: ๋งˆ์ดํด
[ '์œ„๋Œ€ํ•œ์‡ผ๋งจ' ]
์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
g
๋ฐฐ์šฐ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”: ํœด์žญ๋งจ
[ '์œ„๋Œ€ํ•œ์‡ผ๋งจ' ]
์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
h
228
์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
i
์ง€์šธ ์˜ํ™” ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”: ์œ„๋Œ€ํ•œ์‡ผ๋งจ
{
  root: Movie {
    title: 'insideout2',
    year: 2024,
    director: '์บ˜์‹œ๋งจ',
    actorA: '์—์ด๋ฏธ',
    actorB: '๋งˆ์•ผ',
    tickets: 100,
    theaters: 199,
    next: null
  },
  movieList: [ 'insideout2' ]
}
์˜ํ™” ์ •๋ณด ์ถ”๊ฐ€: a , ๊ด€๋žŒ์ธ์› ์—…๋ฐ์ดํŠธ: b, ์ƒ์˜๊ด€ ๊ฐœ์ˆ˜ ์—…๋ฐ์ดํŠธ: c, ์ƒ์˜์—ฐ๋„์ˆœ ์กฐํšŒ: d, ๊ด€๋žŒ ์ธ์› ์ƒ์œ„ 10๊ฐœ ์กฐํšŒ: e, ๊ฐ๋… ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: f, ๋ฐฐ์šฐ ๊ธฐ์ค€ ์˜ํ™” ๊ฒ€์ƒ‰: g, ์˜ํ™” ์ „์ฒด ์ƒ์˜๊ด€ ์กฐํšŒ: h, ์˜ํ™” ์‚ญ์ œ: i, ์ข…๋ฃŒ : q
q

![tg.png][https://blog.kakaocdn.net/dn/Uq7Bc/btrr5Vseaa0/YJIG3ziHdGreV0oTgEQoqK/img.png]

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

ํ•จ์ˆ˜ ์•ˆ์˜ ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋‘ ํ…Œ์ŠคํŠธ๋ฅผ ๋งˆ์นœ ์ƒํƒœ๋ผ jest๋ฅผ ํ†ตํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์„ ์žก๊ณ  ์‹œ๋„ํ•ด๋ณด์•˜๋‹ค. ๋‚ด๊ฐ€ ํ–ˆ๋˜ ํ…Œ์ŠคํŠธ๋Š” ์ฃผ๋กœ โ€˜๊ฐ’์„ ํ•จ์ˆ˜์— ๋„ฃ์—ˆ์„ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์ด ์ƒˆ๋กœ์šด ๊ฐ’์ธ๊ฐ€?โ€˜์— ์ง‘์ค‘ํ•ด์„œ ํ…Œ์ŠคํŠธํ•ด๋ณด์•˜๋‹ค. ๋˜ํ•œ ํ•ด๋‹น ํ•จ์ˆ˜ ์•ˆ์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๋ถˆ๋ณ€์„ฑ ๋˜ํ•œํ…Œ์ŠคํŠธ์— ๋„ฃ์–ด์ฃผ์–ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์„ฑ์„ ์ค‘์ ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ–ˆ๋‹ค.

import { movieRank } from "./movieRank.mjs";
 
describe("ํ…Œ์ŠคํŠธ", () => {
  test("์ƒ์„ฑ๋œ ํด๋กœ์ € ๋น„๊ต", () => {
    let a = movieRank();
    let b = movieRank();
    expect(b === a).toBe(false);
  });
  test("๊ฐ™์€ ํ•„๋“œ ๊ฐ’์„ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ ์ฐธ์กฐ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฐ€?", () => {
    let a = movieRank();
    a = a.add({
      title: "์ธ์‚ฌ์ด๋“œ์•„์›ƒ2",
      year: 2024,
      director: "์บ˜์‹œ ๋งจ",
      actorA: "์—์ด๋ฏธ ํฌ์—˜๋Ÿฌ",
      actorB: "๋งˆ์•ผ ํ˜ธํฌ",
      tickets: 1000,
      theaters: 2000,
    });
    let b = movieRank();
    b = b.add({
      title: "์ธ์‚ฌ์ด๋“œ์•„์›ƒ2",
      year: 2024,
      director: "์บ˜์‹œ ๋งจ",
      actorA: "์—์ด๋ฏธ ํฌ์—˜๋Ÿฌ",
      actorB: "๋งˆ์•ผ ํ˜ธํฌ",
      tickets: 1000,
      theaters: 2000,
    });
    expect(b.getInfo().root === a.getInfo().root).toBe(false);
  });
  test("๊ฐ™์€ ํ•จ์ˆ˜ ๋‚ด์˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฐ›์•˜์„ ๋•Œ ๋ฆฌํ„ด๋ฐ›์€ ๋‘ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ๊ฐ€?", () => {
    let oldA = movieRank();
    oldA = oldA.add({
      title: "์ธ์‚ฌ์ด๋“œ์•„์›ƒ2",
      year: 2024,
      director: "์บ˜์‹œ ๋งจ",
      actorA: "์—์ด๋ฏธ ํฌ์—˜๋Ÿฌ",
      actorB: "๋งˆ์•ผ ํ˜ธํฌ",
      tickets: 1000,
      theaters: 2000,
    });
    let newA = oldA.add({
      title: "์ธ์‚ฌ์ด๋“œ์•„์›ƒ2",
      year: 2024,
      director: "์บ˜์‹œ ๋งจ",
      actorA: "์—์ด๋ฏธ ํฌ์—˜๋Ÿฌ",
      actorB: "๋งˆ์•ผ ํ˜ธํฌ",
      tickets: 1000,
      theaters: 2000,
    });
 
    // oldA์™€ newA๊ฐ€ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์ž„์„ ํ™•์ธ
    expect(newA).not.toBe(oldA);
 
    // ๊ฐ๊ฐ์˜ ๋ฃจํŠธ๊ฐ€ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ํ™•์ธ
    expect(newA.getInfo() === oldA.getInfo()).toBe(false);
  });
 
  test("ํ•ด๋‹น ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๊ฐ€ ๋ฉ”์†Œ๋“œ๋กœ ์ธํ•ด ํ•จ์ˆ˜ ์•ˆ์˜ ๊ฐ’์ด(์™ธ๋ถ€์˜ ๊ฐ’) ๋ณ€ํ•˜์ง€ ์•Š๋Š”๊ฐ€?", () => {
    let oldA = movieRank();
    let newA = oldA.add({
      title: "์ธ์‚ฌ์ด๋“œ์•„์›ƒ2",
      year: 2024,
      director: "์บ˜์‹œ ๋งจ",
      actorA: "์—์ด๋ฏธ ํฌ์—˜๋Ÿฌ",
      actorB: "๋งˆ์•ผ ํ˜ธํฌ",
      tickets: 1000,
      theaters: 2000,
    });
 
    expect(newA.getInfo() === oldA.getInfo()).toBe(false);
    expect(oldA.getInfo().root).toBe(null);
  });
  test("์˜ํ™” ์ถ”๊ฐ€ ์‹œ ๋ถˆ๋ณ€์„ฑ ์œ ์ง€", () => {
    let oldA = movieRank();
    oldA = oldA.add({
      title: "์ธ์‚ฌ์ด๋“œ์•„์›ƒ2",
      year: 2023,
      director: "์บ˜์‹œ ๋งจ",
      actorA: "์—์ด๋ฏธ ํฌ์—˜๋Ÿฌ",
      actorB: "๋งˆ์•ผ ํ˜ธํฌ",
      tickets: 1000,
      theaters: 2000,
    });
 
    const oldInfo = oldA.getInfo();
 
    let newA = oldA.add({
      title: "์ธ์‚ฌ์ด๋“œ์•„์›ƒ3",
      year: 2024,
      director: "์บ˜์‹œ ๋งจ",
      actorA: "์—์ด๋ฏธ ํฌ์—˜๋Ÿฌ",
      actorB: "๋งˆ์•ผ ํ˜ธํฌ",
      tickets: 1000,
      theaters: 2000,
    });
 
    const newInfo = newA.getInfo();
 
    expect(newA).not.toBe(oldA);
    expect(oldInfo).toEqual(oldA.getInfo());
    expect(newInfo).not.toBe(oldInfo);
 
    expect(newA.getInfo().movieList).toContain("์ธ์‚ฌ์ด๋“œ์•„์›ƒ3");
    expect(oldA.getInfo().movieList).not.toContain("์ธ์‚ฌ์ด๋“œ์•„์›ƒ3");
  });
});
 
 PASS  ./movie.test.js
  ํ…Œ์ŠคํŠธ
    โœ“ ์ƒ์„ฑ๋œ ํด๋กœ์ € ๋น„๊ต (1 ms)
    โœ“ ๊ฐ™์€ ํ•„๋“œ ๊ฐ’์„ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ ์ฐธ์กฐ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฐ€? (1 ms)
    โœ“ ๊ฐ™์€ ํ•จ์ˆ˜ ๋‚ด์˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ฐ›์•˜์„ ๋•Œ ๋ฆฌํ„ด๋ฐ›์€ ๋‘ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ๊ฐ€?
    โœ“ ํ•ด๋‹น ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๊ฐ€ ๋ฉ”์†Œ๋“œ๋กœ ์ธํ•ด ํ•จ์ˆ˜ ์•ˆ์˜ ๊ฐ’์ด(์™ธ๋ถ€์˜ ๊ฐ’) ๋ณ€ํ•˜์ง€ ์•Š๋Š”๊ฐ€?
    โœ“ ์˜ํ™” ์ถ”๊ฐ€ ์‹œ ๋ถˆ๋ณ€์„ฑ ์œ ์ง€ (1 ms)
 
Test Suites: 1 passed, 1 total
Tests:       5 passed, 5 total
Snapshots:   0 total
Time:        0.564 s, estimated 1 s
Ran all test suites.