공log/[P&B]

[P&B] #22 PreCodingTest

ming_OoO 2023. 8. 9. 19:19
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);
    }
}

 

문제 풀이 코멘트

위의 코드를 풀이하자면 다음과 같다. 

  1. ArrayList<String> numbers: 숫자를 저장하는 리스트다. 주어진 문자열 S에서 숫자만 추출하여 리스트로 저장한다.
  2. S = S.replaceAll("[0-9]", "");: 문자열 S에서 숫자를 제외한 모든 문자를 제거한다.
  3. ArrayList<String> operate: 연산자를 저장하는 리스트다. 숫자를 제외한 나머지 문자열을 리스트로 저장한다.
  4. while문으로 숫자가 하나 남을 때 까지 연산자 우선 순위를 고려하여 계산을 수행하는 것을 반복한다.  * 나 / 연산자가 존재하면 그 중 먼저 나오는 연산자를 찾아 operation 함수를 호출하여 계산한다. 그렇지 않으면 + 나 - 연산자를 찾아 계산한다.
  5. 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