[Programmers] Lv0 다항식 더하기 Java

2023. 1. 30. 11:16CS/자료구조 & 알고리즘

728x90

문제 출처

[프로그래머스 코딩 테스트 연습]

https://school.programmers.co.kr/learn/courses/30/lessons/120863

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

  • 다항식을 분리하는데 StringTokenizer을 사용하였다.
  • StringTokenizer은 정규식을 사용하기 때문에 split보다 성능이 좋다고 한다.
  • 또한 split은 배열을 만들지만 이 문제의 경우에는 한 번만 접근하면 되기 때문에 StringTokenizer을 이용하였다.
  • 다항식 x + x + x 같은 경우처럼 x 가 많은 경우 문자열 변경이 일어나지만 하나의 케이스로 따졌을 때 많지는 않다고 판단하여 String을 사용하였다.
  • ‘x’가 있을 경우 해당 문자를 까지 자르고 “1x” 또한 처리 했다.
  • 처리된 숫자들은 polynomialIntArr에 담겨서 각각의 자리에 맞게 더해진다.
  • 표기할 때도 x항 + 상수항으로 나누어지고 이렇게 표시하려면 빈번한 문자열이 변경이 돼서 StringBuilder을 사용하였다.
  • 아래 표는 아래 코드에서 반복문에 Token을 받을 때 StringBuilder와 String을 사용했을 시 프로그래머스 결과를 비교한 것이다.
    • 비교했을 때 String을 사용했을 때가 12개중 7개가 더 빨랐다.
    • 또한 StringBuilder을 사용했을때 26.10ms vs 13.09ms 즉 약 2배 정도 차이 나는 경우도 있었다.
    • 프로그래머스 테스트 데이터가 정확하게 뭔지는 모르겠지만 같은 케이스에서 2배 정도 차이 나는 게 있는 것으로 보아 문자열 변경이 많지 않은 경우에는 StringBuilder 보다 String을 사용하는 것이 좋을 거 같다.
  반복문 StringBuilder 사용시 반복문 String 사용시 속도 빠른 경우
테스트 1 16.35ms, 82.1MB 13.17ms, 80.7MB x1.24 String 
테스트 2 26.10ms, 80.4MB 13.09ms, 81.1MB x1.99 String 
테스트 3 8.98ms, 77.8MB 7.50ms, 73.3MB x1.19 String 
테스트 4 11.76ms, 67.8MB 13.30ms, 75.9MB x1.13 StringBuilder
테스트 5 11.49ms, 84.1MB 10.91ms, 75MB x1.05 String
테스트 6 11.26ms, 75.2MB 13.57ms, 74.2MB x1.20 StringBuilder
테스트 7 22.51ms, 87.3MB 12.47ms, 68MB x1.80 String
테스트 8 11.44ms, 77.7MB 12.74ms, 92MB x1.11 StringBuilder
테스트 9 11.04ms, 72.5MB 13.15ms, 93.7MB x1.10 StringBuilder
테스트 10 0.10ms, 78.4MB 0.08ms, 72.5MB x1.25 String
테스트 11 6.95ms, 78.9MB 6.82ms, 78.4MB x1.02 String
테스트 12
8.76ms, 67.2MB 11.10ms, 73.5MB x1.27 StringBuilder

 

소스 코드

import java.util.StringTokenizer;

public class Solution {

    public String solution(String polynomial) {
        StringTokenizer stk = new StringTokenizer(polynomial, " +");

        int[] polynomialIntArr = {0, 0};

        while(stk.hasMoreTokens()) {
            String target = stk.nextToken();
            if (target.charAt(target.length()-1) == 'x') {
                String add = target.substring(0, target.length() - 1).toString();
                polynomialIntArr[0] += add.length() == 0 ? 1 : Integer.parseInt(add);
            }
            else
                polynomialIntArr[1] += Integer.parseInt(target.toString());
        }

        StringBuilder result = new StringBuilder();
        if (polynomialIntArr[0] > 0)
            result.append(polynomialIntArr[0] == 1 ? "x" : polynomialIntArr[0] + "x");
        if (polynomialIntArr[1] > 0)
            result.append((polynomialIntArr[0] != 0 ? " + " : "") + polynomialIntArr[1]);
        else if (polynomialIntArr[0] == 0 && polynomialIntArr[1] == 0)
            result.append(0);

        return result.toString();
    }
}
728x90