classSolution{
publiclongsolution(int price, int money, int count){
long answer = 0;
long s = 0;
for (int i = 1; i <= count; i++){
s += price * i;
}
if (money - s > 0){
return0;
} else {
answer = (money - s) * -1;
return answer;
}
}
}
문자열 다루기 기본
숫자로만 이루어졌는지 확인하는 함수 : "asdfs".isdigit()
문자로만 이루어졌는지 확인하는 함수 : "234".isalpha(), Character.isDigit(s.charAt(i))
n = int(input())
number_list = []
for _ inrange(n):
k = int(input())
number_list.append(k)
f = {} #최빈값을 저장할 딕셔너리for n in number_list:
if n in f: #키값이 이미 딕셔너리에 존재한다면, 기존에 있는 거에서 1증가
f[n] += 1else:
f[n] = 1
max_count = max(f.values()) #가장 많이 나온 빈도수
modes = []
m_result = 0for key, value in f.items():
if value == max_count:
modes.append(key)
iflen(modes) == 1:
m_result = modes[0]
else:
modes.sort()
m_result = modes[1]
avg = round(sum(number_list) / len(number_list))
number_list.sort()
median = number_list[len(number_list) // 2]
number_range = max(number_list) - min(number_list)
print(avg)
print(median)
print(m_result)
print(number_range)
이런식으로 Enum 클래스에 연산자만 선언해서 계산기 클래스 내부에서 해당 연산자값을 비교해오는 방식으로 사용했었는데, 아무리 생각해봐도 뭔가 연산자만 비교하기에는 아쉬운 것 같다는 생각이 들었다. 연산자 char 값만 비교하기에는 너무 메모리상으로도 낭비같고 차라리 계산기 클래스 내부에서 static final로 상수를 선언하면 되지 않나 싶었다.
그래서 연산자 값 뿐만 아니라 차라리 메서드를 Enum 클래스에서 따로 구현해서 수행하는 편이 훨씬 의미가 있을 거라는 생각이 들었다. 나중에 더하기 로직을 내부적으로 +10 씩 더한다거나 등등 유지보수성과 명확성을 위해서는 훨씬 유용할 것 같다는 생각이 들어서 수정하게 되었다
수정된 OperatorType
calculate 메서드를 추상 메서드로 선언 후 각각의 연산자 타입에서 오버라이딩 하여 다르게 구현
package com.example.calculator3;
import com.example.common.exception.DivideByZeroException;
// 연산자 및 해당 연산자에 해당하는 연산메서드를 선언한 enum classpublicenumOperatorType{
PLUS("+") {
@Overridepublic <T extends Number> doublecalculate(T firstInput, T secondInput){
return firstInput.doubleValue() + secondInput.doubleValue();
}
},
MINUS("-") {
@Overridepublic <T extends Number> doublecalculate(T firstInput, T secondInput){
return firstInput.doubleValue() - secondInput.doubleValue();
}
},
MULTIPLY("*") {
@Overridepublic <T extends Number> doublecalculate(T firstInput, T secondInput){
return firstInput.doubleValue() * secondInput.doubleValue();
}
},
DIVIDE("/") {
@Overridepublic <T extends Number> doublecalculate(T firstInput, T secondInput)throws DivideByZeroException {
if (secondInput.doubleValue() == 0) {
thrownew DivideByZeroException();
}
return firstInput.doubleValue() / secondInput.doubleValue();
}
};
privatefinal String operator;
OperatorType(String operator) {
this.operator = operator;
}
//계산을 수행하는 메서드를 추상메서드로 선언하여 각각의 연산자 객체가 오버라이딩하여 구현publicabstract <T extends Number> doublecalculate(T firstInput, T secondInput)throws DivideByZeroException;
}