Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[문자열 덧셈 계산기] 김지원 미션 제출합니다. #140

Open
wants to merge 16 commits into
base: main
Choose a base branch
from

Conversation

kimgwon
Copy link

@kimgwon kimgwon commented Oct 21, 2024

✏️ main

  • 결과 출력 : caculator를 통해 구한 값을 "결과: ${result}" 형태로 출력한다.

✏️ calculator

입력 기능 - setInput()

  • 변수 선언 : 사용자 입력을 받을 input: String을 선언한다.
  • 입력 설명 : 사용자 입력을 받기 전 "덧셈할 문자열을 입력해주세요." 문구를 출력한다.
  • 입력 받기 : camp.nextstep.edu.missionutils.ConsolereadLine()을 이용하여 입력받는다.

합 구하기 - getSum()

  • separator를 통해 구분된 값을 합한 후, 반환한다.

✏️ separator

변수 선언

  • separates : 기본 구분자(,, :)가 담겨있는 변경 가능한 리스트
  • customSeparates : 커스텀 구분자를 구분하는 구분자(//, \n)가 담겨있는 변수
  • startIndex, endIndex : 커스텀 구분자가 있는 경우 그 구간을 알기 위해 선언한 변수. startIndex는 \의 인덱스, endIndex는 \n의 인덱스가 되어야 한다.
  • result : 구분된 결과를 담기 위한 변경 가능한 리스트

빈 값 처리 1 - run()

  • 입력 값이 비어있다면 0을 반환한다.
  • 비어있지 않다면 getCustomSeparate()을 통해 커스텀 구분자를 추출한다.

커스텀 구분자 추출 - getCustomSeparate()

  • //로 시작하지 않는다면 커스텀 생성자가 없는 것이므로 반환한다.
  • //로 시작한다면 \n의 인덱스를 찾는다. -> 커스텀 생성자가 있어야 한다.
  • \n이 없다면 오류를 발생시킨다. -> 잘못된 입력이다.
  • \n이 있다면 separates에 추가한다.

빈 값 처리 2 - run()

  • 커스텀 구분자만 있다면 0을 반환한다.

구분하고 result에 추가하기

  • \n 이후 부터 문자열의 끝까지, split()을 통해 구분한다.
  • 구분된 값이 하나라도 숫자가 아니라면 오류를 발생시킨다. -> 잘못된 입력이다.

반환하기

  • 구분되고 숫자로 변경 된 리스트를 반환한다.

Write these:
- fun calculator
- fun separator
- fun customSeparator
- fun init
- fun getSum
- Create Separator class for separating data
- Declared two variables:
  1. separates
  2. customSeparates
Added function getCustomSeparates
- If input includes custom separators (// and \n), extracts characters between them.
- Required to correctly parse and handle input strings with custom separators.
if input is empty or " " return 0
if input include only custom separates return 0
Added splitting input with separates(included custom separates)
- Convert split result to Int if it is number
- Throw exception if the split result is not number
- Renamed function `init` to `setInput` to better reflect its purpose
- The function sets the value of the `input` variable
- Calculate the sum of the separated values using the separator
- Return calculated sum
- Print calculator sum result
- Changed variable access to private to encapsulate data
- Added comments to clarify purpose of functions
- The original condition was require(endIndex == 1), which was incorrect
- Changed the condition to require(endIndex != -1) to handle input separators correctly
- input can contain custom separators between // and \n
- Added substring logic to skip custom separators and split only the relevant part of the input
- Changed variable access to private to encapsulate data
Comment on lines +4 to +5
private val separates: MutableList<Char> = mutableListOf(',', ':')
private val customSeparates = Pair("//", "\\n")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

',', ':'"//", "\\n"

요 아이들은 상수로 관리하는게 가독성에 더 좋다고 생각해요 !


startIndex = customSeparates.first.length
endIndex = input.indexOf(customSeparates.second)
require(endIndex != -1) {"커스텀 구분자를 이용하려면 //, \\n 사이에 작성하세요."}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

require를 사용하는건 생각 못했네요 ! 하나 배웠습니다 :)

Comment on lines +30 to +35
item.toIntOrNull()?.let {
result.add(it)
} ?: run {
throw IllegalArgumentException("구분된 ${item}은 숫자가 아닙니다.")
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

대박 toIntOrNull을 요런식으로도 활용할 수 도 있군요 ! 좋은 활용법 배워갑니다 !

startIndex = customSeparates.first.length
endIndex = input.indexOf(customSeparates.second)
require(endIndex != -1) {"커스텀 구분자를 이용하려면 //, \\n 사이에 작성하세요."}
separates.addAll(input.substring(startIndex, endIndex).toList())

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 잘못 이해한걸 수 도 있어서 조심스럽게 말씀드리자면
저는 기본 구분자로 ',', ':' 요 아이들을 사용해서 숫자를 분리하는 케이스 하나와
커스텀 구분자로 숫자를 분리하는 케이스 두 케이스로 분리해서 코드를 작성했는데

제가 작성하신 코드를 이해한바로는 기본 구분자 + 커스텀 구분자로 구분한다고 이해했는데 요게 맞을까용 ,,?


class Separator {
private val separates: MutableList<Char> = mutableListOf(',', ':')
private val customSeparates = Pair("//", "\\n")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개인적으로 요 아이들은 "커스텀 구분자를 입력하기 위한 접두어/접미어" 로 생각을해서
customSeparates 즉, "커스텀 구분자들" 이란 이름과는 조금 맞지 않다는 생각을 했어요!

Copy link

@chanho0908 chanho0908 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

함수 활용이 참 좋으신 것 같아요 리뷰 남겨주셔서 감사합니다 :)

Copy link

@moondev03 moondev03 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

늦었지만 맞리뷰하러 왔습니다!

현재 한 함수에 여러 로직이 함께 수행되다 보니, 함수의 목적을 한눈에 파악하기 어렵고, 테스트 코드 작성 시에도 어려움이 있을 것 같습니다. 그래서, 함수의 기능을 더 세분화하는 것이 좋을 것 같다는 의견 드립니다!

2주차 미션도 화이팅입니다! 🫡

Comment on lines +20 to +35
// 구분자를 통해 구분하는 함수
fun run(input: String): List<Int> {
if (input.isBlank()) return listOf(0)

if (input.startsWith(customSeparates.first)) {
getCustomSeparate(input)
if (endIndex+customSeparates.second.length == input.length) return listOf(0)
}

input.substring(endIndex + customSeparates.second.length).split(*separates.toCharArray()).forEach { item ->
item.toIntOrNull()?.let {
result.add(it)
} ?: run {
throw IllegalArgumentException("구분된 ${item}은 숫자가 아닙니다.")
}
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 함수의 이름을 run에서 extractNumbersparseNumbers로 변경하면, 함수의 목적을 더 명확하게 나타낼 수 있을 것 같아요!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants