์ฒดํฌํฌ์ธํธ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํ์ต(ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์, ๋ถ๋ณ์ฑ, ์ฐธ์กฐํฌ์์ฑ, ์์ํจ์) - 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.