https://school.programmers.co.kr/learn/courses/30/lessons/120863
한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial
이 매개변수로 주어질 때, 동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return 합니다.
0 < polynomial에 있는 수 < 100
polynomial에 변수는 'x'만 존재합니다.
polynomial은 0부터 9까지의 정수, 공백, ‘x’, ‘+'로 이루어져 있습니다.
항과 연산기호 사이에는 항상 공백이 존재합니다.
공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.
하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.
" + 3xx + + x7 + "와 같은 잘못된 입력은 주어지지 않습니다.
"012x + 001"처럼 0을 제외하고는 0으로 시작하는 수는 없습니다.
문자와 숫자 사이의 곱하기는 생략합니다.
polynomial에는 일차 항과 상수항만 존재합니다.
계수 1은 생략합니다.
결괏값에 상수항은 마지막에 둡니다.
0 < polynomial의 길이 < 50
polynomial | result |
---|---|
"3x + 7 + x" | "4x + 7" |
"x + x + x" | "3x" |
"3x + 7 + x"에서 동류항끼리 더하면 "4x + 7"입니다.
"x + x + x"에서 동류항끼리 더하면 "3x"입니다.
class Solution {
public String solution(String polynomial) {
String answer = "";
String[] eachHang=polynomial.split(" ");
int number=0;
int xnumber=0;
String temp="";
boolean isRoop=true;
for(int i=0;i<eachHang.length;i++){
if(isNumber(eachHang[i])){//숫자
number=number+Integer.valueOf(eachHang[i]);
}
else if(eachHang[i].length()==1){ //숫자가 아님, 그냥 계수가 1임 또는 + 연산자
if(eachHang[i].equals("x")){
xnumber=xnumber+1;
}
else if(eachHang[i].equals("+")){
continue;
}
}
else{//4x, 3x같은거
int count=0;
while(isRoop){
if(eachHang[i].charAt(count)=='x'){
temp=eachHang[i].replace("x","");
xnumber=xnumber+Integer.valueOf(temp);
break;
}
count++;
}
}
}
if(number==0){
if(xnumber==1){
answer="x";
}
else{
answer=String.valueOf(xnumber)+"x";
}
}
else if(xnumber==0){
answer=String.valueOf(number);
}
else{
if(xnumber==1){
answer="x + "+String.valueOf(number);
}
else{
answer=String.valueOf(xnumber)+"x + "+String.valueOf(number);
}
}
return answer;
}
public static boolean isNumber(String s){
try{
Integer.valueOf(s);
return true;
}
catch(NumberFormatException e){
return false;
}
}
}
조금 걸렸다!
isNumber
메소드를 만들어 숫자이면 true를 반환하고 숫자가 아니면 false를 반환한다.
각각의 항을 eachHang
배열에 넣어서 공백으로 구분했다.(""이라 해서 결과가 이상했다)
만약 숫자가 아니고, 문자열 길이가 1이면 x
아니면 +
이다.
만약 x라면 xnumber
(x항의 계수 저장하는 거)에 1을 더해주고,
+라면 그냥 다음 반복문으로 넘어간다.
이제 이게 처리가 어려웠다. 만약, 숫자도 아니고 x도 아니고 +도 아니면
35x
와 같은 식이 되는 것이다. (7x같은 한자리 계수만 생각해서 틀렸다)
while문을 사용했다. 문자열에서 x를 만날 때 까지 반복문을 돌리고,
만약 문자열이 x를 만나면 문자열에서 x를 없앤 그 수만 xnumber에 저장한다. (여기서 isRoop를 false로 줘서 그다음에 또 x항 계수가 나왔을 때 저장이 안돼서 값이 이상했다.)
그리고 마지막으로, x만 출력될 때는 계수 1은 생략해야 한다.
(이것도 안해줬다..)
이걸 다 만족하면.. 해결된다.