From fab295a842fd5c41df18ab1c84d55797049bf88b Mon Sep 17 00:00:00 2001 From: yuni Date: Thu, 6 Feb 2025 20:38:29 +0900 Subject: [PATCH 1/5] Update README.md --- README.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 13420b2..6740401 100644 --- a/README.md +++ b/README.md @@ -1 +1,21 @@ -# javascript-calculator-precourse \ No newline at end of file +# javascript-calculator-precourse + +기능목록 + +1. 문자열 분리 및 합산 기능 + - 입력된 문자열에서 숫자를 추출한다. + - 숫자들을 합산하여 반환한다. + +2. 커스텀 구분자 처리 기능 + - 기본 구분자 외에 커스텀 구분자를 입력받는다. (//과 \n사이에 있으면 커스텀 구분자로 인식) + - 숫자들을 합산하여 반환한다. + +3. 잘못된 입력 처리 기능 + - 구분자가 두 번 연속으로 들어있는 경우 + - 커스텀 구분자 지정이 잘못된 경우 + - 구분자와 숫자 사이에 공백이 있는 경우 + - 숫자가 아닌 값이 포함된 경우 + -> IllegalArgumentException 발생, 애플리케이션 종료 + +4. 빈 문자열 처리 기능 + - 빈 문자열 입력시 0을 반환한다. \ No newline at end of file From 5def45ba7b7810ee9973315e455c7bc7a39c8213 Mon Sep 17 00:00:00 2001 From: yuni Date: Fri, 7 Feb 2025 11:37:07 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EC=9E=85=EC=B6=9C=EB=A0=A5=20=EB=B0=8F=20=EC=88=AB=EC=9E=90=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/App.js b/src/App.js index 091aa0a..27c75da 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,28 @@ +import { Console } from "@woowacourse/mission-utils"; + +class StringCalculator { + static add(numbers) { + const delimiters = [',', ':']; // 기본 구분자 설정 + + let numArray = [numbers]; + for (const delimiter of delimiters) { + let tempArray = []; + for (const number of numArray) { + tempArray = tempArray.concat(number.split(delimiter)); // 구분자로 분리 + } + numArray = tempArray; + } + + return numArray; + } +} + class App { - async run() {} + async run() { + const input = await Console.readLineAsync('입력: '); + const result = StringCalculator.add(input); + Console.print(`결과 : ${result}`); + } } -export default App; +export default App; \ No newline at end of file From 08cf0e28c6eda1098170cb5e699c12db7fa3386d Mon Sep 17 00:00:00 2001 From: yuni Date: Fri, 7 Feb 2025 11:44:17 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20=EC=88=AB=EC=9E=90=20=ED=95=A9?= =?UTF-8?q?=EC=82=B0=20=EB=B0=8F=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/App.js b/src/App.js index 27c75da..00eda49 100644 --- a/src/App.js +++ b/src/App.js @@ -12,8 +12,12 @@ class StringCalculator { } numArray = tempArray; } + numArray = numArray.map(num => { + const numValue = Number(num); // 숫자로 변환 + return numValue; + }); - return numArray; + return numArray.reduce((sum, num) => sum + num, 0); // 합산하여 반환 } } From 1776edd5a818a516a7a25aaa14d4b3f5245b05c3 Mon Sep 17 00:00:00 2001 From: yuni Date: Fri, 7 Feb 2025 12:32:33 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=EC=BB=A4=EC=8A=A4=ED=85=80=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=EC=9E=90=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/App.js b/src/App.js index 00eda49..fddb777 100644 --- a/src/App.js +++ b/src/App.js @@ -2,9 +2,10 @@ import { Console } from "@woowacourse/mission-utils"; class StringCalculator { static add(numbers) { - const delimiters = [',', ':']; // 기본 구분자 설정 + const { customDelimiter, input } = this.extractCustomDelimiter(numbers); + const delimiters = [',', ':', customDelimiter].filter(Boolean); // customDelimiter = null이면 delimiters에 포함되지 않음 - let numArray = [numbers]; + let numArray = [input]; for (const delimiter of delimiters) { let tempArray = []; for (const number of numArray) { @@ -19,6 +20,18 @@ class StringCalculator { return numArray.reduce((sum, num) => sum + num, 0); // 합산하여 반환 } + + static extractCustomDelimiter(numbers) { + if (numbers.startsWith('//')) { // startsWith : 문자열이 //로 시작하는지 확인 + const linebreakIndex = numbers.indexOf('\\n'); // indexOf : 찾은 문자 위치 반환, 찾지 못하면 -1 반환 + if (linebreakIndex !== -1) { + const customDelimiter = numbers.slice(2, linebreakIndex); + const input = numbers.slice(linebreakIndex + 2); // 커스텀 지정자 뒤부터 자르기 + return { customDelimiter, input }; + } + } + return {customDelimiter: null, input: numbers }; // 예외처리 : 커스텀이 없는 경우 + } } class App { From a913b86b1525a15300113011db0d17ff03e590b4 Mon Sep 17 00:00:00 2001 From: yuni Date: Fri, 7 Feb 2025 14:53:11 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/App.js b/src/App.js index fddb777..ed2d974 100644 --- a/src/App.js +++ b/src/App.js @@ -13,19 +13,25 @@ class StringCalculator { } numArray = tempArray; } - numArray = numArray.map(num => { - const numValue = Number(num); // 숫자로 변환 - return numValue; - }); - return numArray.reduce((sum, num) => sum + num, 0); // 합산하여 반환 + numArray = numArray + .filter(num => num.trim() !== "") // 구분자와 숫자 사이에 공백이 있는 경우 처리 + .map(num => { + const numValue = Number(num); + if (isNaN(numValue) || numValue < 0) { + throw new Error ("[ERROR] IllegalArgumentException"); //양수만 입력 가능 + } + return numValue; + }); + + return numArray.reduce((sum, num) => sum + num, 0); // 합산하여 반환, 초기값 0이므로 빈 문자열이 들어가면 0 반환 } static extractCustomDelimiter(numbers) { if (numbers.startsWith('//')) { // startsWith : 문자열이 //로 시작하는지 확인 const linebreakIndex = numbers.indexOf('\\n'); // indexOf : 찾은 문자 위치 반환, 찾지 못하면 -1 반환 if (linebreakIndex !== -1) { - const customDelimiter = numbers.slice(2, linebreakIndex); + const customDelimiter = numbers.slice(2, linebreakIndex); // 구분자가 두 번 연속으로 들어있는 경우 처리 const input = numbers.slice(linebreakIndex + 2); // 커스텀 지정자 뒤부터 자르기 return { customDelimiter, input }; } @@ -36,9 +42,14 @@ class StringCalculator { class App { async run() { - const input = await Console.readLineAsync('입력: '); - const result = StringCalculator.add(input); - Console.print(`결과 : ${result}`); + try { + const input = await Console.readLineAsync('입력: '); + const result = StringCalculator.add(input); + Console.print(`결과 : ${result}`); + } catch(error) { + Console.print(error.message); + return Promise.reject(error); + } } }