From 84e824c92c1badc271ac7a641796630d1d229110 Mon Sep 17 00:00:00 2001 From: okojess Date: Mon, 20 Oct 2025 22:47:20 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=EB=8D=A7?= =?UTF-8?q?=EC=85=88=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++++++ src/App.js | 16 ++++++++++++++++ src/Calculator.js | 15 +++++++++++++++ src/Parser.js | 15 +++++++++++++++ src/Validator.js | 14 ++++++++++++++ src/js/index.js | 36 ++++++++++++++++++++++++++++++++++++ 6 files changed, 105 insertions(+) create mode 100644 src/App.js create mode 100644 src/Calculator.js create mode 100644 src/Parser.js create mode 100644 src/Validator.js diff --git a/README.md b/README.md index 4d8f0b5..d47441a 100644 --- a/README.md +++ b/README.md @@ -53,3 +53,12 @@ ## πŸ“ License This project is [MIT](https://github.com/woowacourse/javascript-calculator/blob/master/LICENSE) licensed. + +## κ΅¬ν˜„ν•  κΈ°λŠ₯ λͺ©λ‘ + +1. μž…λ ₯κ°’ λ°›κΈ° +2. λ¬Έμžμ—΄μ—μ„œ 숫자 μΆ”μΆœ +3. μ‰Όν‘œ(,) λ˜λŠ” 콜둠(:) κ΅¬λΆ„μž 처리 +4. μ»€μŠ€ν…€ κ΅¬λΆ„μž 처리 (예: //;\n1;2;3) +5. 잘λͺ»λœ μž…λ ₯ μ‹œ [ERROR] 좜λ ₯ +6. 합계 계산 및 κ²°κ³Ό 좜λ ₯ diff --git a/src/App.js b/src/App.js new file mode 100644 index 0000000..928d927 --- /dev/null +++ b/src/App.js @@ -0,0 +1,16 @@ +import Calculator from "./Calculator.js"; + +class App { + run() { + const input = prompt("λ§μ…ˆν•  λ¬Έμžμ—΄μ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”."); // μ‚¬μš©μž μž…λ ₯ + try { + const result = Calculator.add(input); + console.log(`κ²°κ³Ό : ${result}`); + } catch (error) { + console.error("[ERROR]", error.message); + } + } +} + +const app = new App(); +app.run(); diff --git a/src/Calculator.js b/src/Calculator.js new file mode 100644 index 0000000..6988549 --- /dev/null +++ b/src/Calculator.js @@ -0,0 +1,15 @@ +import Parser from "./Parser.js"; +import Validator from "./Validator.js"; + +class Calculator { + static add(input) { + if (!input) return 0; + + const numbers = Parser.parse(input); + Validator.check(numbers); + + return numbers.reduce((acc, cur) => acc + cur, 0); + } +} + +export default Calculator; diff --git a/src/Parser.js b/src/Parser.js new file mode 100644 index 0000000..a9d505b --- /dev/null +++ b/src/Parser.js @@ -0,0 +1,15 @@ +class Parser { + static parse(text) { + // μ»€μŠ€ν…€ κ΅¬λΆ„μž νŒ¨ν„΄ 확인: //;\n1;2;3 + const customDelimiterMatch = text.match(/^\/\/(.)\\n(.*)$/); + if (customDelimiterMatch) { + const [, delimiter, numbers] = customDelimiterMatch; + return numbers.split(delimiter).map(Number); + } + + // κΈ°λ³Έ κ΅¬λΆ„μž(, :) 처리 + return text.split(/,|:/).map(Number); + } +} + +export default Parser; diff --git a/src/Validator.js b/src/Validator.js new file mode 100644 index 0000000..4edb2bc --- /dev/null +++ b/src/Validator.js @@ -0,0 +1,14 @@ +class Validator { + static check(numbers) { + numbers.forEach((num) => { + if (isNaN(num)) { + throw new Error("μˆ«μžκ°€ μ•„λ‹Œ 값이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€."); + } + if (num < 0) { + throw new Error("μŒμˆ˜λŠ” μž…λ ₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€."); + } + }); + } +} + +export default Validator; diff --git a/src/js/index.js b/src/js/index.js index e69de29..248cd3c 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -0,0 +1,36 @@ +const DEFAULT_DELIMITERS = [",", ":"]; + +function calculate(input) { + if (!input) return 0; + + const { delimiters, numbersString } = extractDelimiter(input); + const numbers = splitAndConvert(numbersString, delimiters); + validate(numbers); + + return numbers.reduce((sum, num) => sum + num, 0); +} + +function extractDelimiter(input) { + const customDelimiterPattern = /^\/\/(.)\n(.*)$/; + const match = input.match(customDelimiterPattern); + + if (match) { + return { delimiters: [match[1]], numbersString: match[2] }; + } + + return { delimiters: DEFAULT_DELIMITERS, numbersString: input }; +} + +function splitAndConvert(str, delimiters) { + const regex = new RegExp(`[${delimiters.join("")}]`); + return str.split(regex).map(Number); +} + +function validate(numbers) { + numbers.forEach((n) => { + if (isNaN(n)) throw new Error("[ERROR] μˆ«μžκ°€ μ•„λ‹Œ 값이 μžˆμŠ΅λ‹ˆλ‹€."); + if (n < 0) throw new Error("[ERROR] μŒμˆ˜λŠ” μž…λ ₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€."); + }); +} + +export default calculate;