<문제 제시>
<문제설명>
my_string은 "3 + 5"처럼 문자열로 된 수식입니다.
문자열 my_string이 매개변수로 주어질 때,
수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.
<예시 입출력>
<문제 해결 과정>
문자열로된 수식이 주어지면 각 토큰별로 분석하여 실제 결과값을 출력하는 문제이다.
수식의 인자가 두 자리 수 일때는 토큰으로 인식하여 한자리수 연산밖에 하지 못하는 문제 발생할 수 있어
리스트나 배열로 바꾸어 처리해볼 수 있었다.
Try 1)
String my_string = "11 - 13";
int answer = 0;
my_string = my_string.replaceAll(" " , "");
String cc = "";
char c;
String[] temp = new String[2];
int k = 0;
for(int i = 0; i < my_string.length(); i++) {
c = my_string.charAt(i);
System.out.println("c = " + c);
if(c == '+' || c == '-') {
temp[k] = cc;
k++;
continue;
}
cc += my_string.charAt(i);
System.out.println("cc = " + cc);
}
System.out.println(Arrays.toString(temp));
연산자 앞 뒤의 숫자를 모두 분리해내고 싶었지만, 뒤의 숫자는 인식하지 못하는 문제가 있었음
split()함수를 사용해서 개선해보고자 하였다.
Try 2)
int answer = 0;
String[] temp = new String[2];
String op = "";
my_string = my_string.replaceAll(" " , "");
if(my_string.contains("+")) {
temp = my_string.split("\\+");
op = "plus";
}
else if(my_string.contains("-")) {
temp = my_string.split("\\-");
op = "minus";
}
int sum = 0;
if(op.equals("plus")){
sum = Integer.parseInt(temp[0]) + Integer.parseInt(temp[1]);
}
else if(op.equals("minus")){
sum = Integer.parseInt(temp[0]) +- Integer.parseInt(temp[1]);
}
answer = sum;
return answer;
런타임 에러 발생으로 오답이었다. 테스트케이스 8,9번은 통과하였지만, 런타임 에러 발생이었다.
my_string = my_string.replaceAll("+", "");
에서는 연산자(+)는 특별한 의미를 가지므로, "\\+" 로 써주어야 정상작동한다.
my_string = my_string.replaceAll("\\+", "");
Solution 1)
String[] temp = my_string.split(" ");
int answer = Integer.parseInt(temp[0]);
for(int i = 1; i < temp.length; i += 2) {
if(temp[i].equals("+")) {
System.out.println("temp[i] = " + temp[i]);
answer += Integer.parseInt(temp[i+1]);
System.out.println("answer = " + answer + ", temp[i+1] = " + temp[i+1]);
}
// - 가 입력되었을 경우
else {
System.out.println("temp[i] = " + temp[i]);
answer -= Integer.parseInt(temp[i+1]);
System.out.println("answer = " + answer + ", temp[i+1] = " + temp[i+1]);
}
}
return answer;
반복문에서 인덱스 증가값과 조건문 처리 부분을 수정하여 해결할 수 있었다.
answer에 첫번째 인자값은 미리 누적시키고 (temp[0])
for문에서는 i=1부터 반복하여, temp[i]부터 연산자를 판단하여 계산한다.
<전체코드>
public class calc_string {
public static int solution(String my_string) {
String[] temp = my_string.split(" ");
int answer = Integer.parseInt(temp[0]);
for(int i = 1; i < temp.length; i += 2) {
if(temp[i].equals("+")) {
System.out.println("temp[i] = " + temp[i]);
answer += Integer.parseInt(temp[i+1]);
System.out.println("answer = " + answer + ", temp[i+1] = " + temp[i+1]);
}
// - 가 입력되었을 경우
else {
System.out.println("temp[i] = " + temp[i]);
answer -= Integer.parseInt(temp[i+1]);
System.out.println("answer = " + answer + ", temp[i+1] = " + temp[i+1]);
}
}
return answer;
}
public static void main(String[] args) {
String my_string = "11 - 13";
System.out.println(solution(my_string));
}
}
문자열 상의 수식을 split()메서드와 equals() 메서드를 통해 토큰 별로 나누고 연산에 활용할 수 있었다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120902
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '제곱수 판별하기' - Java (1) | 2023.05.14 |
---|---|
[프로그래머스] '치킨 쿠폰' - Java (0) | 2023.05.13 |
[프로그래머스] '한 번만 등장한 문자' - Java (0) | 2023.05.12 |
[프로그래머스] '캐릭터의 좌표' - Java (0) | 2023.05.12 |
[프로그래머스] '가까운 수' - Java (0) | 2023.05.11 |