728x90
프리코딩테스트 2-3
3) 4 Rule 사칙연산
오답 노트 코드
class Solution {
static double solution(String S) {
ArrayList<String> numbers = new ArrayList<>(Arrays.asList(S.split("[^0-9]")));
S = S.replaceAll("[0-9]", "");
ArrayList<String> operate = new ArrayList<>(Arrays.asList(S.split("")));
while (numbers.size() > 1) {
if (operate.contains("*") || operate.contains("/")) {
if (operate.indexOf("*") < operate.indexOf("/") && operate.contains("*") || !operate.contains("/")) {
operation(numbers, operate, "*");
} else if (operate.indexOf("*") > operate.indexOf("/") && operate.contains("/") || !operate.contains("*")) {
operation(numbers, operate, "/");
}
} else {
if (operate.indexOf("+") < operate.indexOf("-") && operate.contains("+") || !operate.contains("-")) {
operation(numbers, operate, "+");
} else if (operate.indexOf("+") > operate.indexOf("-") && operate.contains("-") || !operate.contains("+")) {
operation(numbers, operate, "-");
}
}
}
String num = String.format("%.2f", Double.parseDouble(numbers.get(0)));
return Double.parseDouble(num);
}
static void operation(ArrayList<String> numbers, ArrayList<String> operate, String oper) {
int idx = operate.indexOf(oper);
double n1 = Double.parseDouble(numbers.get(idx));
double n2 = Double.parseDouble(numbers.get(idx + 1));
switch (oper) {
case "*": n1 *= n2; break;
case "/": n1 /= n2; break;
case "+": n1 += n2; break;
case "-": n1 -= n2; break;
}
numbers.set(idx, (Double.toString(n1)));
numbers.remove(idx + 1);
operate.remove(idx);
}
}
문제 풀이 코멘트
위의 코드를 풀이하자면 다음과 같다.
- ArrayList<String> numbers: 숫자를 저장하는 리스트다. 주어진 문자열 S에서 숫자만 추출하여 리스트로 저장한다.
- S = S.replaceAll("[0-9]", "");: 문자열 S에서 숫자를 제외한 모든 문자를 제거한다.
- ArrayList<String> operate: 연산자를 저장하는 리스트다. 숫자를 제외한 나머지 문자열을 리스트로 저장한다.
- while문으로 숫자가 하나 남을 때 까지 연산자 우선 순위를 고려하여 계산을 수행하는 것을 반복한다. * 나 / 연산자가 존재하면 그 중 먼저 나오는 연산자를 찾아 operation 함수를 호출하여 계산한다. 그렇지 않으면 + 나 - 연산자를 찾아 계산한다.
- operation 함수: 연산을 수행하는 메서드다. numbers 리스트에서 해당 연산자의 위치(idx)를 찾아서 인덱스 idx와 idx+1 위치의 숫자를 가져온다. 해당 연산자에 따라 계산을 수행하고, 결과를 리스트에 업데이트하고 필요한 요소들을 리스트에서 제거한다.
수식을 순서대로 계산하되, 연산자 우선순위를 고려하여 계산을 수행하는 함수를 만들기가 어려웠다.
728x90
'공log > [P&B]' 카테고리의 다른 글
[P&B] #24 PreCodingTest (0) | 2023.08.11 |
---|---|
[P&B] #23 PreCodingTest (0) | 2023.08.10 |
[P&B] #21 PreCodingTest (0) | 2023.08.08 |
[P&B] #20 PreCodingTest (0) | 2023.08.07 |
[P&B] #19 PreCodingTest (0) | 2023.08.06 |