๋ฏธ์ ์ฒซ์ธ์
ํ์ค ์์ฝ
์ ์ ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ํํ์ฌ ์๊ฐ์ ์ธ ํ๋ฅผ ๊ตฌํํ๊ณ ํ์ํ ์ ์๊ฒ ๋ง๋ค ์ ์๋๋ก ์ฐ์ตํ๋ ๊ณผ์ ์ด๋ค.
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 ๋ชจ๋์ ์ฌ์ฉํ๋ ค๋ฉด ์ถ๊ฐ์ ์ธ ๊ณผ์ ์ด ํ์ํ๋ค. ์ฐพ์๋ณด๊ธฐ๋ก๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์๋ค.
- ํ์ผ ํ์ฅ์๋ฅผ
.mjs๋ก ์ค์ game.js๋ฅผgame.mjs๋ก ๋ณ๊ฒฝํ ๋ค ๋ค์ ์คํํ์ง๋ง ๊ฐ์ ์ค๋ฅ๊ฐ ์ง์๋์๋ค.
package.jsonํ์ผ์"type": "module"์ถ๊ฐ- ๋ฏธ์ 3 ํด๋๋ฅผ ๋ฐ๋ก ๋ง๋ค๊ณ , ๊ฑฐ๊ธฐ์ package.jsonํ์ผ์ ๋ง๋ ๋ค์ ํด๋น ์์ฑ์ ์ถ๊ฐํด์คฌ๋๋ ํด๊ฒฐ๋์๋ค.
๊นจ๋ฌ์ ์
์ด์ ๊น์ง๋ ํญ์ ๋ฆฌ์กํธ๋ง ์ฌ์ฉํ๋ฉด์ ๋ชจ๋๋ค์ ํญ์ ๊ฐ์ ธ์ค๋ฉด์ package.json์ ์ด๋ฏธ ๋ชจ๋์ด ๋ํดํธ๋ก ๋ช ์๋์ด์์๊ธฐ ๋๋ฌธ์ ์์ง ๋ชปํ์ง๋ง ์ด๋ฒ์ ์๋กญ๊ฒ ์๋ฌ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด์ package.json์ ๊ธฐ๋ฅ๊ณผ ๋ชจ๋์ ๋ํ ์ดํด๋ฅผ ๋ณด๋ค ๋์ผ ์ ์์๋ค.