diff --git a/README.md b/README.md index 15bb106b5..3009f3bbb 100644 --- a/README.md +++ b/README.md @@ -1 +1,121 @@ # javascript-lotto-precourse + +## ๐Ÿ“‘ ๊ฐ„๋‹จํ•œ ๋กœ๋˜ ๋ฐœ๋งค๊ธฐ ๊ตฌํ˜„ํ•˜๊ธฐ + +### ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก + +- ๋กœ๋˜ ๋ฒˆํ˜ธ์˜ ์ˆซ์ž ๋ฒ”์œ„๋Š” 1~45๊นŒ์ง€์ด๋‹ค. +- 1๊ฐœ์˜ ๋กœ๋˜๋ฅผ ๋ฐœํ–‰ํ•  ๋•Œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” 6๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ฝ‘๋Š”๋‹ค. +- ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ถ”์ฒจ ์‹œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์ˆซ์ž 6๊ฐœ์™€ ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ 1๊ฐœ๋ฅผ ๋ฝ‘๋Š”๋‹ค. +- ๋‹น์ฒจ์€ 1๋“ฑ๋ถ€ํ„ฐ 5๋“ฑ๊นŒ์ง€ ์žˆ๋‹ค. ๋‹น์ฒจ ๊ธฐ์ค€๊ณผ ๊ธˆ์•ก์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. + - 1๋“ฑ: 6๊ฐœ ๋ฒˆํ˜ธ ์ผ์น˜ / 2,000,000,000์› + - 2๋“ฑ: 5๊ฐœ ๋ฒˆํ˜ธ + ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ์ผ์น˜ / 30,000,000์› + - 3๋“ฑ: 5๊ฐœ ๋ฒˆํ˜ธ ์ผ์น˜ / 1,500,000์› + - 4๋“ฑ: 4๊ฐœ ๋ฒˆํ˜ธ ์ผ์น˜ / 50,000์› + - 5๋“ฑ: 3๊ฐœ ๋ฒˆํ˜ธ ์ผ์น˜ / 5,000์› +- ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜๋ฉด ๊ตฌ์ž… ๊ธˆ์•ก์— ํ•ด๋‹นํ•˜๋Š” ๋งŒํผ ๋กœ๋˜๋ฅผ ๋ฐœํ–‰ํ•ด์•ผ ํ•œ๋‹ค. +- ๋กœ๋˜ 1์žฅ์˜ ๊ฐ€๊ฒฉ์€ 1,000์›์ด๋‹ค. +- ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. +- ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋งคํ•œ ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋‹น์ฒจ ๋‚ด์—ญ ๋ฐ ์ˆ˜์ต๋ฅ ์„ ์ถœ๋ ฅํ•˜๊ณ  ๋กœ๋˜ ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•œ๋‹ค. +- ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ "[ERROR]"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ Error๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ ๋‹ค์Œ ํ•ด๋‹น ์ง€์ ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. + +## โœ๏ธ ์š”๊ตฌ ์‚ฌํ•ญ + +### 1) ์ž…๋ ฅ + +- ๋กœ๋˜ ๊ตฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค. ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉฐ 1,000์›์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•œ๋‹ค. + + ``` + 14000 + + ``` + +- ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋‹ค. + + ``` + 7 + + ``` + +### 2) ์ถœ๋ ฅ + +- ๋ฐœํ–‰ํ•œ ๋กœ๋˜ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๋ณด์—ฌ์ค€๋‹ค. + + ``` + 8๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค. + [8, 21, 23, 41, 42, 43] + [3, 5, 11, 16, 32, 38] + [7, 11, 16, 35, 36, 44] + [1, 8, 11, 31, 41, 42] + [13, 14, 16, 38, 42, 45] + [7, 11, 30, 40, 42, 43] + [2, 13, 22, 32, 38, 45] + [1, 3, 5, 14, 22, 45] + + ``` + +- ๋‹น์ฒจ ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค. + + ``` + 3๊ฐœ ์ผ์น˜ (5,000์›) - 1๊ฐœ + 4๊ฐœ ์ผ์น˜ (50,000์›) - 0๊ฐœ + 5๊ฐœ ์ผ์น˜ (1,500,000์›) - 0๊ฐœ + 5๊ฐœ ์ผ์น˜, ๋ณด๋„ˆ์Šค ๋ณผ ์ผ์น˜ (30,000,000์›) - 0๊ฐœ + 6๊ฐœ ์ผ์น˜ (2,000,000,000์›) - 0๊ฐœ + + ``` + +- ์ˆ˜์ต๋ฅ ์€ ์†Œ์ˆ˜์  ๋‘˜์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผํ•œ๋‹ค. (ex. 100.0%, 51.5%, 1,000,000.0%) + + ``` + ์ด ์ˆ˜์ต๋ฅ ์€ 62.5%์ž…๋‹ˆ๋‹ค. + + ``` + +### 3) ์—๋Ÿฌ ์ฒ˜๋ฆฌ + +- ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฐ’์„ ์ž…๋ ฅํ•  ๊ฒฝ์šฐ "[ERROR]"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ + +``` +[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +``` + +## โญ•์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ + +``` +๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”. +8000 + +8๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค. +[8, 21, 23, 41, 42, 43] +[3, 5, 11, 16, 32, 38] +[7, 11, 16, 35, 36, 44] +[1, 8, 11, 31, 41, 42] +[13, 14, 16, 38, 42, 45] +[7, 11, 30, 40, 42, 43] +[2, 13, 22, 32, 38, 45] +[1, 3, 5, 14, 22, 45] + +๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”. +1,2,3,4,5,6 + +๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”. +7 + +๋‹น์ฒจ ํ†ต๊ณ„ +--- +3๊ฐœ ์ผ์น˜ (5,000์›) - 1๊ฐœ +4๊ฐœ ์ผ์น˜ (50,000์›) - 0๊ฐœ +5๊ฐœ ์ผ์น˜ (1,500,000์›) - 0๊ฐœ +5๊ฐœ ์ผ์น˜, ๋ณด๋„ˆ์Šค ๋ณผ ์ผ์น˜ (30,000,000์›) - 0๊ฐœ +6๊ฐœ ์ผ์น˜ (2,000,000,000์›) - 0๊ฐœ +์ด ์ˆ˜์ต๋ฅ ์€ 62.5%์ž…๋‹ˆ๋‹ค. + +``` + +## ๐Ÿ”ŽETC + +- @woowacourse/mission-utils์—์„œ ์ œ๊ณตํ•˜๋Š” Random ๋ฐ Console API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. + - Random ๊ฐ’ ์ถ”์ถœ์€ Random. pickUniqueNumbersInRange()๋ฅผ ํ™œ์šฉํ•œ๋‹ค. + - ์‚ฌ์šฉ์ž์˜ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅํ•˜๋ ค๋ฉด Console.readLineAsync()์™€ Console.print()๋ฅผ ํ™œ์šฉํ•œ๋‹ค. diff --git a/__tests__/ApplicationTest.js b/__tests__/ApplicationTest.js index 872380c9c..a4f152d30 100644 --- a/__tests__/ApplicationTest.js +++ b/__tests__/ApplicationTest.js @@ -1,12 +1,11 @@ import App from "../src/App.js"; import { MissionUtils } from "@woowacourse/mission-utils"; +// Mock functions for console input and output const mockQuestions = (inputs) => { MissionUtils.Console.readLineAsync = jest.fn(); - MissionUtils.Console.readLineAsync.mockImplementation(() => { const input = inputs.shift(); - return Promise.resolve(input); }); }; @@ -24,21 +23,17 @@ const getLogSpy = () => { return logSpy; }; +// Error test helper const runException = async (input) => { - // given const logSpy = getLogSpy(); - const RANDOM_NUMBERS_TO_END = [1, 2, 3, 4, 5, 6]; const INPUT_NUMBERS_TO_END = ["1000", "1,2,3,4,5,6", "7"]; - mockRandoms([RANDOM_NUMBERS_TO_END]); mockQuestions([input, ...INPUT_NUMBERS_TO_END]); - // when const app = new App(); await app.run(); - // then expect(logSpy).toHaveBeenCalledWith(expect.stringContaining("[ERROR]")); }; @@ -48,7 +43,6 @@ describe("๋กœ๋˜ ํ…Œ์ŠคํŠธ", () => { }); test("๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ", async () => { - // given const logSpy = getLogSpy(); mockRandoms([ @@ -63,11 +57,11 @@ describe("๋กœ๋˜ ํ…Œ์ŠคํŠธ", () => { ]); mockQuestions(["8000", "1,2,3,4,5,6", "7"]); - // when const app = new App(); await app.run(); - // then + console.log(logSpy.mock.calls.map((call) => call[0])); + const logs = [ "8๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.", "[8, 21, 23, 41, 42, 43]", diff --git a/__tests__/LottoTest.js b/__tests__/LottoTest.js index 409aaf69b..31460c656 100644 --- a/__tests__/LottoTest.js +++ b/__tests__/LottoTest.js @@ -7,12 +7,15 @@ describe("๋กœ๋˜ ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ", () => { }).toThrow("[ERROR]"); }); - // TODO: ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋„๋ก ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๊ตฌํ˜„ test("๋กœ๋˜ ๋ฒˆํ˜ธ์— ์ค‘๋ณต๋œ ์ˆซ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.", () => { expect(() => { new Lotto([1, 2, 3, 4, 5, 5]); }).toThrow("[ERROR]"); }); - // TODO: ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ๋”ฐ๋ฅธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ + test("๋กœ๋˜ ๋ฒˆํ˜ธ๊ฐ€ 6๊ฐœ์ด๊ณ  ์ค‘๋ณต์ด ์—†์œผ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.", () => { + expect(() => { + new Lotto([1, 2, 3, 4, 5, 6]); + }).not.toThrow(); + }); }); diff --git a/src/App.js b/src/App.js index 091aa0a5d..de3af9ec5 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,168 @@ +import { Console, Random } from "@woowacourse/mission-utils"; +import Lotto from "./Lotto.js"; +import { + LOTTO_PRICE, + LOTTO_NUMBER_COUNT, + LOTTO_NUMBER_RANGE, + WINNING_PRIZES, + MATCH_COUNTS, + ERROR_MESSAGES, +} from "./constants.js"; + class App { - async run() {} + run() { + this.inputPurchaseAmount(); + } + + async inputPurchaseAmount() { + const amount = await Console.readLineAsync("๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + this.validatePurchaseAmount(amount); + } + + validatePurchaseAmount(amount) { + const purchaseAmount = Number(amount); + + if (Number.isNaN(purchaseAmount) || purchaseAmount % LOTTO_PRICE !== 0) { + this.handleError(ERROR_MESSAGES.INVALID_AMOUNT); + this.inputPurchaseAmount(); + return; + } + this.purchaseAmount = purchaseAmount; + this.printPurchasedLotto(); + } + + printPurchasedLotto() { + const lottoCount = this.purchaseAmount / LOTTO_PRICE; + Console.print(`${lottoCount}๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.`); + this.lottoTickets = this.generateLottoTickets(lottoCount); + this.displayLottoTickets(); + this.inputWinningNumbers(); + } + + generateLottoTickets(count) { + return Array.from({ length: count }, () => { + const numbers = Random.pickUniqueNumbersInRange(1, 45, 6).sort((a, b) => a - b); + return new Lotto(numbers); + }); + } + + displayLottoTickets() { + this.lottoTickets.forEach((ticket) => { + Console.print(`[${ticket.getNumbers().join(", ")}]`); + }); + } + + async inputWinningNumbers() { + const winningNumbersInput = await Console.readLineAsync("\n๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + const winningNumbers = winningNumbersInput.split(",").map(Number); + this.validateWinningNumbers(winningNumbers); + } + + validateWinningNumbers(numbers) { + if (numbers.length !== LOTTO_NUMBER_COUNT || new Set(numbers).size !== LOTTO_NUMBER_COUNT) { + this.handleError(ERROR_MESSAGES.INVALID_LOTTO_COUNT); + this.inputWinningNumbers(); + return; + } + if ( + numbers.some((number) => number < LOTTO_NUMBER_RANGE.MIN || number > LOTTO_NUMBER_RANGE.MAX) + ) { + this.handleError(ERROR_MESSAGES.INVALID_NUMBER_RANGE); + this.inputWinningNumbers(); + return; + } + this.winningNumbers = numbers; + this.inputBonusNumber(); + } + + async inputBonusNumber() { + const bonusNumberInput = await Console.readLineAsync("\n๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n"); + const bonusNumber = Number(bonusNumberInput); + this.validateBonusNumber(bonusNumber); + } + + validateBonusNumber(number) { + if ( + Number.isNaN(number) || + number < LOTTO_NUMBER_RANGE.MIN || + number > LOTTO_NUMBER_RANGE.MAX + ) { + this.handleError(ERROR_MESSAGES.INVALID_NUMBER_RANGE); + this.inputBonusNumber(); + return; + } + if (this.winningNumbers.includes(number)) { + this.handleError(ERROR_MESSAGES.BONUS_NUMBER_DUPLICATE); + this.inputBonusNumber(); + return; + } + this.bonusNumber = number; + this.calculateResults(); + } + + calculateResults() { + this.results = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0 }; + + this.lottoTickets.forEach((ticket) => { + const matchedCount = ticket + .getNumbers() + .filter((num) => this.winningNumbers.includes(num)).length; + const isBonusMatched = ticket.getNumbers().includes(this.bonusNumber); + + if (matchedCount === MATCH_COUNTS.FIRST) { + this.results[1] += 1; + return; + } + + if (matchedCount === MATCH_COUNTS.SECOND && isBonusMatched) { + this.results[2] += 1; + return; + } + + if (matchedCount === MATCH_COUNTS.THIRD) { + this.results[3] += 1; + return; + } + + if (matchedCount === MATCH_COUNTS.FOURTH) { + this.results[4] += 1; + return; + } + + if (matchedCount === MATCH_COUNTS.FIFTH) { + this.results[5] += 1; + } + }); + + this.printResults(); + } + + printResults() { + Console.print("๋‹น์ฒจ ํ†ต๊ณ„\n---"); + Console.print(`3๊ฐœ ์ผ์น˜ (5,000์›) - ${this.results[5]}๊ฐœ`); + Console.print(`4๊ฐœ ์ผ์น˜ (50,000์›) - ${this.results[4]}๊ฐœ`); + Console.print(`5๊ฐœ ์ผ์น˜ (1,500,000์›) - ${this.results[3]}๊ฐœ`); + Console.print(`5๊ฐœ ์ผ์น˜, ๋ณด๋„ˆ์Šค ๋ณผ ์ผ์น˜ (30,000,000์›) - ${this.results[2]}๊ฐœ`); + Console.print(`6๊ฐœ ์ผ์น˜ (2,000,000,000์›) - ${this.results[1]}๊ฐœ`); + + this.calculateProfit(); + } + + calculateProfit() { + const totalPrize = + this.results[1] * WINNING_PRIZES.FIRST + + this.results[2] * WINNING_PRIZES.SECOND + + this.results[3] * WINNING_PRIZES.THIRD + + this.results[4] * WINNING_PRIZES.FOURTH + + this.results[5] * WINNING_PRIZES.FIFTH; + + const profitRate = ((totalPrize / this.purchaseAmount) * 100).toFixed(1); + Console.print(`์ด ์ˆ˜์ต๋ฅ ์€ ${profitRate}%์ž…๋‹ˆ๋‹ค.`); + } + + handleError(message) { + Console.print(message); + } } export default App; diff --git a/src/Lotto.js b/src/Lotto.js index cb0b1527e..7b34fc6c3 100644 --- a/src/Lotto.js +++ b/src/Lotto.js @@ -10,9 +10,14 @@ class Lotto { if (numbers.length !== 6) { throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 6๊ฐœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค."); } + if (new Set(numbers).size !== numbers.length) { + throw new Error("[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ์—๋Š” ์ค‘๋ณต๋œ ์ˆซ์ž๊ฐ€ ์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."); + } } - // TODO: ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ + getNumbers() { + return this.#numbers; + } } export default Lotto; diff --git a/src/constants.js b/src/constants.js new file mode 100644 index 000000000..5b1b0b30f --- /dev/null +++ b/src/constants.js @@ -0,0 +1,26 @@ +export const LOTTO_PRICE = 1000; +export const LOTTO_NUMBER_COUNT = 6; +export const LOTTO_NUMBER_RANGE = Object.freeze({ MIN: 1, MAX: 45 }); + +export const WINNING_PRIZES = Object.freeze({ + FIRST: 2000000000, + SECOND: 30000000, + THIRD: 1500000, + FOURTH: 50000, + FIFTH: 5000, +}); + +export const MATCH_COUNTS = Object.freeze({ + FIRST: 6, + SECOND: 5, + THIRD: 5, + FOURTH: 4, + FIFTH: 3, +}); + +export const ERROR_MESSAGES = Object.freeze({ + INVALID_AMOUNT: "[ERROR] ๊ตฌ์ž… ๊ธˆ์•ก์€ 1,000์› ๋‹จ์œ„๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.", + INVALID_LOTTO_COUNT: "[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” 6๊ฐœ์˜ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.", + INVALID_NUMBER_RANGE: "[ERROR] ๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ 45 ์‚ฌ์ด์˜ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.", + BONUS_NUMBER_DUPLICATE: "[ERROR] ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋Š” ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.", +});