[Programmers] Lv0 다항식 더하기 Java
2023. 1. 30. 11:16ㆍCS/자료구조 & 알고리즘
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
'CS > 자료구조 & 알고리즘' 카테고리의 다른 글
[Programmers] Lv0 특이한 정렬 Java (0) | 2023.02.01 |
---|---|
[Programmers] Lv0 저주의 숫자 3 Java (0) | 2023.01.31 |
[Programmers] Lv0 최빈값 구하기 Java (0) | 2023.01.29 |
[Programmers] Lv0 분수의 덧셈 Java (0) | 2023.01.28 |
[Programmers] Lv0 안전지대 Java (0) | 2023.01.27 |