[프로그래머스 120863] Java - 코딩테스트 입문 / 다항식 더하기
- -
다항식 더하기
https://school.programmers.co.kr/learn/courses/30/lessons/120861
1) 문제
다항식을 계산할 때는 동류항끼리 계산해 정리합니다.
덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때,
동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요.
같은 식이라면 가장 짧은 수식을 return 합니다.
0 < polynomial에 있는 수 < 100
polynomial에 변수는 'x'만 존재합니다.
polynomial은 양의 정수, 공백, ‘x’, ‘+'로 이루어져 있습니다.
항과 연산기호 사이에는 항상 공백이 존재합니다.
공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.
하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.
" + 3xx + + x7 + "와 같은 잘못된 입력은 주어지지 않습니다.
0으로 시작하는 수는 없습니다.
문자와 숫자 사이의 곱하기는 생략합니다.
polynomial에는 일차 항과 상수항만 존재합니다.
계수 1은 생략합니다.
결괏값에 상수항은 마지막에 둡니다.
0 < polynomial의 길이 < 50
2) 예시
polynomial | result |
---|---|
"3x + 7 + x" | "4x + 7" |
"x + x + x" | "3x" |
입출력 예 #1
"3x + 7 + x"에서 동류항끼리 더하면 "4x + 7"입니다.
입출력 예 #2
"x + x + x"에서 동류항끼리 더하면 "3x"입니다.
3) 풀이
1. 클래스 선언을 해줍니다
● class Solution {
클래스명은 대문자로 시작해야하고, 정답이라는 의미로 Solution이라는 단어를 사용하였습니다.
2. 문자열 polynomial을 매개변수로 하는 solution 메소드를 선언합니다.
solution은 문자열을 반환하므로 데이터타입을 으로 합니다.
*polynomial : 다항식
● public String solution(String polynomial) {
3. 정답이 될 문자열 answer를 빈문자열로 생성합니다.
먼저, 문자열배열 part를 생성합니다. polynomial 문자열을 " " 공백을 기준으로 분할하여 생성합니다.
상수의 값을 cons, x의 계수를 xcoef로 정의하고 생성해줍니다.
● String answer = "";
String[] part = polynomial.split(" ");
int cons = 0;
int xcoef =0;
4. for문을 통해 part문자열 배열을 순회합니다.
1) +가 있다면 continue해서 지나갑니다.
2) x가 있다면 (즉, 1x가 있다면) xcoef값을 1 증가시키고 계속 continue합니다.
3) part를 한글자마다 분할하여 spl 문자열 배열을 생성합니다. (""로 공백이 아닌 한글자마다 분할)
-> 만약 ?x라면 spl의 length-1에 해당하는 요소가 x이므로,
그게 x라면 xcoef는 첫번째 요소부터 length-1에 해당하는 문자열을 빼내서, 정수로 형변환해줍니다.
(여기서 왜 substring으로 첫번째 요소부터 빼내는 식으로 했냐면 15x, 35x등 자릿수가 많은 경우를 해결하기 위함)
그리고 x가 아니라면, 즉 상수라면 cons에 그 값을 더해줍니다.
● for(int i=0;i<part.length;i++){
if(part[i].equals("+")){continue;}
if(part[i].equals("x")){xcoef++;continue;}
String[] spl = part[i].split("");
if(spl[spl.length - 1].equals("x")){
xcoef += Integer.parseInt(part[i].substring(0, spl.length - 1));
} else {
cons+=Integer.parseInt(part[i]);
}
}
5. cons와 xcoef는 현재 int 값이므로, 문자열로 형변환 해줍니다.
(String.valueOf 메소드를 이용)
● String strcons = String.valueOf(cons);
String strxcoef = String.valueOf(xcoef);
5. cons가 0일 경우
1) xcoef가 0일 때는 모두 0이므로, 0을 return 해줍니다.
2) xcoef 값이 1이라면 1x이므로, x를 return 해줍니다.
3) 그 외의 경우 ?x 이므로 xcoef + x 한 문자열을 return 해줍니다. (문자열은 +하면 합쳐짐)
그리고 이번에는 상수 cons가 있는 경우
1) 상수값만 있다면 상수값 strcons를 return 해줍니다.
2) x가 1이라면 x + strcons
3) ?x라면 ?x + strcons를 return해줍니다.
● if(cons==0){
if(xcoef==0){
answer = "0";
return answer;
}
else if(xcoef==1){
answer = "x";
return answer;
}
else{answer = xcoef+"x";
return answer;}
}
else{
if(xcoef==0){
answer = strcons;
return answer;
}
else if(xcoef==1){
answer = "x + "+strcons;
return answer;
}
answer = xcoef+"x + "+strcons;
return answer;
}
}
}
4) 코드
class Solution {
public String solution(String polynomial) {
String answer = "";
String[] part = polynomial.split(" ");
int cons = 0;
int xcoef =0;
for(int i=0;i<part.length;i++){
if(part[i].equals("+")){continue;}
if(part[i].equals("x")){xcoef++;continue;}
String[] spl = part[i].split("");
if(spl[spl.length - 1].equals("x")){
xcoef += Integer.parseInt(part[i].substring(0, spl.length - 1));
} else {
cons+=Integer.parseInt(part[i]);
}
}
String strcons = String.valueOf(cons);
String strxcoef = String.valueOf(xcoef);
if(cons==0){
if(xcoef==0){
answer = "0";
return answer;
}
else if(xcoef==1){
answer = "x";
return answer;
}
else{answer = xcoef+"x";
return answer;}
}
else{
if(xcoef==0){
answer = strcons;
return answer;
}
else if(xcoef==1){
answer = "x + "+strcons;
return answer;
}
answer = xcoef+"x + "+strcons;
return answer;
}
}
}
5) 느낀점
다항식에서 상수와 x계수를 구분해야하는데, split을 사용하면 되겠다고 생각했으나,
?x를 어떻게 처리해야할지 막막했습니다.
?x는 그럼 다시 나누면 되지 않을까?
하는 마음에 나눴는데, ?x만을 생각했지 ??x ???x 등 자릿수가 많아질때의 해결을 생각하지 않았습니다.
그래서 무조건 spl[0]이 ?일 것이고, spl[1]이 x일것으로 생각하여 해결해나갔는데 마무리즈음에
어라? 그럼 자릿수가 많아지면 어떡하지 하는 생각에
또 고민에 빠졌습니다.
오케이. 그럼 마지막에 있으면 되겠구나. 라는 생각에 length-1을 이용하자고 생각했습니다.
그런데... 또 막상 그 앞자리수들을 어떻게 숫자로 더해주지?
어떻게 그 앞숫자들만 빼내지?
하는 생각에 뺴내다 -> substring이 번쩍 떠올랐습니다.
진짜 오랜시간 고민하여 해결할 수 있었습니다.
(물론 너무 막혀서 몇몇 코드를 참조하긴 했지만.... :<)
'Programmers Coding Test > Java' 카테고리의 다른 글
[프로그래머스 120886] Java - 코딩테스트 입문 / A로 B 만들기 (0) | 2024.06.28 |
---|---|
[프로그래머스 120864] Java - 코딩테스트 입문 / 숨어있는 숫자의 덧셈(2) (0) | 2024.06.28 |
[프로그래머스 120860] Java - 코딩테스트 입문 / 직사각형 넓이 구하기 (0) | 2024.05.05 |
[프로그래머스 120861] Java - 코딩테스트 입문 / 캐릭터의 좌표 (0) | 2024.04.30 |
[프로그래머스 120913] Java - 코딩테스트 입문 / 잘라서 배열로 저장하기 (0) | 2024.04.30 |
소중한 공감 감사합니다