프로그래머스 사칙연산 구현 문제 시험을 풀다가 시간이 지나버려서 내가 줄줄이 쓴 코드를 완성하지 못하고 날라가버렸기 때문에...
짜증나서 다시 구현할 겸 (내가 풀 수 있는 문제인지 테스트 겸) 코드를 작성하겠습니다.
사칙연산 구현하기 ( 연산 순서대로 곱하기와 나누기를 먼저 계산하고 그 다음 더하기와 빼기를 합니다 ). 문자열 형태의 연산을 받으면 그것을 계산한 답을 문자열 형태로 리턴합니다. 단 소숫점 둘째자리까지만 표현합니다.(반올림, 올림, 내림 중 '내림' 사용하기)
public class Solution { // 사칙연산 구현하기
public static void main(String[] args) {
String s = "2*3+5/6*3+15";
s = divideOrMultiply(s);
s = plusOrMinus(s);
System.out.println("계산된 수식은..: " + s);
}
public static String divideOrMultiply(String string){
String s = string;
String left = "";
String right = "";
int cur = -1;
int leftCur = -1;
int rightCur = -1;
char DM = 'a';
while (true) {
// dm(divide or multiply) 기호위치 찾기
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '*' || s.charAt(i) == '/') {
cur = i;
DM = s.charAt(i);
break;
}
}
// 반복문 탈출조건 -> 찾아야하는 기호가 없을때 : cur == -1;
if (cur == -1) {
break;
}
// left 찾기
for (int i = cur - 1; i >= 0; i--) {
if (Character.isDigit(s.charAt(i)) || s.charAt(i) == '.') {
left = s.charAt(i) + left;
} else {
leftCur = i;
break;
}
}
// right 찾기
for (int i = cur + 1; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i)) || s.charAt(i) == '.') {
right = right + s.charAt(i);
} else {
rightCur = i;
break;
}
}
// 계산 하기
String replaceAfter = "";
if (DM == '*') {
replaceAfter = String.format("%.2f", Double.parseDouble(left) * Double.parseDouble(right));
} else if (DM == '/') {
replaceAfter = String.format("%.2f", Double.parseDouble(left) / Double.parseDouble(right));
}
// string 에 replace하고 cur, Dm, left, right 초기화 하기
s = s.substring(0, leftCur + 1) + replaceAfter + s.substring(rightCur);
cur = -1;
DM = 'a';
left = "";
right = "";
leftCur = -1;
rightCur = -1;
}
return s;
}
public static String plusOrMinus(String string) {
String s = string;
String left = "";
String right = "";
int cur = -1;
int leftCur = -1;
int rightCur = -1;
char PM = 'a';
while (true) {
// pm(plus or minus) 기호위치 찾기
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '+' || s.charAt(i) == '-') {
cur = i;
PM = s.charAt(i);
break;
}
}
// 반복문 탈출조건 -> 찾아야하는 기호가 없을때 : cur == -1;
if (cur == -1) {
break;
}
// left 찾기
for (int i = cur - 1; i >= 0; i--) {
if (Character.isDigit(s.charAt(i)) || s.charAt(i) == '.') {
left = s.charAt(i) + left;
} else {
leftCur = i;
break;
}
}
// right 찾기
for (int i = cur + 1; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i)) || s.charAt(i) == '.') {
right = right + s.charAt(i);
} else {
rightCur = i;
break;
}
}
if (rightCur == - 1) { // 마지막 계산에서 rightCur 이 -1 이 되는 문제해결
rightCur = s.length() - 1;
}
// 계산 하기
String replaceAfter = "";
if (PM == '+') {
replaceAfter = String.format("%.2f", Double.parseDouble(left) + Double.parseDouble(right));
} else if (PM == '-') {
replaceAfter = String.format("%.2f", Double.parseDouble(left) - Double.parseDouble(right));
}
// string 에 replace하고 cur, Dm, left, right 초기화 하기
s = s.substring(0, leftCur + 1) + replaceAfter + s.substring(rightCur);
cur = -1;
PM = 'a';
left = "";
right = "";
leftCur = -1;
rightCur = -1;
}
return s;
}
}