๋ฏธ์…˜ ์ฒซ์ธ์ƒ

ํ•œ์ค„ ์š”์•ฝ

์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜์—ฌ ์‹œ๊ฐ์ ์ธ ํ‘œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์—ฐ์Šตํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. find()ํ•จ์ˆ˜์—์„œ ๊ฒŒ์ž„์„ ํ”Œ๋ ˆ์ด ํ•˜๋Š” ์‹œ์ ๊ณผ ์ฐธ๊ฐ€์ธ์›์ˆ˜๋ฅผ ๋ฐ›์€ ํ›„ ์ด๋ฅผ filter๋ฅผ ํ†ตํ•ด์„œ ์กฐ๊ฑด์— ๋งž๋Š” ๊ฒŒ์ž„๋งŒ ๋ฝ‘์•„๋‚ด๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•ต์‹ฌ

๊ฒŒ์ž„ ํ…Œ์ด๋ธ”์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ ์ž์ฒด๋Š” ์–ด๋ ต์ง€ ์•Š์ง€๋งŒ ํ•ด๋‹น ๊ฒŒ์ž„์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ณผ์ •์—์„œ string ํ˜•์‹์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ํŠน์ • ์‹œ์ ๊ณผ ์ฐธ์—ฌ์ž๋ฅผ ์ ์ ˆํžˆ ํŒŒ์‹ฑํ•˜๊ณ  ์กฐ๊ฑด์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ณ ๋ฏผ์„ ํ•ด๋ณด๋ผ๊ณ  ๋‚ด์ค€ ๋ฏธ์…˜๊ฐ™์€ ๋А๋‚Œ์ด ๋“ค์—ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

1. ๊ฒŒ์ž„ ํ…Œ์ด๋ธ” ์ œ์ž‘

// game.js
const games = {
  Kong: {
    discontinued: true,
    genre: "Adventure",
    star: 4.1,
    maxUser: 1,
    open: "1970.1",
    close: "1981.4",
  },
  Ace: {
    discontinued: false,
    genre: "Board",
    star: 3.8,
    maxUser: 4,
    open: "1987.7",
    close: "2024.7",
  },
  Mario: {
    discontinued: true,
    genre: "RPG",
    star: 3.3,
    maxUser: 2,
    open: "2001.9",
    close: "2007.11",
  },
  Prince: {
    discontinued: true,
    genre: "RPG",
    star: 4.8,
    maxUser: 1,
    open: "1983.3",
    close: "2002.5",
  },
  Dragons: {
    discontinued: true,
    genre: "Fight",
    star: 3.4,
    maxUser: 4,
    open: "1990.5",
    close: "1995.12",
  },
  Civil: {
    discontinued: false,
    genre: "Simulation",
    star: 4.2,
    maxUser: 1,
    open: "2002.6",
    close: "2024.7",
  },
  Teken: {
    discontinued: true,
    genre: "Fight",
    star: 4.0,
    maxUser: 2,
    open: "1998.7",
    close: "2009.12",
  },
  GoCart: {
    discontinued: false,
    genre: "Sports",
    star: 4.6,
    maxUser: 8,
    open: "2006.12",
    close: "2024.07",
  },
  Football: {
    discontinued: false,
    genre: "Sports",
    star: 2.9,
    maxUser: 8,
    open: "1994.6",
    close: "2024.7",
  },
  Brave: {
    discontinued: true,
    genre: "RPG",
    star: 4.2,
    maxUser: 1,
    open: "1980.6",
    close: "1985.1",
  },
};
 
export default games;
 

์ฒ˜์Œ์—๋Š” find.js์— ๋ชจ๋“  ๊ฒŒ์ž„๋„ ๋„ฃ์€ ๋‹ค์Œ์— ๋ฐ”๋กœ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ์ •๋ณด๋ฅผ ๊ธฐ์ž…ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ผ์ธ์ด ๋„ˆ๋ฌด ๊ธธ์–ด์ ธ ๋ณด๊ธฐ ํž˜๋“ค์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒŒ์ž„๋“ค์˜ ์ •๋ณด๋ฅผ game.js๋ฅผ ๋งŒ๋“  ๋’ค์— import ํ•ด์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ–ˆ๋‹ค.

2. find() ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒƒ๋“ค

find()์— ์ฒซ๋ฒˆ์งธ๋กœ ๋“ค์–ด๊ฐ€๋Š” param0์˜ ๊ฐ’์€ string์œผ๋กœ ๋œ YYYYMM ํ˜•์‹์ด๋‹ค.

๋ฌธ์ž์—ด์„ YYYY / MM ์œผ๋กœ ์ž˜๋ผ ๋”ฐ๋กœ ๋น„๊ต

function find(date, users) {
  const year = parseInt(date.slice(0, 4));
  const month = parseInt(date.slice(4));
	...

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ ๋ณ„์ ์˜ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ sort()๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ•œ๋ฒˆ ์ •๋ ฌ์„ ์‹œ์ผœ์ฃผ์—ˆ๋‹ค.

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์œ„ํ•œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด ์„ค๊ณ„

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

  • ๋จผ์ € maxUser๋ฅผ ํ†ตํ•ด ํ”Œ๋ ˆ์ดํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ €์˜ ์ˆ˜๋ณด๋‹ค ์ฐธ๊ฐ€์ž ์ˆ˜๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ๊ฑฐ๋ฆ„
  • ์˜คํ”ˆ๋…„๋„๋ณด๋‹ค ๋’ค์˜ ์—ฐ๋„๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ
    • ํŒ๋งค์ข…๋ฃŒ๋…„๋„์™€ ๊ฐ™์„ ๊ฒฝ์šฐ ์›”์€ ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•จ
    • ํŒ๋งค์ข…๋ฃŒ๋…„๋„๋ณด๋‹ค ์ด์ „์ผ ๊ฒฝ์šฐ ํ†ต๊ณผ
  • ์˜คํ”ˆ๋…„๋„์™€ ์ฐธ๊ฐ€๋…„๋„๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ
    • ์˜คํ”ˆ์›”์ด๊ฑฐ๋‚˜ ๊ทธ ํ›„์˜ ์›”์— ์ฐธ์—ฌํ•ด์•ผ ํ•จ
    • ์˜คํ”ˆ๋…„๋„๊ฐ€ ํŒ๋งค์ข…๋ฃŒ๋…„๋„์™€ ๊ฐ™์„ ๊ฒฝ์šฐ ์ฐธ๊ฐ€์›”์ด ํŒ๋งค์ข…๋ฃŒ์›”๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์•„์•ผ ํ•จ
let search = games.filter((item) => {
    const open = item.open.split(".").map(Number);
    const close = item.close.split(".").map(Number);
    if (item.maxUser < users) {
      return false;
    }
    if (open[0] < year) {
      if (close[0] === year && close[1] >= month) return true;
      else if (close[0] > year) return true;
      return false;
    } else if (open[0] === year) {
      if (open[1] <= month) return true;
      else if (open[0] === close[0] && close[1] >= month) return true;
      return false;
    }
    return false;
  });
  search.sort((a, b) => {
    b.star - a.star;
  });

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜์ผ ๋•Œ๋Š” ๋”ฐ๋กœ ๋ณ„์ ์„ ๊ธฐ์žฌํ•˜์ง€ ์•Š์Œ + ๋‹จ์ข…๋œ ๊ฒŒ์ž„์˜ ๊ฒฝ์šฐ ์ด๋ฆ„ ๋’ค์— * ๋ถ™์ด๊ธฐ

์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์„œ ๋„ฃ๋Š” ๋ฌธ์ž์—ด ์•ˆ์— ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ๋„ฃ์–ด์„œ ์‹œ๋„ํ•ด ๋ณด์•˜๋‹ค. ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•จ์„ ํ™•์ธํ–ˆ๋‹ค.

let result = [];
  search.forEach((game) => {
    result.push(
      `${game.name}${game.discontinued ? "*" : ""}(${game.genre}) ${
        result.length > 1 ? game.star : ""
      }`
    );
  });

์˜ค๋ฅ˜์กฐ๊ฑด ์„ค์ •

๋งŒ์•ฝ find()ํ•จ์ˆ˜์— ์ œ๋Œ€๋กœ ๋œ ๊ฐ’์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์—๋Ÿฌ์กฐ๊ฑด์— ๋Œ€ํ•ด ๋Œ€์‘ํ•˜๋„๋ก ์กฐ๊ฑด์„ ์„ค์ •ํ–ˆ๋‹ค.

function find(date, users) {
  if (!date || !users || date.length !== 6 || isNaN(users)) return "";
  ...
  }

์กฐ๊ฑด์€

  • date๋‚˜ users๊ฐ€ falsyํ•œ ๊ฐ’์ผ ๊ฒฝ์šฐ
  • ๋‚ ์งœ ํ˜•์‹์ด ์ •์ƒ์ด์•„๋‹ ๊ฒฝ์šฐ
  • users์— ์ˆซ์ž๊ฐ€ ๋“ค์–ด์˜ค์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ฅผ ์ƒ๊ฐํ•˜์—ฌ ๋ช…์‹œํ•˜์˜€๋‹ค.

์™„์„ฑ ์ฝ”๋“œ

function find(date, users) {
  if (!date || !users || date.length !== 6 || isNaN(users)) return "";
  const year = parseInt(date.slice(0, 4));
  const month = parseInt(date.slice(4));
  let search = games.filter((item) => {
    const open = item.open.split(".").map(Number);
    const close = item.close.split(".").map(Number);
    if (item.maxUser < users) {
      return false;
    }
    if (open[0] < year) {
      if (close[0] === year && close[1] >= month) return true;
      else if (close[0] > year) return true;
      return false;
    } else if (open[0] === year) {
      if (open[1] <= month) return true;
      else if (open[0] === close[0] && close[1] >= month) return true;
      return false;
    }
    return false;
  });
  search.sort((a, b) => {
    b.star - a.star;
  });
  let result = [];
  search.forEach((game) => {
    result.push(
      `${game.name}${game.discontinued ? "*" : ""}(${game.genre}) ${
        search.length > 1 ? game.star : ""
      }`
    );
  });
  return result.join(", ");
}

๋งˆ์ฃผ์นœ ์˜ค๋ฅ˜

์‹ค์ˆ˜ ์ฝ”๋“œ

import games from "./gameList";
^^^^^^
SyntaxError: Cannot use import statement outside a module

๊ฐ์ฒด๋ฅผ import ํ•ด์˜ค๋Š” ๊ณผ์ •์—์„œ ์œ„์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋ณด์•˜๋‹ค.

๋ฌธ์ œ ๋ถ„์„ ๋ฐ ํ•ด๊ฒฐ

import ๋ฌธ์€ ES6 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋งŒ ์ง€์›๋˜์ง€๋งŒ Node.js์—์„œ๋Š” ES6 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ถ”๊ฐ€์ ์ธ ๊ณผ์ •์ด ํ•„์š”ํ–ˆ๋‹ค. ์ฐพ์•„๋ณด๊ธฐ๋กœ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋‹ค.

  1. ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ .mjs๋กœ ์„ค์ •
    • game.js๋ฅผ game.mjs๋กœ ๋ณ€๊ฒฝํ•œ ๋’ค ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ์ง€๋งŒ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ์ง€์†๋˜์—ˆ๋‹ค.
  2. package.json ํŒŒ์ผ์— "type": "module"์ถ”๊ฐ€
    • ๋ฏธ์…˜3 ํด๋”๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค๊ณ , ๊ฑฐ๊ธฐ์— package.jsonํŒŒ์ผ์„ ๋งŒ๋“  ๋’ค์— ํ•ด๋‹น ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์คฌ๋”๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

๊นจ๋‹ฌ์€ ์ 

์ด์ œ๊นŒ์ง€๋Š” ํ•ญ์ƒ ๋ฆฌ์•กํŠธ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ชจ๋“ˆ๋“ค์„ ํ•ญ์ƒ ๊ฐ€์ ธ์˜ค๋ฉด์„œ package.json์— ์ด๋ฏธ ๋ชจ๋“ˆ์ด ๋””ํดํŠธ๋กœ ๋ช…์‹œ๋˜์–ด์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•Œ์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์ด๋ฒˆ์— ์ƒˆ๋กญ๊ฒŒ ์—๋Ÿฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด์„œ package.json์˜ ๊ธฐ๋Šฅ๊ณผ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋ณด๋‹ค ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.