<문제 제시>
<문제설명>
한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다.
다항식을 계산할 때는 동류항끼리 계산해 정리합니다.
덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때,
동류항끼리 더한 결괏값을 문자열로 return 하도록 solution 함수를 완성해보세요.
같은 식이라면 가장 짧은 수식을 return 합니다.
<예시 입출력>
<문제 해결 과정>
다항식을 계산할때 수학에서처럼 x값을 쉽게 구할 수 없을 것 같았다.
계수들을 x와 구분하여 추출 후 동류항끼리 더해야했다.
Try 1)
String answer = "";
String pn = polynomial;
String x_data = "";
int x_result = 0;
String num = "A";
// // 다항식의 연산자 개수 파악하기
// int plus_cnt = 0;
// for(int i = 0; i < pn.length(); i++) {
// if(pn.charAt(i) == '+') plus_cnt++;
// }
pn = pn.replaceAll(" ", "");
String[] data = pn.split("\\+");
System.out.println(Arrays.toString(data));
for(int i = 0; i < data.length; i++) {
if(data[i].contains("x")) {
x_data = data[i].replaceAll("x", "1");
System.out.println("x_data = " + x_data);
if(x_data.length() == 1) {
x_result += 1;
continue;
}
x_result += (x_data.charAt(0) - 48) * (x_data.charAt(1) - 48);
System.out.println("x_result = " + x_result);
}
else {
num = data[i];
}
}
x_data = Integer.toString(x_result);
x_data += "x";
if(!num.equals("A")) {
x_data += " + ";
x_data += num;
}
answer = x_data;
return answer;
replaceAll()과 split()으로 수식을 토큰별로 분리해내고, 그 토큰이 x를 포함한다면 (contains())
조건처리를 해주었다.
하지만 테스트케이스에만 맞춰서 코딩하려하니, 대다수의 케이스에서 통과하지 못하였다.
Solution 1)
// 공백으로 나눠 p라는 문자열을 판단하는 반복문
for(String p : polynomial.split(" ")) {
// 문자열이 x를 포함하면,
if(p.contains("x")) {
System.out.println("x를 포함하는 문자열입니다 = '" + p + "'");
// 삼항 연산자로 판단, 문자열이 x 그 자체이면(true)일 경우 앞의 값 반환(1)
// x 그 자체가 아니면(false)일 경우 뒤의 값 반환(Integer.parseInt(p.substring(0, p.length() - 1));
// 문자열을 첫번째 원소부터 해당 문자열의 끝에서 두번째값까지 잘라 정수형으로 변환 후 저장
x += p.equals("x") ? 1 : Integer.parseInt(p.substring(0, p.length() - 1));
}
// 문자열이 '+'가 아니면 상수로 저장
else if(!p.equals("+")) {
System.out.println("+가 아닌 문자열입니다 = '" + p + "'");
num += Integer.parseInt(p);
}
}
1. 계수와 상수를 따로 저장하고,
2. 문자열을 공백으로 자르고
3. 문자열에 x를 contains로 파악하고 있으면 계수이므로 x전까지를 int형으로 바꿔 계수를 저장함
4. x가 없고 +가 아닌 조건이면 '상수'이므로 그 문자열을 int형으로 바꿔 상수로 저장
// 계수가 존재하면(x > 0), >> (x == 1 ? "x" : x + "x") 삼항연산자를 연산
// x의 계수가 1이면 x만 반환, x의 계쑤가 1이 아니면 계수 x에 "x"라는 문자열을 더해 반환
// 계수가 존재하지 않으면, >> ""; 를 반환
// >> 이중 삼항연산자
String x_str = x > 0 ? (x == 1 ? "x" : x + "x") : "";
// 상수가 존재하면 정수를 문자열로 변환 후 반환, 존재하지 않으면 ""; 반환
String num_str = num > 0 ? Integer.toString(num) : "";
삼항연산자를 활용하여 x의 계수가 1일때와 2이상일때, 존재하지 않을때를 처리해주었다.
<전체코드>
public class polynomial {
public static String solution(String polynomial) {
String answer = "";
// 계수와 상수를 선언
int x = 0;
int num = 0;
// 공백으로 나눠 p라는 문자열을 판단하는 반복문
for(String p : polynomial.split(" ")) {
// 문자열이 x를 포함하면,
if(p.contains("x")) {
System.out.println("x를 포함하는 문자열입니다 = '" + p + "'");
// 삼항 연산자로 판단, 문자열이 x 그 자체이면(true)일 경우 앞의 값 반환(1)
// x 그 자체가 아니면(false)일 경우 뒤의 값 반환(Integer.parseInt(p.substring(0, p.length() - 1));
// 문자열을 첫번째 원소부터 해당 문자열의 끝에서 두번째값까지 잘라 정수형으로 변환 후 저장
x += p.equals("x") ? 1 : Integer.parseInt(p.substring(0, p.length() - 1));
}
// 문자열이 '+'가 아니면 상수로 저장
else if(!p.equals("+")) {
System.out.println("+가 아닌 문자열입니다 = '" + p + "'");
num += Integer.parseInt(p);
}
}
// 계수가 존재하면(x > 0), >> (x == 1 ? "x" : x + "x") 삼항연산자를 연산
// x의 계수가 1이면 x만 반환, x의 계쑤가 1이 아니면 계수 x에 "x"라는 문자열을 더해 반환
// 계수가 존재하지 않으면, >> ""; 를 반환
// >> 이중 삼항연산자
String x_str = x > 0 ? (x == 1 ? "x" : x + "x") : "";
// 상수가 존재하면 정수를 문자열로 변환 후 반환, 존재하지 않으면 ""; 반환
String num_str = num > 0 ? Integer.toString(num) : "";
if(x > 0) {
// 계수와 상수가 모두 존재할 경우의 결과값 반환
if(num > 0) {
answer += x_str + " + " + num_str;
}
// 계수만 존재할 경우
else {
answer += x_str;
}
}
// 계수가 존재하지 않고 상수만 존재할 경우
else if(num > 0) {
answer += num_str;
}
return answer;
}
public static void main(String[] args) {
String polynomial = "3x + 7 + x";
// String polynomial = "x + x + x";
System.out.println(solution(polynomial));
}
}
이중 삼항연산자나, 다항식을 코드단에서 풀어보는 과정 등이 매우 어려웠지만, 적절한 메서드를 활용하여 답을 구해낼 수 있었다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120863
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '안전지대' - Java (0) | 2023.05.16 |
---|---|
[프로그래머스] '숨어있는 숫자의 덧셈 (2)' - Java (0) | 2023.05.16 |
[프로그래머스] '최댓값 만들기 (2)' - Java (0) | 2023.05.15 |
[프로그래머스] '직사각형 넓이 구하기' - Java (0) | 2023.05.14 |
[프로그래머스] '제곱수 판별하기' - Java (1) | 2023.05.14 |