덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요.
public String solution(String polynomial) {
String answer;
int variable = 0;
int constant = 0;
String[] polyArray = polynomial.split(" ");
for (int i = 0; i < polyArray.length; i++) {
if (polyArray[i].contains("x")) {
if (polyArray[i].equals("x")) {
variable++;
} else {
variable += Integer.parseInt(polyArray[i].replaceAll("x", ""));
}
} else {
constant += Integer.parseInt(polyArray[i]);
}
}
if (variable == 0) {
answer = String.valueOf(constant);
} else if (variable == 1) {
answer = "x + " + constant;
} else if (constant == 0) {
answer = variable + "x";
} else {
answer = variable + "x + " + constant;
}
return answer;
}
이렇게 작성 후 실행해봤더니 에러가 발생했다.
알고보니 매개변수로 들어오는 polynomial이 "3x + 7 + x" 이런 식으로 돼있어서 내가 실수로
생각으로는 배열이 {"3x", "7", "x"} 이처럼 되도록 원한게
{"3x", "+", "7", "+", "x"} 이렇게 돼서 "+"를 정수로 변환할 수 없어 발생한 에러였다.
그래서 정규식을 수정하였다.
String[] polyArray = polynomial.split("\\s*\\+\\s*");
사용한 정규식 설명
\\s*
: 0개 이상의 공백 문자를 표현하는 특수한 정규식 패턴. *는 바로 앞의 패턴이 0번 이상 반복될 수 있음을 의미한다.
\\+
: 이 부분은 "+" 문자를 정규식으로 표현한 것.
따라서 정규식 "\\s*\\+\\s*"
은 공백과 "+" 문자가 함께 나오는 경우를 검색하는데 사용된다.
예를 들어 "3x + 7 + x"와 같은 문자열에서 "+" 앞뒤에 공백이 있거나 없는 모든 경우를 검색하여 항을 분리한다.
수정 후 실행해봤는데
테스트 케이스 10번에서 실패가 떠버렸다.
아무래도 answer
를 정하는 if문에서 놓친 부분이 있겠구나 싶어서 고민해보니
매개변수로 "x" 이렇게만 들어왔을 때가 문제였다...
if (polynomial.equals("x")) {
answer = "x";
} else if (variable == 0) {
answer = String.valueOf(constant);
} else if (variable == 1) {
answer = "x + " + constant;
} else if (constant == 0) {
answer = variable + "x";
} else {
answer = variable + "x + " + constant;
}
내 나름대로 수정해서 성공은 했지만 보기가 좋아보이지 않아서 코드를 다듬기로 했다.
// 변수의 계수를 우선적으로 정한 뒤 정수 유무에 따라서 정함
if (variable == 0) { // 변수의 계수가 0일 때
answer = String.valueOf(constant); // 정수만 반환
} else if (variable == 1) { // 변수의 계수가 1일 때
answer = "x"; // 변수의 계수를 생략
if (constant != 0) { // 근데 그와중에 정수가 0이 아니면
answer += " + " + constant; // 변수에 계수 생략한거에 정수를 붙임
}
} else { // 그 외에는
answer = variable + "x"; // 변수의 계수를 정하고
if (constant != 0) { // 정수가 0이 아니면
answer += " + " + constant; // 변수 뒤에 정수를 더함
}
}